219 lines
6.0 KiB
Bash
219 lines
6.0 KiB
Bash
|
|
#!/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 "=================================="
|