blog-backup/scripts/blog.sh

297 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
# Blog Backup CLI - Main Entry Point
# Usage: ./blog.sh <command> [args]
#
# Commands:
# post Create a new digest post
# list List digests
# get Get a specific digest by ID
# delete Delete a digest
# search Search digests by content
# status Check if digest exists for a date
# health Check API health
#
# Environment:
# BLOG_API_URL Blog Backup API URL (default: https://blog-backup-two.vercel.app/api)
# BLOG_MACHINE_TOKEN Machine token for API auth (required)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Set default API URL
export BLOG_API_URL="${BLOG_API_URL:-https://blog-backup-two.vercel.app/api}"
# Check for machine token
if [[ -z "${BLOG_MACHINE_TOKEN:-}" ]]; then
# Try to load from .env.local
if [[ -f "$PROJECT_ROOT/.env.local" ]]; then
source "$PROJECT_ROOT/.env.local"
fi
# Check if CRON_API_KEY is available
if [[ -n "${CRON_API_KEY:-}" ]]; then
export BLOG_MACHINE_TOKEN="$CRON_API_KEY"
fi
fi
# Source the skill library
source "${HOME}/.agents/skills/blog-backup/lib/blog.sh"
# Show usage
usage() {
cat << 'EOF'
Blog Backup CLI
Usage: ./blog.sh <command> [args]
Commands:
post [args] Create a new digest post
--date YYYY-MM-DD Date for the digest (required)
--content "..." Content in markdown (required)
--tags '["tag1","tag2"]' Tags as JSON array (default: ["daily-digest"])
list [args] List digests
--limit N Max results (default: 20)
--since YYYY-MM-DD Filter by date
--json Output as JSON
get <id> Get a specific digest by ID
delete <id> Delete a digest by ID
search <query> Search digests by content
--limit N Max results (default: 20)
status <date> Check if digest exists for a date (YYYY-MM-DD)
health Check API health
Examples:
./blog.sh post --date 2026-02-26 --content "# Daily Digest" --tags '["AI", "iOS"]'
./blog.sh list --limit 10
./blog.sh get 1234567890
./blog.sh search "OpenClaw"
./blog.sh status 2026-02-26
Environment Variables:
BLOG_API_URL Blog Backup API URL
BLOG_MACHINE_TOKEN Machine token for API auth
EOF
}
# Post command
handle_post() {
local DATE=""
local CONTENT=""
local TAGS='["daily-digest"]'
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--date)
DATE="$2"
shift 2
;;
--content)
CONTENT="$2"
shift 2
;;
--tags)
TAGS="$2"
shift 2
;;
*)
echo "Unknown option: $1" >&2
shift
;;
esac
done
# Validate required fields
if [[ -z "$DATE" ]]; then
echo "Usage: ./blog.sh post --date <YYYY-MM-DD> --content <content> [--tags <tags>]" >&2
exit 1
fi
if [[ -z "$CONTENT" ]]; then
echo "Error: --content is required" >&2
exit 1
fi
# Create the digest
local DIGEST_ID
DIGEST_ID=$(blog_post_create --date "$DATE" --content "$CONTENT" --tags "$TAGS")
if [[ $? -eq 0 ]]; then
echo "✅ Digest created: $DIGEST_ID"
echo "URL: https://blog-backup-two.vercel.app"
else
echo "❌ Failed to create digest" >&2
exit 1
fi
}
# List command
handle_list() {
local LIMIT=20
local SINCE=""
local JSON_OUTPUT=false
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--limit)
LIMIT="$2"
shift 2
;;
--since)
SINCE="$2"
shift 2
;;
--json)
JSON_OUTPUT=true
shift
;;
*)
shift
;;
esac
done
if [[ "$JSON_OUTPUT" == "true" ]]; then
blog_post_list --limit "$LIMIT" ${SINCE:+--since "$SINCE"} --json | jq .
else
echo "=== Recent Digests ==="
blog_post_list --limit "$LIMIT" ${SINCE:+--since "$SINCE"}
fi
}
# Get command
handle_get() {
local ID="${1:-}"
if [[ -z "$ID" ]]; then
echo "Usage: ./blog.sh get <id>" >&2
exit 1
fi
local RESULT
RESULT=$(blog_post_get "$ID")
if [[ -n "$RESULT" ]]; then
echo "$RESULT" | jq .
else
echo "❌ Digest not found: $ID" >&2
exit 1
fi
}
# Delete command
handle_delete() {
local ID="${1:-}"
if [[ -z "$ID" ]]; then
echo "Usage: ./blog.sh delete <id>" >&2
exit 1
fi
blog_post_delete "$ID"
}
# Search command
handle_search() {
local QUERY="${1:-}"
local LIMIT=20
if [[ -z "$QUERY" ]]; then
echo "Usage: ./blog.sh search <query> [--limit N]" >&2
exit 1
fi
# Check for --limit flag
if [[ "$2" == "--limit" && -n "${3:-}" ]]; then
LIMIT="$3"
fi
echo "=== Search Results for '$QUERY' ==="
blog_post_search "$QUERY" --limit "$LIMIT" | jq -r '.[] | "\(.id) | \(.date) | \(.content | .[0:50])..."'
}
# Status command
handle_status() {
local DATE="${1:-}"
if [[ -z "$DATE" ]]; then
echo "Usage: ./blog.sh status <YYYY-MM-DD>" >&2
exit 1
fi
if blog_post_status "$DATE"; then
echo "✅ Digest exists for $DATE"
else
echo "❌ No digest found for $DATE"
fi
}
# Health command
handle_health() {
echo "=== API Health Check ==="
local RESULT
RESULT=$(blog_health)
if [[ -n "$RESULT" ]]; then
echo "✅ API is accessible"
echo "$RESULT" | jq . 2>/dev/null || echo "$RESULT"
else
echo "❌ API is not responding" >&2
exit 1
fi
}
# Main command dispatcher
main() {
local cmd="${1:-}"
shift || true
case "$cmd" in
post)
handle_post "$@"
;;
list)
handle_list "$@"
;;
get)
handle_get "$@"
;;
delete)
handle_delete "$@"
;;
search)
handle_search "$@"
;;
status)
handle_status "$@"
;;
health)
handle_health
;;
help|--help|-h)
usage
;;
*)
if [[ -z "$cmd" ]]; then
usage
exit 1
fi
echo "Unknown command: $cmd" >&2
usage
exit 1
;;
esac
}
main "$@"