|
1 | | -import express from 'express'; |
2 | | -import cors from 'cors'; |
3 | | -import { existsSync } from 'fs'; |
4 | 1 | import { createServer } from 'http'; |
5 | | -import path from 'path'; |
6 | | -import { fileURLToPath } from 'url'; |
7 | | -import { initAIToolkit } from './services/ai-toolkit.service.js'; |
8 | | -import { databaseRoutes } from './routes/database.routes.js'; |
9 | | -import { personRoutes } from './routes/person.routes.js'; |
10 | | -import { searchRoutes } from './routes/search.routes.js'; |
11 | | -import { pathRoutes } from './routes/path.routes.js'; |
12 | | -import { indexerRoutes } from './routes/indexer.routes.js'; |
13 | | -import { exportRoutes } from './routes/export.routes.js'; |
14 | | -import { browserRouter } from './routes/browser.routes.js'; |
15 | 2 | import { browserService } from './services/browser.service.js'; |
16 | | -import { augmentationRouter } from './routes/augmentation.routes.js'; |
17 | | -import { genealogyProviderRouter } from './routes/genealogy-provider.routes.js'; |
18 | | -import { providerRouter } from './routes/provider.routes.js'; |
19 | | -import { gedcomRouter } from './routes/gedcom.routes.js'; |
20 | | -import { syncRouter } from './routes/sync.routes.js'; |
21 | | -import { favoritesRouter } from './routes/favorites.routes.js'; |
22 | | -import { ancestryTreeRouter } from './routes/ancestry-tree.routes.js'; |
23 | | -import { aiDiscoveryRouter } from './routes/ai-discovery.routes.js'; |
24 | | -import { testRunnerRouter } from './routes/test-runner.routes.js'; |
25 | | -import { integrityRouter } from './routes/integrity.routes.js'; |
26 | | -import { ancestryHintsRouter } from './routes/ancestry-hints.routes.js'; |
27 | | -import { ancestryUpdateRouter } from './routes/ancestry-update.routes.js'; |
28 | | -import { mapRouter } from './routes/map.routes.js'; |
29 | | -import { auditorRouter } from './routes/auditor.routes.js'; |
30 | | -import { deathsRouter } from './routes/deaths.routes.js'; |
31 | 3 | import { runMigrations } from './db/migrations/index.js'; |
32 | | -import { errorHandler } from './middleware/errorHandler.js'; |
33 | | -import { requestLogger } from './middleware/requestLogger.js'; |
34 | | -import { requestTimeout } from './middleware/requestTimeout.js'; |
35 | 4 | import { logger } from './lib/logger.js'; |
| 5 | +import { createApp } from './app.js'; |
36 | 6 |
|
37 | | -const CORS_ORIGIN = process.env.CORS_ORIGIN || 'http://localhost:6373'; |
38 | | -const corsOrigin = CORS_ORIGIN.includes(',') |
39 | | - ? CORS_ORIGIN.split(',').map(o => { |
40 | | - const trimmed = o.trim(); |
41 | | - new URL(trimmed); // throws on invalid origin |
42 | | - return trimmed; |
43 | | - }) |
44 | | - : CORS_ORIGIN; |
45 | | - |
46 | | -const app = express(); |
| 7 | +const app = createApp(); |
47 | 8 | const httpServer = createServer(app); |
48 | 9 |
|
49 | 10 | const PORT = parseInt(process.env.PORT || '6374', 10); |
50 | 11 |
|
51 | | -// Middleware |
52 | | -app.use(cors({ origin: corsOrigin })); |
53 | | -app.use(express.json()); |
54 | | -app.use(requestTimeout); |
55 | | -app.use(requestLogger); |
56 | | - |
57 | | -// Initialize AI Toolkit with routes for providers, runs, and prompts |
58 | | -const aiToolkit = initAIToolkit(null); |
59 | | -aiToolkit.mountRoutes(app); |
60 | | - |
61 | | -// Routes |
62 | | -app.use('/api/databases', databaseRoutes); |
63 | | -app.use('/api/persons', personRoutes); |
64 | | -app.use('/api/search', searchRoutes); |
65 | | -app.use('/api/path', pathRoutes); |
66 | | -app.use('/api/indexer', indexerRoutes); |
67 | | -app.use('/api/export', exportRoutes); |
68 | | -app.use('/api/browser', browserRouter); |
69 | | -app.use('/api/augment', augmentationRouter); |
70 | | -app.use('/api/genealogy-providers', genealogyProviderRouter); |
71 | | -app.use('/api/scrape-providers', providerRouter); |
72 | | -app.use('/api/gedcom', gedcomRouter); |
73 | | -app.use('/api/sync', syncRouter); |
74 | | -app.use('/api/favorites', favoritesRouter); |
75 | | -app.use('/api/ancestry-tree', ancestryTreeRouter); |
76 | | -app.use('/api/ai-discovery', aiDiscoveryRouter); |
77 | | -app.use('/api/test-runner', testRunnerRouter); |
78 | | -app.use('/api/integrity', integrityRouter); |
79 | | -app.use('/api/ancestry-hints', ancestryHintsRouter); |
80 | | -app.use('/api/ancestry-update', ancestryUpdateRouter); |
81 | | -app.use('/api/map', mapRouter); |
82 | | -app.use('/api/audit', auditorRouter); |
83 | | -app.use('/api/deaths', deathsRouter); |
84 | | - |
85 | | -// Health check |
86 | | -app.get('/api/health', (_req, res) => { |
87 | | - res.json({ status: 'ok', timestamp: new Date().toISOString() }); |
88 | | -}); |
89 | | - |
90 | | -// Serve built client UI in production |
91 | | -const __filename = fileURLToPath(import.meta.url); |
92 | | -const __dirname = path.dirname(__filename); |
93 | | -// From src/index.ts: up to server/, then to project root, then client/dist |
94 | | -const CLIENT_DIST = path.join(__dirname, '..', '..', 'client', 'dist'); |
95 | | -// From dist/index.js (compiled): up to server/, then to project root, then client/dist |
96 | | -const CLIENT_DIST_ALT = path.join(__dirname, '..', '..', '..', 'client', 'dist'); |
97 | | -const clientDist = existsSync(CLIENT_DIST) ? CLIENT_DIST : CLIENT_DIST_ALT; |
98 | | - |
99 | | -if (existsSync(clientDist)) { |
100 | | - app.use(express.static(clientDist)); |
101 | | - app.get('/{*splat}', (_req, res) => { |
102 | | - res.sendFile(path.join(clientDist, 'index.html')); |
103 | | - }); |
104 | | - logger.ok('server', 'Serving built UI from client/dist'); |
105 | | -} |
106 | | - |
107 | | -// Error handling |
108 | | -app.use(errorHandler); |
109 | | - |
110 | 12 | const HOST = process.env.HOST || 'localhost'; |
111 | 13 |
|
112 | 14 | const shutdown = () => { |
|
0 commit comments