import 'package:chat_server/models.dart'; import 'package:chat_server/objectbox.g.dart'; import 'package:hotreloader/hotreloader.dart'; import 'package:relic/relic.dart'; import 'config/config.dart'; import 'src/auth/auth_middleware.dart'; import 'src/handlers/auth_handlers.dart'; import 'src/handlers/channel_handlers.dart'; import 'src/handlers/message_handlers.dart'; import 'src/handlers/public_handlers.dart'; import 'src/utils/extensions.dart'; // Global ObjectBox store and boxes late final Store store; late final Box userBox; late final Box channelBox; late final Box messageBox; RelicApp? _currentApp; Future startServer() async { await _currentApp?.close(); _currentApp = RelicApp() // ============ PUBLIC ENDPOINTS (no auth) ============ // Auth ..post('/auth/register', registerHandler) ..post('/auth/login', loginHandler) ..post('/auth/join', joinServerHandler) // Public identity verification (for cross-server) ..get('/.well-known/users/', publicUserHandler) ..get('/.well-known/verify/', publicVerifyHandler) ..get('/.well-known/server', publicServerInfoHandler) // ============ PROTECTED ENDPOINTS (requires auth) ============ ..use('/api', jwtMiddleware) // Current user ..get('/api/me', getMeHandler) // Channels ..get('/api/channels', getChannelsHandler) ..post('/api/channels', createChannelHandler) ..get('/api/channels/', getChannelHandler) // Messages ..get('/api/messages', getMessagesHandler) ..post('/api/messages', sendMessageHandler) ..put('/api/messages/', editMessageHandler) ..delete('/api/messages/', deleteMessageHandler) // ============ LOGGING & FALLBACK ============ ..use('/', logRequests()) ..fallback = respondWith((_) => Response.notFound()); print(''); print('╔════════════════════════════════════════════╗'); print('║ 🚀 Server starting... ║'); print('║ Host: ${Config.serverHost.padRight(34)}║'); print('║ URL: http://localhost:${Config.port.toString().padRight(26)}║'); print('╚════════════════════════════════════════════╝'); print(''); await _currentApp!.serve(port: Config.port); } void main() async { // Initialize ObjectBox store = openStore(); userBox = store.box(); channelBox = store.box(); messageBox = store.box(); // Enable hot reload in development await HotReloader.create( onAfterReload: (ctx) async { print('🔄 Changes detected! Restarting server...'); await startServer(); }, ); await startServer(); }