mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
Merge pull request #140 from R0m1k3/claude/fix-notes-sync-issue-01AMeEdrKQErsM7bvhKkqEEF
Claude/fix notes sync issue 01 a me edr kq ers m7bvh kkq eef
This commit is contained in:
3 files changed
+67
-4
No files matched your search
+14
-4
@@ -3,8 +3,13 @@
|
||||
## Problème actuel
|
||||
Erreur 500 sur `/api/notes` - Les notes ne s'affichent pas
|
||||
|
||||
## Cause
|
||||
Les données booléennes dans PostgreSQL sont stockées en INTEGER (0/1) au lieu de BOOLEAN (TRUE/FALSE)
|
||||
## Causes identifiées
|
||||
|
||||
### 1. Colonnes manquantes (PRINCIPAL)
|
||||
Les colonnes `parent_id` et `level` ajoutées pendant les phases 1-5 pour le support des subtasks n'existaient pas dans la base PostgreSQL de production.
|
||||
|
||||
### 2. Types booléens incorrects (SECONDAIRE)
|
||||
Les données booléennes migrées de SQLite sont stockées en INTEGER (0/1) au lieu de BOOLEAN (TRUE/FALSE).
|
||||
|
||||
## ✅ Solution AUTOMATIQUE (Recommandée)
|
||||
|
||||
@@ -20,12 +25,17 @@ docker-compose up -d --build
|
||||
|
||||
Le conteneur Docker va automatiquement:
|
||||
1. Attendre que PostgreSQL soit prêt
|
||||
2. Exécuter les migrations de schéma
|
||||
3. **Corriger automatiquement les types booléens** ✨
|
||||
2. **Exécuter les migrations de schéma** ✨
|
||||
- Ajouter les colonnes `parent_id` et `level` pour les subtasks
|
||||
- Ajouter tous les autres champs manquants
|
||||
3. **Corriger automatiquement les types booléens**
|
||||
- Convertir INTEGER → BOOLEAN pour les champs concernés
|
||||
4. Démarrer le serveur
|
||||
|
||||
C'est tout ! Les notes s'afficheront correctement après le redémarrage.
|
||||
|
||||
**Note:** Les migrations sont idempotentes et ne causeront aucune perte de données.
|
||||
|
||||
---
|
||||
|
||||
## Solution manuelle (Si vous n'utilisez pas Docker)
|
||||
|
||||
@@ -126,6 +126,8 @@ async function initDatabase() {
|
||||
completed BOOLEAN DEFAULT FALSE,
|
||||
priority BOOLEAN DEFAULT FALSE,
|
||||
position INTEGER DEFAULT 0,
|
||||
parent_id INTEGER REFERENCES note_todos(id) ON DELETE CASCADE,
|
||||
level INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP
|
||||
)
|
||||
@@ -140,6 +142,8 @@ async function initDatabase() {
|
||||
completed BOOLEAN DEFAULT FALSE,
|
||||
priority BOOLEAN DEFAULT FALSE,
|
||||
in_progress INTEGER DEFAULT 0,
|
||||
parent_id INTEGER REFERENCES global_todos(id) ON DELETE CASCADE,
|
||||
level INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP
|
||||
)
|
||||
|
||||
@@ -185,6 +185,55 @@ async function autoMigrate() {
|
||||
await client.query(`CREATE INDEX IF NOT EXISTS idx_global_todos_priority ON global_todos(priority DESC, created_at DESC)`);
|
||||
await client.query(`CREATE INDEX IF NOT EXISTS idx_note_todos_priority ON note_todos(priority DESC, position)`);
|
||||
|
||||
// Migration 4: Support des subtasks (parent_id, level)
|
||||
logger.info(' Vérification: support des subtasks (parent_id, level)...');
|
||||
|
||||
const noteTodosParentIdExists = await client.query(`
|
||||
SELECT column_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_name='note_todos' AND column_name='parent_id'
|
||||
`);
|
||||
|
||||
if (noteTodosParentIdExists.rows.length === 0) {
|
||||
logger.info(' → Ajout du champ parent_id à note_todos');
|
||||
await client.query(`ALTER TABLE note_todos ADD COLUMN parent_id INTEGER REFERENCES note_todos(id) ON DELETE CASCADE`);
|
||||
await client.query(`CREATE INDEX IF NOT EXISTS idx_note_todos_parent_id ON note_todos(parent_id)`);
|
||||
}
|
||||
|
||||
const noteTodosLevelExists = await client.query(`
|
||||
SELECT column_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_name='note_todos' AND column_name='level'
|
||||
`);
|
||||
|
||||
if (noteTodosLevelExists.rows.length === 0) {
|
||||
logger.info(' → Ajout du champ level à note_todos');
|
||||
await client.query(`ALTER TABLE note_todos ADD COLUMN level INTEGER DEFAULT 0`);
|
||||
}
|
||||
|
||||
const globalTodosParentIdExists = await client.query(`
|
||||
SELECT column_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_name='global_todos' AND column_name='parent_id'
|
||||
`);
|
||||
|
||||
if (globalTodosParentIdExists.rows.length === 0) {
|
||||
logger.info(' → Ajout du champ parent_id à global_todos');
|
||||
await client.query(`ALTER TABLE global_todos ADD COLUMN parent_id INTEGER REFERENCES global_todos(id) ON DELETE CASCADE`);
|
||||
await client.query(`CREATE INDEX IF NOT EXISTS idx_global_todos_parent_id ON global_todos(parent_id)`);
|
||||
}
|
||||
|
||||
const globalTodosLevelExists = await client.query(`
|
||||
SELECT column_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_name='global_todos' AND column_name='level'
|
||||
`);
|
||||
|
||||
if (globalTodosLevelExists.rows.length === 0) {
|
||||
logger.info(' → Ajout du champ level à global_todos');
|
||||
await client.query(`ALTER TABLE global_todos ADD COLUMN level INTEGER DEFAULT 0`);
|
||||
}
|
||||
|
||||
await client.query('COMMIT');
|
||||
|
||||
logger.info('✅ Migrations automatiques terminées avec succès');
|
||||
|
||||
Reference in new issue
Block a user