Files
LogiFlow/migrations/production_fix_announcements.js
T
michaelschal b80af1d2d8 Add announcement table to database for storing important information
Implement database migration scripts and SQL to create the 'announcements' table with relevant columns, constraints, and indexes. Also, adjust frontend component logic for handling 'all' store selection.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/biGr9ER
2025-08-16 10:42:31 +00:00

103 lines
3.6 KiB
JavaScript

// Script de migration production pour créer la table announcements
// Usage: node migrations/production_fix_announcements.js
import { drizzle } from 'drizzle-orm/node-postgres';
import pg from 'pg';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { readFileSync } from 'fs';
const { Pool } = pg;
async function createAnnouncementsTable() {
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
const db = drizzle(pool);
try {
console.log('🔄 Création de la table announcements...');
// SQL pour créer la table announcements
const sql = `
-- Création de la table announcements
CREATE TABLE IF NOT EXISTS announcements (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
priority VARCHAR(20) NOT NULL DEFAULT 'normal' CHECK (priority IN ('normal', 'important', 'urgent')),
author_id VARCHAR(255) NOT NULL,
group_id INTEGER,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
CONSTRAINT announcements_author_id_fkey FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT announcements_group_id_fkey FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE
);
-- Création des index
CREATE INDEX IF NOT EXISTS idx_announcements_priority ON announcements(priority);
CREATE INDEX IF NOT EXISTS idx_announcements_created_at ON announcements(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_announcements_author_id ON announcements(author_id);
CREATE INDEX IF NOT EXISTS idx_announcements_group_id ON announcements(group_id);
-- Commentaires
COMMENT ON TABLE announcements IS 'Admin-managed announcements/information system';
COMMENT ON COLUMN announcements.priority IS 'Priority level: normal, important, urgent';
COMMENT ON COLUMN announcements.group_id IS 'NULL for global announcements, specific group_id for store-specific announcements';
`;
await pool.query(sql);
console.log('✅ Table announcements créée avec succès!');
// Vérification que la table existe
const checkResult = await pool.query(`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'announcements'
);
`);
if (checkResult.rows[0].exists) {
console.log('✅ Vérification: La table announcements existe bien');
// Afficher la structure de la table
const structure = await pool.query(`
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'announcements'
ORDER BY ordinal_position;
`);
console.log('📋 Structure de la table:');
structure.rows.forEach(row => {
console.log(` ${row.column_name}: ${row.data_type}${row.is_nullable === 'NO' ? ' NOT NULL' : ''}`);
});
} else {
console.log('❌ Erreur: La table announcements n\'a pas été créée');
}
} catch (error) {
console.error('❌ Erreur lors de la création de la table:', error);
throw error;
} finally {
await pool.end();
}
}
// Exécution
if (import.meta.url === `file://${process.argv[1]}`) {
createAnnouncementsTable()
.then(() => {
console.log('🎉 Migration terminée avec succès');
process.exit(0);
})
.catch((error) => {
console.error('💥 Échec de la migration:', error);
process.exit(1);
});
}
export { createAnnouncementsTable };