Files
SkyArtShop/backend/validate-database.sh

219 lines
6.0 KiB
Bash
Raw Normal View History

2026-01-04 17:52:37 -06:00
#!/bin/bash
# =====================================================
# Database Schema Validation Script
# Purpose: Apply all database fixes and verify alignment
# Date: January 3, 2026
# =====================================================
set -e # Exit on error
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DB_NAME="skyartshop"
DB_USER="skyartapp"
DB_HOST="localhost"
export PGPASSWORD="SkyArt2025Pass"
echo "=================================="
echo "SkyArtShop Database Fix & Validation"
echo "=================================="
echo ""
# Check if PostgreSQL is running
echo "1. Checking PostgreSQL connection..."
if ! psql -U $DB_USER -d $DB_NAME -h $DB_HOST -c "SELECT 1;" > /dev/null 2>&1; then
echo "❌ Cannot connect to PostgreSQL"
echo " Make sure PostgreSQL is running and credentials are correct"
exit 1
fi
echo "✅ PostgreSQL connection successful"
echo ""
# Apply database analysis and fixes
echo "2. Applying database schema fixes..."
if psql -U $DB_USER -d $DB_NAME -h $DB_HOST -f "$SCRIPT_DIR/database-analysis-fixes.sql" > /dev/null 2>&1; then
echo "✅ Database schema fixes applied"
else
echo "⚠️ Some fixes may have failed (this is normal if they were already applied)"
fi
echo ""
# Verify tables exist
echo "3. Verifying core tables..."
TABLES=(
"products"
"product_images"
"adminusers"
"uploads"
"media_folders"
"blogposts"
"portfolioprojects"
"pages"
"homepagesections"
"team_members"
"site_settings"
)
MISSING_TABLES=()
for table in "${TABLES[@]}"; do
if psql -U $DB_USER -d $DB_NAME -h $DB_HOST -tAc "SELECT to_regclass('public.$table');" | grep -q "$table"; then
echo "$table"
else
echo "$table (MISSING)"
MISSING_TABLES+=("$table")
fi
done
echo ""
if [ ${#MISSING_TABLES[@]} -gt 0 ]; then
echo "⚠️ Missing tables: ${MISSING_TABLES[*]}"
echo " Please create these tables manually"
else
echo "✅ All core tables exist"
fi
echo ""
# Verify indexes
echo "4. Checking critical indexes..."
INDEXES=(
"idx_products_isactive"
"idx_products_slug"
"idx_product_images_product_id"
"idx_blogposts_slug"
"idx_pages_slug"
"idx_uploads_folder_id"
)
MISSING_INDEXES=()
for index in "${INDEXES[@]}"; do
if psql -U $DB_USER -d $DB_NAME -h $DB_HOST -tAc "SELECT to_regclass('public.$index');" | grep -q "$index"; then
echo "$index"
else
echo " ⚠️ $index (missing or pending)"
MISSING_INDEXES+=("$index")
fi
done
echo ""
if [ ${#MISSING_INDEXES[@]} -gt 0 ]; then
echo "⚠️ Some indexes are missing: ${MISSING_INDEXES[*]}"
else
echo "✅ All critical indexes exist"
fi
echo ""
# Verify foreign keys
echo "5. Checking foreign key constraints..."
FK_COUNT=$(psql -U $DB_USER -d $DB_NAME -h $DB_HOST -tAc "
SELECT COUNT(*)
FROM information_schema.table_constraints
WHERE constraint_type = 'FOREIGN KEY'
AND table_schema = 'public';
")
echo " Found $FK_COUNT foreign key constraints"
echo ""
# Show table row counts
echo "6. Table row counts:"
psql -U $DB_USER -d $DB_NAME -h $DB_HOST -c "
SELECT 'products' as table_name, COUNT(*) as rows FROM products
UNION ALL
SELECT 'product_images', COUNT(*) FROM product_images
UNION ALL
SELECT 'blogposts', COUNT(*) FROM blogposts
UNION ALL
SELECT 'portfolioprojects', COUNT(*) FROM portfolioprojects
UNION ALL
SELECT 'pages', COUNT(*) FROM pages
UNION ALL
SELECT 'uploads', COUNT(*) FROM uploads
UNION ALL
SELECT 'media_folders', COUNT(*) FROM media_folders
UNION ALL
SELECT 'adminusers', COUNT(*) FROM adminusers
ORDER BY table_name;
" 2>/dev/null || echo " Unable to query row counts"
echo ""
# Check for missing columns
echo "7. Validating critical columns..."
COLUMN_CHECKS=(
"products:slug"
"products:shortdescription"
"products:isfeatured"
"product_images:color_variant"
"product_images:variant_price"
"uploads:folder_id"
"pages:ispublished"
)
MISSING_COLUMNS=()
for check in "${COLUMN_CHECKS[@]}"; do
table="${check%:*}"
column="${check#*:}"
if psql -U $DB_USER -d $DB_NAME -h $DB_HOST -tAc "
SELECT COUNT(*)
FROM information_schema.columns
WHERE table_name = '$table'
AND column_name = '$column';
" | grep -q "1"; then
echo "$table.$column"
else
echo "$table.$column (MISSING)"
MISSING_COLUMNS+=("$table.$column")
fi
done
echo ""
if [ ${#MISSING_COLUMNS[@]} -gt 0 ]; then
echo "❌ Missing columns: ${MISSING_COLUMNS[*]}"
else
echo "✅ All critical columns exist"
fi
echo ""
# Run ANALYZE for query optimization
echo "8. Running ANALYZE to update statistics..."
psql -U $DB_USER -d $DB_NAME -h $DB_HOST -c "ANALYZE;" > /dev/null 2>&1
echo "✅ Database statistics updated"
echo ""
# Summary
echo "=================================="
echo "VALIDATION SUMMARY"
echo "=================================="
TOTAL_ISSUES=0
if [ ${#MISSING_TABLES[@]} -gt 0 ]; then
echo "❌ Missing tables: ${#MISSING_TABLES[@]}"
TOTAL_ISSUES=$((TOTAL_ISSUES + ${#MISSING_TABLES[@]}))
fi
if [ ${#MISSING_INDEXES[@]} -gt 0 ]; then
echo "⚠️ Missing indexes: ${#MISSING_INDEXES[@]}"
fi
if [ ${#MISSING_COLUMNS[@]} -gt 0 ]; then
echo "❌ Missing columns: ${#MISSING_COLUMNS[@]}"
TOTAL_ISSUES=$((TOTAL_ISSUES + ${#MISSING_COLUMNS[@]}))
fi
echo ""
if [ $TOTAL_ISSUES -eq 0 ]; then
echo "✅ Database schema is healthy!"
echo ""
echo "Next steps:"
echo "1. Review query optimization: query-optimization-analysis.sql"
echo "2. Update Prisma schema: backend/prisma/schema-updated.prisma"
echo "3. Restart backend server to apply changes"
else
echo "⚠️ Found $TOTAL_ISSUES critical issues"
echo ""
echo "Please:"
echo "1. Review the output above"
echo "2. Run database-analysis-fixes.sql manually if needed"
echo "3. Create any missing tables/columns"
fi
echo ""
echo "=================================="