Supabase was integrated to store articles, article editor is standardized editor using react component

This commit is contained in:
StormRunner06106
2026-09-12 01:39:07 -07:00
parent 14d1dbbb07
commit 3ed741d6d2
18 changed files with 1031 additions and 131 deletions
+134
View File
@@ -0,0 +1,134 @@
#!/usr/bin/env bash
set -Eeuo pipefail
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
project_dir="$(cd -- "${script_dir}/.." && pwd)"
env_file="${SUPABASE_ENV_FILE:-${project_dir}/backend/.env}"
schema_file="${project_dir}/backend/supabase/schema.sql"
seed_articles=true
if [[ "${1:-}" == "--schema-only" ]]; then
seed_articles=false
elif [[ -n "${1:-}" ]]; then
echo "Usage: bash scripts/setup_supabase.sh [--schema-only]" >&2
exit 2
fi
load_supabase_env() {
local key value
[[ -f "${env_file}" ]] || return 0
while IFS='=' read -r key value; do
key="${key%$'\r'}"
value="${value:-}"
value="${value%$'\r'}"
case "${key}" in
SUPABASE_PROJECT_REF|SUPABASE_ACCESS_TOKEN|SUPABASE_URL|SUPABASE_SECRET_KEY|SUPABASE_SERVICE_ROLE_KEY|SUPABASE_ARTICLES_TABLE)
if [[ "${value}" == \"*\" && "${value}" == *\" ]]; then
value="${value:1:${#value}-2}"
elif [[ "${value}" == \'*\' && "${value}" == *\' ]]; then
value="${value:1:${#value}-2}"
fi
export "${key}=${value}"
;;
esac
done < "${env_file}"
}
require_value() {
local variable_name="$1"
if [[ -z "${!variable_name:-}" ]]; then
echo "Missing ${variable_name}. Add it to ${env_file}." >&2
exit 1
fi
}
find_python() {
if [[ -x "${project_dir}/.venv/Scripts/python.exe" ]]; then
printf '%s' "${project_dir}/.venv/Scripts/python.exe"
elif [[ -x "${project_dir}/.venv/bin/python" ]]; then
printf '%s' "${project_dir}/.venv/bin/python"
elif command -v python3 >/dev/null 2>&1; then
command -v python3
elif command -v python >/dev/null 2>&1; then
command -v python
else
echo "Python is required to prepare the API request and seed articles." >&2
exit 1
fi
}
load_supabase_env
require_value SUPABASE_PROJECT_REF
require_value SUPABASE_ACCESS_TOKEN
if [[ ! -f "${schema_file}" ]]; then
echo "Schema file not found: ${schema_file}" >&2
exit 1
fi
if ! command -v curl >/dev/null 2>&1; then
echo "curl is required to call the Supabase Management API." >&2
exit 1
fi
python_bin="$(find_python)"
payload_file="$(mktemp)"
response_file="$(mktemp)"
cleanup() {
rm -f -- "${payload_file}" "${response_file}"
}
trap cleanup EXIT
"${python_bin}" - "${schema_file}" "${payload_file}" <<'PY'
import json
import sys
from pathlib import Path
schema_path = Path(sys.argv[1])
payload_path = Path(sys.argv[2])
payload_path.write_text(
json.dumps({"query": schema_path.read_text(encoding="utf-8"), "read_only": False}),
encoding="utf-8",
)
PY
echo "Applying the articles schema to Supabase project ${SUPABASE_PROJECT_REF}..."
http_status="$(
curl \
--silent \
--show-error \
--output "${response_file}" \
--write-out '%{http_code}' \
--request POST \
"https://api.supabase.com/v1/projects/${SUPABASE_PROJECT_REF}/database/query" \
--header "Authorization: Bearer ${SUPABASE_ACCESS_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary "@${payload_file}"
)"
if [[ ! "${http_status}" =~ ^2 ]]; then
echo "Supabase rejected the schema request with HTTP ${http_status}." >&2
sed -n '1,120p' "${response_file}" >&2
exit 1
fi
echo "Supabase articles table is ready."
if [[ "${seed_articles}" == true ]]; then
require_value SUPABASE_URL
if [[ -z "${SUPABASE_SECRET_KEY:-}" && -z "${SUPABASE_SERVICE_ROLE_KEY:-}" ]]; then
echo "Missing SUPABASE_SECRET_KEY. Add the server secret to ${env_file} to seed articles." >&2
exit 1
fi
echo "Importing the starter journal articles..."
cd -- "${project_dir}"
"${python_bin}" -m backend.seed_supabase
fi
echo "Supabase setup is complete. Restart FastAPI to use the remote article store."