update nice visuel
This commit is contained in:
@@ -5,30 +5,38 @@
|
||||
# Usage:
|
||||
# ./scripts/local-db-import.sh ./backups/casegambling-YYYYMMDD-HHMMSS
|
||||
# ./scripts/local-db-import.sh ./backups/casegambling-YYYYMMDD-HHMMSS.tar.gz
|
||||
# ./scripts/local-db-import.sh ./backups/….tar.gz <username> # player-only merge
|
||||
#
|
||||
# Typical flow (prod → laptop):
|
||||
# # on prod:
|
||||
# ./scripts/docker-db-export.sh
|
||||
# # copy the .tar.gz here, then:
|
||||
# ./scripts/local-db-import.sh ./backups/casegambling-….tar.gz
|
||||
# # or only one player into the existing local DB:
|
||||
# ./scripts/local-db-import.sh ./backups/casegambling-….tar.gz SomePlayer
|
||||
#
|
||||
# Stop `npm run dev` before importing so SQLite is not locked.
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
MERGE_PLAYER_SCRIPT="$ROOT/scripts/merge-player-db.sh"
|
||||
|
||||
if [[ -z "${1:-}" ]]; then
|
||||
echo "Usage: $0 <backup-dir-or-tar.gz>" >&2
|
||||
if [[ -z "${1:-}" || "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||
echo "Usage: $0 <backup-dir-or-tar.gz> [username]" >&2
|
||||
echo "Example: $0 ./backups/casegambling-20260116-203000.tar.gz" >&2
|
||||
echo " $0 ./backups/casegambling-20260116-203000.tar.gz SomePlayer" >&2
|
||||
echo "Create a backup from Docker: ./scripts/docker-db-export.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BACKUP_ARG="$1"
|
||||
USERNAME="${2:-}"
|
||||
|
||||
# Resolve backup path from the caller's cwd
|
||||
if [[ "$1" = /* ]]; then
|
||||
SRC="$1"
|
||||
if [[ "$BACKUP_ARG" = /* ]]; then
|
||||
SRC="$BACKUP_ARG"
|
||||
else
|
||||
SRC="$(pwd)/$1"
|
||||
SRC="$(pwd)/$BACKUP_ARG"
|
||||
fi
|
||||
|
||||
LOCAL_DB="${LOCAL_DB:-$ROOT/server/prisma/dev.db}"
|
||||
@@ -49,6 +57,25 @@ is_archive() {
|
||||
esac
|
||||
}
|
||||
|
||||
copy_player_avatar() {
|
||||
local avatar_url="$1"
|
||||
local uploads_src="$2"
|
||||
local uploads_dst="$3"
|
||||
[[ -z "$avatar_url" || ! -d "$uploads_src" ]] && return 0
|
||||
local rel="${avatar_url#/}"
|
||||
rel="${rel#uploads/}"
|
||||
rel="${rel#./}"
|
||||
case "$rel" in
|
||||
''|http:*|https:*|*..*) return 0 ;;
|
||||
esac
|
||||
local src_file="$uploads_src/$rel"
|
||||
if [[ -f "$src_file" ]]; then
|
||||
mkdir -p "$uploads_dst/$(dirname "$rel")"
|
||||
cp -f "$src_file" "$uploads_dst/$rel"
|
||||
echo "==> Copied avatar upload: $rel"
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ -f "$SRC" ]] && is_archive "$SRC"; then
|
||||
echo "==> Extracting $(basename "$SRC")"
|
||||
TMP="$(mktemp -d)"
|
||||
@@ -84,6 +111,35 @@ if [[ -z "$DB" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ── Player-only merge into existing local DB ─────────────────────────────────
|
||||
if [[ -n "$USERNAME" ]]; then
|
||||
if [[ ! -f "$LOCAL_DB" ]]; then
|
||||
echo "Error: local DB not found: $LOCAL_DB" >&2
|
||||
echo "Tip: run a full import first (without username), or start the app once." >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! -x "$MERGE_PLAYER_SCRIPT" ]]; then
|
||||
echo "Error: merge helper missing or not executable: $MERGE_PLAYER_SCRIPT" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Drop WAL/SHM so we merge against the real file contents
|
||||
rm -f "${LOCAL_DB}-wal" "${LOCAL_DB}-shm"
|
||||
|
||||
"$MERGE_PLAYER_SCRIPT" "$DB" "$LOCAL_DB" "$USERNAME"
|
||||
AVATAR_URL="$(sqlite3 "$DB" "SELECT avatarUrl FROM User WHERE username = '${USERNAME//\'/\'\'}' LIMIT 1;" 2>/dev/null || true)"
|
||||
if [[ -d "$SRC/uploads" ]]; then
|
||||
copy_player_avatar "${AVATAR_URL:-}" "$SRC/uploads" "$LOCAL_UPLOADS"
|
||||
fi
|
||||
|
||||
echo "==> Done (player-only)."
|
||||
echo " db: $LOCAL_DB"
|
||||
echo " Tip: stop npm run dev before import if the DB was locked; then restart:"
|
||||
echo " npm run dev"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# ── Full import (replace local DB + uploads) ─────────────────────────────────
|
||||
mkdir -p "$(dirname "$LOCAL_DB")"
|
||||
|
||||
echo "==> Importing database → $LOCAL_DB"
|
||||
|
||||
Reference in New Issue
Block a user