docsys/migrate-ids.sh

106 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# Migrate hash-based document IDs to date-slug format
# Usage: ./migrate-ids.sh [--dry-run]
set -euo pipefail
DOCSYS_DIR="/srv/docsys"
DB="$DOCSYS_DIR/index/docsys.db"
STORE="$DOCSYS_DIR/store"
RECORDS="$DOCSYS_DIR/records"
DRY_RUN="${1:-}"
migrate() {
local old_id="$1" new_id="$2"
echo " $old_id$new_id"
if [ "$DRY_RUN" = "--dry-run" ]; then return; fi
# Rename store files
for ext in .pdf .txt .png .md ""; do
if [ -f "$STORE/$old_id$ext" ]; then
mv "$STORE/$old_id$ext" "$STORE/$new_id$ext"
echo " store: $old_id$ext$new_id$ext"
fi
done
# Update record file if it exists
local rec=$(sqlite3 "$DB" "SELECT record_path FROM documents WHERE id='$old_id';")
if [ -n "$rec" ] && [ -f "$rec" ]; then
local dir=$(dirname "$rec")
local newrec="$dir/$new_id.md"
mv "$rec" "$newrec"
sqlite3 "$DB" "UPDATE documents SET record_path='$newrec' WHERE id='$old_id';"
echo " record: $(basename $rec)$new_id.md"
fi
# Update DB: documents, embeddings, shares, FTS
sqlite3 "$DB" "UPDATE documents SET id='$new_id', pdf_path=REPLACE(COALESCE(pdf_path,''),'$old_id','$new_id') WHERE id='$old_id';"
sqlite3 "$DB" "UPDATE embeddings SET doc_id='$new_id' WHERE doc_id='$old_id';"
sqlite3 "$DB" "UPDATE shares SET doc_id='$new_id' WHERE doc_id='$old_id';"
# FTS will be rebuilt on restart
}
echo "=== DocSys ID Migration ==="
[ "$DRY_RUN" = "--dry-run" ] && echo "(DRY RUN - no changes)"
echo
# Stop service
if [ "$DRY_RUN" != "--dry-run" ]; then
echo "Stopping docsys..."
systemctl --user stop docsys 2>/dev/null || true
# Backup DB
cp "$DB" "$DB.bak-$(date +%Y%m%d%H%M%S)"
echo "DB backed up"
echo
fi
# Define migrations (old_id new_id)
declare -A RENAMES=(
["e37d1295e9505e4a"]="2026-01-07-st-petersburg-utility-bill-jan-2026"
["dae28e167002431c"]="2026-02-04-st-petersburg-utility-bill-feb-2026"
["9cb67ca54c94a00e"]="2026-02-09-hostkey-hosting-invoice"
["b1ba43f7d4b9838f"]="undated-diana-geegan-business-card"
["a52c68f7df88a965"]="2026-01-08-fedex-shipping-receipt"
["05282dcf1da896a1"]="2026-01-09-parkshore-grill-receipt"
["d9cdc7038fb9486d"]="2026-01-15-american-airlines-receipt"
["a62399f94087ed04"]="2025-07-01-social-security-retirement-publication"
["e569c01b4676add9"]="2025-12-10-valley-bank-heloc-renewal-notice"
["2e2ff8472d8afff5"]="2025-12-31-optum-hsa-statement-q4-2025"
["f8871fd13b609bbd"]="2025-12-31-voya-retirement-statement-2025"
["2b4444a5a92bec9e"]="2025-12-31-alliant-savings-statement"
["79ba22cec092fbd8"]="2025-12-31-voya-retirement-account-2025"
["2bf818fe2975e1ae"]="2026-01-21-achmea-pension-statement-jan-2026"
["da65059758f7be28"]="2025-11-13-miele-microwave-service"
["249e08e266ec2216"]="2026-02-03-sellers-net-sheet"
["0706a83eef188e5a"]="2025-03-01-nfip-claims-history-report"
["5cc409ac61a1af04"]="2025-11-24-umbrella-insurance-invoice"
["44d71c266fb381a6"]="2025-11-26-flood-insurance-renewal-notice"
["e67d1787863aa29b"]="2025-12-07-selective-flood-renewal-bill"
["d8878b9a5b957569"]="2026-01-06-flood-insurance-renewal-notice"
["78ab51124773bda5"]="2026-01-21-wright-flood-policy-renewal-2026"
["eb4fe6c8236c0e6c"]="2026-01-22-flood-insurance-requirement-notice"
["a201962321fd109e"]="2025-03-20-nvc-visa-availability-notice"
["be8d89694c05c7da"]="2026-02-09-llc-formation-receipt"
["77181a9186c0dc47"]="2025-11-25-baycare-medical-bill-nov-2025"
["80d668195458c32e"]="2025-12-25-baycare-medical-bill-a"
["4e70650454bb45bb"]="2025-12-25-baycare-medical-bill-b"
["c09a129d73e21fe6"]="2026-01-08-sophia-jongsma-medical-bill"
["669bdec86f28d83d"]="2025-form-1098-mortgage-interest"
["1947d2b3d8ac0437"]="2026-01-06-irs-withholding-compliance-letter"
)
for old_id in "${!RENAMES[@]}"; do
migrate "$old_id" "${RENAMES[$old_id]}"
done
echo
echo "Done! ${#RENAMES[@]} documents migrated."
if [ "$DRY_RUN" != "--dry-run" ]; then
echo "Starting docsys..."
systemctl --user start docsys
echo "Service started (FTS will rebuild automatically)"
fi