fix: auto-correct PostgreSQL boolean types at Docker startup

Automatically fixes INTEGER->BOOLEAN type mismatches when Docker starts.
This resolves the 500 error on /api/notes without manual intervention.

Changes:
- scripts/fix-postgres-boolean-types.sql: Idempotent SQL script that
  detects INTEGER columns that should be BOOLEAN and converts them
  (0→FALSE, 1→TRUE) for all affected tables

- docker-entrypoint.sh: Executes the boolean correction script
  automatically after migrations and before starting the server

The script corrects these columns:
  • users.is_admin
  • notes.archived
  • note_todos.completed, note_todos.priority
  • global_todos.completed, global_todos.priority
  • rss_feeds.enabled
  • calendar_events.all_day

The correction is idempotent and runs on every container restart,
ensuring data integrity even after database migrations.

Fixes: Notes not displaying due to boolean type mismatch
This commit is contained in:
Claude committed 2025-11-28 16:42:31 +00:00
1 parent 1687f1fa2c
commit b661f7f2f6
2 files changed
+114

No files matched your search

+23
View File
@@ -83,6 +83,29 @@ echo ""
echo "🔄 Migration des timezones du calendrier..." echo "🔄 Migration des timezones du calendrier..."
node scripts/migrate-calendar-timezone.js 2>/dev/null || echo " ℹ️ Migration timezone déjà effectuée ou non nécessaire" node scripts/migrate-calendar-timezone.js 2>/dev/null || echo " ℹ️ Migration timezone déjà effectuée ou non nécessaire"
echo ""
echo "🔧 Correction des types booléens PostgreSQL..."
# Exécuter le script SQL de correction des types booléens
if [ -f "/app/scripts/fix-postgres-boolean-types.sql" ]; then
# Extraire les informations de connexion depuis DATABASE_URL
PGHOST=$(echo $DATABASE_URL | sed -n 's/.*@\([^:]*\):.*/\1/p')
PGPORT=$(echo $DATABASE_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p')
PGUSER=$(echo $DATABASE_URL | sed -n 's/.*\/\/\([^:]*\):.*/\1/p')
PGPASSWORD=$(echo $DATABASE_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p')
PGDATABASE=$(echo $DATABASE_URL | sed -n 's/.*\/\([^?]*\).*/\1/p')
export PGHOST PGPORT PGUSER PGPASSWORD PGDATABASE
# Exécuter le script SQL
if psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDATABASE" -f /app/scripts/fix-postgres-boolean-types.sql > /dev/null 2>&1; then
echo " ✅ Types booléens corrigés"
else
echo " ℹ️ Correction des types booléens déjà effectuée ou non nécessaire"
fi
else
echo " ⚠️ Script de correction non trouvé"
fi
echo "" echo ""
echo "========================================" echo "========================================"
echo "🚀 Démarrage du serveur NoteFlow..." echo "🚀 Démarrage du serveur NoteFlow..."
+91
View File
@@ -0,0 +1,91 @@
-- Script de correction des types booléens PostgreSQL
-- Convertit les colonnes INTEGER en BOOLEAN et les données 0/1 en FALSE/TRUE
-- Ce script est idempotent: il peut être exécuté plusieurs fois sans problème
-- Fonction pour vérifier et corriger le type d'une colonne
DO $$
DECLARE
column_info RECORD;
BEGIN
-- Corriger users.is_admin
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'users' AND column_name = 'is_admin';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting users.is_admin from INTEGER to BOOLEAN';
ALTER TABLE users ALTER COLUMN is_admin TYPE BOOLEAN
USING CASE WHEN is_admin = 0 THEN FALSE WHEN is_admin = 1 THEN TRUE ELSE is_admin::BOOLEAN END;
END IF;
-- Corriger notes.archived
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'notes' AND column_name = 'archived';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting notes.archived from INTEGER to BOOLEAN';
ALTER TABLE notes ALTER COLUMN archived TYPE BOOLEAN
USING CASE WHEN archived = 0 THEN FALSE WHEN archived = 1 THEN TRUE ELSE archived::BOOLEAN END;
END IF;
-- Corriger note_todos.completed
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'note_todos' AND column_name = 'completed';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting note_todos.completed from INTEGER to BOOLEAN';
ALTER TABLE note_todos ALTER COLUMN completed TYPE BOOLEAN
USING CASE WHEN completed = 0 THEN FALSE WHEN completed = 1 THEN TRUE ELSE completed::BOOLEAN END;
END IF;
-- Corriger note_todos.priority
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'note_todos' AND column_name = 'priority';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting note_todos.priority from INTEGER to BOOLEAN';
ALTER TABLE note_todos ALTER COLUMN priority TYPE BOOLEAN
USING CASE WHEN priority = 0 THEN FALSE WHEN priority = 1 THEN TRUE ELSE priority::BOOLEAN END;
END IF;
-- Corriger global_todos.completed
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'global_todos' AND column_name = 'completed';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting global_todos.completed from INTEGER to BOOLEAN';
ALTER TABLE global_todos ALTER COLUMN completed TYPE BOOLEAN
USING CASE WHEN completed = 0 THEN FALSE WHEN completed = 1 THEN TRUE ELSE completed::BOOLEAN END;
END IF;
-- Corriger global_todos.priority
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'global_todos' AND column_name = 'priority';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting global_todos.priority from INTEGER to BOOLEAN';
ALTER TABLE global_todos ALTER COLUMN priority TYPE BOOLEAN
USING CASE WHEN priority = 0 THEN FALSE WHEN priority = 1 THEN TRUE ELSE priority::BOOLEAN END;
END IF;
-- Corriger rss_feeds.enabled
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'rss_feeds' AND column_name = 'enabled';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting rss_feeds.enabled from INTEGER to BOOLEAN';
ALTER TABLE rss_feeds ALTER COLUMN enabled TYPE BOOLEAN
USING CASE WHEN enabled = 0 THEN FALSE WHEN enabled = 1 THEN TRUE ELSE enabled::BOOLEAN END;
END IF;
-- Corriger calendar_events.all_day
SELECT data_type INTO column_info FROM information_schema.columns
WHERE table_name = 'calendar_events' AND column_name = 'all_day';
IF FOUND AND column_info.data_type = 'integer' THEN
RAISE NOTICE 'Converting calendar_events.all_day from INTEGER to BOOLEAN';
ALTER TABLE calendar_events ALTER COLUMN all_day TYPE BOOLEAN
USING CASE WHEN all_day = 0 THEN FALSE WHEN all_day = 1 THEN TRUE ELSE all_day::BOOLEAN END;
END IF;
RAISE NOTICE 'Boolean type correction completed successfully';
END $$;