#!/usr/bin/env bash set -euo pipefail # # switch-event.sh — point the scanner app at a DIFFERENT NocoDB tickets (and # optionally audit) table, e.g. to start a NEW event on a fresh table while # keeping the old table intact for archive. Backs up backend/.env, updates it, # and restarts the app container. The old table is never touched. # # Usage: # scripts/switch-event.sh [AUDIT_TABLE_ID] # # FIRST create the new table(s): in the NocoDB UI, DUPLICATE the current table # with "structure only" (no records). That preserves every column AND the Id # primary key — critical, because updates against a table with no primary key # would hit every row. Then grab the new table id from its URL/API and pass it # here. (The app also fail-safes: it refuses to update a row that has no Id.) # SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" ENV_FILE="$ROOT/backend/.env" CONTAINER="${CONTAINER:-camptickets}" NEW_TICKETS="${1:-}" NEW_AUDIT="${2:-}" [ -n "$NEW_TICKETS" ] || { echo "Usage: $0 [AUDIT_TABLE_ID]" >&2; exit 1; } get() { grep -E "^$1=" "$ENV_FILE" | head -1 | cut -d= -f2-; } BASE_URL="$(get NOCODB_BASE_URL)" TOKEN="$(get NOCODB_API_TOKEN)" CUR_TICKETS="$(get NOCODB_TABLE_ID)" CUR_AUDIT="$(get NOCODB_AUDIT_TABLE_ID)" # Validate a table is reachable and (if it has rows) exposes an Id primary key. check() { local table="$1" tmp http tmp="$(mktemp)" http="$(curl -s -o "$tmp" -w '%{http_code}' -H "xc-token: $TOKEN" \ "$BASE_URL/api/v2/tables/$table/records?limit=1")" if [ "$http" != "200" ]; then echo " ✗ $table not reachable (HTTP $http)"; rm -f "$tmp"; return 1 fi if ! python3 -c 'import sys,json; l=json.load(open(sys.argv[1]))["list"]; sys.exit(0 if (not l or "Id" in l[0]) else 1)' "$tmp"; then echo " ✗ $table has rows without an Id primary key — refusing"; rm -f "$tmp"; return 1 fi rm -f "$tmp"; echo " ✓ $table reachable" } echo "Validating new table(s) on $BASE_URL ..." check "$NEW_TICKETS" || exit 1 [ -n "$NEW_AUDIT" ] && { check "$NEW_AUDIT" || exit 1; } BK="$ENV_FILE.bak.$(date +%Y%m%d-%H%M%S)" cp "$ENV_FILE" "$BK" echo "Backed up env -> $BK" echo "Switching tables:" echo " tickets: $CUR_TICKETS -> $NEW_TICKETS" sed -i -E "s|^NOCODB_TABLE_ID=.*|NOCODB_TABLE_ID=$NEW_TICKETS|" "$ENV_FILE" if [ -n "$NEW_AUDIT" ]; then echo " audit: $CUR_AUDIT -> $NEW_AUDIT" sed -i -E "s|^NOCODB_AUDIT_TABLE_ID=.*|NOCODB_AUDIT_TABLE_ID=$NEW_AUDIT|" "$ENV_FILE" else echo " audit: unchanged ($CUR_AUDIT) — pass a second arg to switch it too" fi echo "Restarting $CONTAINER ..." ( cd "$ROOT" && docker compose up -d --force-recreate >/dev/null ) sleep 3 echo "Now active:" echo " NOCODB_TABLE_ID=$(get NOCODB_TABLE_ID)" echo " NOCODB_AUDIT_TABLE_ID=$(get NOCODB_AUDIT_TABLE_ID)" echo "Old tickets table $CUR_TICKETS kept intact. (env backup: $BK)"