JavaScript 56.7%
TypeScript 42.6%
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