138 lines
5.2 KiB
TypeScript
138 lines
5.2 KiB
TypeScript
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;
|