import express from 'express'; import cors from 'cors'; import projectRoutes from '../src/server/routes/projectRoutes.js'; import partRoutes from '../src/server/routes/partRoutes.js'; import paintingSchemeRoutes from '../src/server/routes/paintingSchemeRoutes.js'; import applicationRecordRoutes from '../src/server/routes/applicationRecordRoutes.js'; import inspectionRoutes from '../src/server/routes/inspectionRoutes.js'; import analysisRoutes from '../src/server/routes/analysisRoutes.js'; import dataSheetRoutes from '../src/server/routes/dataSheetRoutes.js'; import yieldStudyRoutes from '../src/server/routes/yieldStudyRoutes.js'; import userRoutes from '../src/server/routes/userRoutes.js'; import systemSettingsRoutes from '../src/server/routes/systemSettingsRoutes.js'; import geometryTypeRoutes from '../src/server/routes/geometryTypeRoutes.js'; import stockRoutes from '../src/server/routes/stockRoutes.js'; import authRoutes from '../src/server/routes/authRoutes.js'; import notificationRoutes from '../src/server/routes/notificationRoutes.js'; import instrumentRoutes from '../src/server/routes/instrumentRoutes.js'; import { extractUser } from '../src/server/middleware/roleMiddleware.js'; import path from 'path'; const app = express(); app.use(cors({ origin: '*', // Be more specific in production methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'x-organization-id', 'x-organization-name'] })); app.use(express.json()); // Global Middleware import { authMiddleware } from '../src/server/middleware/auth.js'; app.use(authMiddleware); app.use(extractUser); // Static Uploads app.use('/uploads', express.static(path.join(process.cwd(), 'uploads'))); import pool from '../src/server/config/postgres.js'; // ... (existing routes) app.get('/api/admin/migrate-to-gpi', async (req, res) => { const TABLES = [ "organizations", "users", "user_organizations", "projects", "parts", "technical_data_sheets", "painting_schemes", "inspections", "instruments", "stock_items", "stock_movements", "application_records", "application_record_items" ]; try { const client = await pool.connect(); await client.query("CREATE SCHEMA IF NOT EXISTS gpi;"); const results = []; for (const table of TABLES) { try { // Try to move from public to gpi await client.query(`ALTER TABLE public.${table} SET SCHEMA gpi;`); results.push({ table, action: 'moved', status: 'success' }); } catch (err: any) { // If it fails, maybe it's already in gpi? try { await client.query(`SELECT 1 FROM gpi.${table} LIMIT 1`); results.push({ table, action: 'check', status: 'already_in_gpi' }); } catch (checkErr: any) { results.push({ table, action: 'move', status: 'failed', error: err.message }); } } } // Ensure new tables exist await client.query(` CREATE TABLE IF NOT EXISTS gpi.files ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), filename TEXT NOT NULL, content_type TEXT NOT NULL, data BYTEA NOT NULL, size INTEGER NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); `); results.push({ table: 'files', action: 'create', status: 'success_or_exists' }); await client.query(` CREATE TABLE IF NOT EXISTS gpi.stock_audit_logs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), organization_id UUID, stock_item_id UUID, movement_id UUID, movement_number INTEGER, user_id TEXT, user_name TEXT, action TEXT, details TEXT, old_values JSONB, new_values JSONB, timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); `); results.push({ table: 'stock_audit_logs', action: 'create', status: 'success_or_exists' }); client.release(); res.json({ message: "Migration check completed", results }); } catch (error: any) { res.status(500).json({ error: error.message }); } }); app.use('/api/auth', authRoutes); app.use('/api/users', userRoutes); app.use('/api/projects', projectRoutes); app.use('/api/parts', partRoutes); app.use('/api/painting-schemes', paintingSchemeRoutes); app.use('/api/application-records', applicationRecordRoutes); app.use('/api/inspections', inspectionRoutes); app.use('/api', analysisRoutes); app.use('/api/datasheets', dataSheetRoutes); app.use('/api/yield-studies', yieldStudyRoutes); app.use('/api/system-settings', systemSettingsRoutes); app.use('/api/geometry-types', geometryTypeRoutes); app.use('/api/stock', stockRoutes); app.use('/api/notifications', notificationRoutes); app.use('/api/instruments', instrumentRoutes); app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date() }); }); export default app;