/** * SimpleNote Web - Entry Point * Document management API with nested libraries and markdown support */ import express from 'express'; import cors from 'cors'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; import config from './config/index.js'; import { createApiRouter } from './routes/index.js'; import { errorHandler } from './middleware/errorHandler.js'; import { initTagIndexer } from './indexers/tagIndexer.js'; import { ensureDir } from './utils/fsHelper.js'; const app = express(); // Serve static files from public/ app.use(express.static(join(dirname(fileURLToPath(import.meta.url)), '..', 'public'))); // Middleware app.use(cors({ origin: config.corsOrigin })); app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true })); // Health check (unprotected) app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString(), version: '1.0.0' }); }); // Ensure data directory exists ensureDir(config.dataRoot); // Initialize tag indexer console.log(`[SimpleNote] Data root: ${config.dataRoot}`); initTagIndexer(config.dataRoot); // Mount API routes app.use(config.apiPrefix, createApiRouter(config.apiPrefix)); // Error handler app.use(errorHandler); // Start server app.listen(config.port, config.host, () => { console.log(`[SimpleNote] Web API running on http://${config.host}:${config.port}`); console.log(`[SimpleNote] API prefix: ${config.apiPrefix}`); }); export default app;