SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
1 h agolast push
JavaScript 56.7% TypeScript 42.6%
5.5 KB · 206 lines shellscript
Raw Blame History
1#!/usr/bin/env bash2# spb — SPB Private Cloud CLI3# Usage: spb <command> [options]4#5# Install: copy this file to ~/bin/spb and run: chmod +x ~/bin/spb6# Config:  spb config  (set server URL and API key)78set -e910CONFIG_DIR="$HOME/.spb"11CONFIG_FILE="$CONFIG_DIR/config"12DEFAULT_URL="https://cloud.spboucher.ai"1314# ─── Load config ───────────────────────────────────────────────────────────────15load_config() {16  if [ -f "$CONFIG_FILE" ]; then17    source "$CONFIG_FILE"18  fi19}2021save_config() {22  mkdir -p "$CONFIG_DIR"23  chmod 700 "$CONFIG_DIR"24  cat > "$CONFIG_FILE" <<EOF25SPB_URL="$SPB_URL"26SPB_KEY="$SPB_KEY"27EOF28  chmod 600 "$CONFIG_FILE"29}3031require_config() {32  load_config33  if [ -z "$SPB_URL" ] || [ -z "$SPB_KEY" ]; then34    echo "❌  Not configured. Run: spb config"35    exit 136  fi37}3839# ─── Commands ─────────────────────────────────────────────────────────────────4041cmd_config() {42  load_config43  [ -z "$SPB_URL" ] && SPB_URL="$DEFAULT_URL"44  echo ""45  read -p "  Server URL [${SPB_URL}]: " input_url46  [ -n "$input_url" ] && SPB_URL="$input_url"47  read -p "  API Key [${SPB_KEY:0:12}...]: " input_key48  [ -n "$input_key" ] && SPB_KEY="$input_key"49  save_config50  echo "  ✅  Config saved in $CONFIG_FILE"51  echo ""52}5354cmd_upload() {55  require_config56  local file="$1"57  local folder_id="$2"5859  if [ -z "$file" ]; then60    echo "Usage: spb upload <file> [folder_id]"61    exit 162  fi6364  if [ ! -f "$file" ]; then65    echo "❌  File not found: $file"66    exit 167  fi6869  local filename70  filename=$(basename "$file")71  echo "  ⬆️  Uploading: $filename"7273  local args=(-s -X POST -H "Authorization: Bearer $SPB_KEY" -F "file=@$file")74  [ -n "$folder_id" ] && args+=(-F "folderId=$folder_id")7576  local response77  response=$(curl "${args[@]}" "$SPB_URL/api/v1/files")7879  local name80  name=$(echo "$response" | grep -o '"name":"[^"]*"' | head -1 | cut -d'"' -f4)8182  if [ -n "$name" ]; then83    echo "  ✅  Uploaded: $name"84  else85    echo "  ❌  Upload failed:"86    echo "  $response"87    exit 188  fi89}9091cmd_upload_dir() {92  require_config93  local dir="$1"94  local folder_id="$2"9596  if [ -z "$dir" ] || [ ! -d "$dir" ]; then97    echo "Usage: spb upload-dir <directory> [folder_id]"98    exit 199  fi100101  # Auto-create a folder with the directory name if no folder_id provided102  if [ -z "$folder_id" ]; then103    local dir_name104    dir_name=$(basename "$dir")105    echo "  📁  Creating folder: $dir_name"106    local response107    response=$(curl -s -X POST \108      -H "Authorization: Bearer $SPB_KEY" \109      -H "Content-Type: application/json" \110      -d "{\"name\":\"$dir_name\"}" \111      "$SPB_URL/api/v1/folders")112    folder_id=$(echo "$response" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)113    if [ -z "$folder_id" ]; then114      echo "  ❌  Failed to create folder: $response"115      exit 1116    fi117    echo "  ✅  Folder created (id: $folder_id)"118  fi119120  local count=0121  while IFS= read -r -d '' file; do122    cmd_upload "$file" "$folder_id"123    count=$((count + 1))124  done < <(find "$dir" -maxdepth 1 -type f -print0)125126  echo ""127  echo "  ✅  Done: $count file(s) uploaded into folder"128}129130cmd_ls() {131  require_config132  local folder_id="${1:-}"133  local url="$SPB_URL/api/v1/files"134  [ -n "$folder_id" ] && url="$url?folderId=$folder_id"135136  local response137  response=$(curl -s -H "Authorization: Bearer $SPB_KEY" "$url")138139  echo ""140  echo "  📁  Files:"141  echo "$response" | grep -o '"name":"[^"]*"' | cut -d'"' -f4 | while read -r name; do142    echo "    • $name"143  done144  echo ""145}146147cmd_folders() {148  require_config149  local response150  response=$(curl -s -H "Authorization: Bearer $SPB_KEY" "$SPB_URL/api/v1/folders")151152  echo ""153  echo "  📂  Folders:"154  # Parse id and name pairs155  echo "$response" | python3 -c "156import sys, json157data = json.load(sys.stdin)158for f in data.get('folders', []):159    parent = f' (parent: {f[\"parentId\"]})' if f.get('parentId') else ''160    print(f'    {f[\"id\"]}  →  {f[\"name\"]}{parent}')161" 2>/dev/null || echo "$response" | grep -o '"name":"[^"]*"' | cut -d'"' -f4 | while read -r name; do162    echo "    • $name"163  done164  echo ""165}166167cmd_help() {168  cat <<'HELP'169170  spb — SPB Private Cloud CLI171172  Commands:173    spb config                       Configure server URL and API key174    spb upload <file> [folder_id]    Upload a file175    spb upload-dir <dir> [folder_id] Upload all files in a directory176    spb ls [folder_id]               List files (optionally in a folder)177    spb folders                      List all folders with their IDs178    spb help                         Show this help179180  Examples:181    spb config                        # URL par défaut: https://cloud.spboucher.ai182    spb upload rapport.pdf183    spb upload photo.jpg abc123def184    spb upload-dir ~/Documents/reports185    spb ls186    spb folders187188HELP189}190191# ─── Main ─────────────────────────────────────────────────────────────────────192193case "${1:-help}" in194  config)       cmd_config ;;195  upload)       cmd_upload "$2" "$3" ;;196  upload-dir)   cmd_upload_dir "$2" "$3" ;;197  ls)           cmd_ls "$2" ;;198  folders)      cmd_folders ;;199  help|--help)  cmd_help ;;200  *)201    echo "Unknown command: $1"202    cmd_help203    exit 1204    ;;205esac206