import 'dart:io'; import 'dart:async'; import 'package:dotenv/dotenv.dart'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart'; import 'package:shelf_router/shelf_router.dart'; import 'package:shelf_static/shelf_static.dart'; import 'database/database_provider.dart'; import 'routes/auth_routes.dart'; import 'routes/geo_routes.dart'; Middleware _corsMiddleware = (Handler innerHandler) { return (Request request) { final headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', 'Access-Control-Max-Age': '86400', }; if (request.method == 'OPTIONS') { return Response.ok(null, headers: headers); } return Future.value(innerHandler(request)).then((response) => response.change(headers: headers)); }; }; void main(List args) async { final dotenv = DotEnv(includePlatformEnvironment: true)..load(); final database = DatabaseProvider(dotEnv: dotenv); await database.initialize(); Timer.periodic(const Duration(minutes: 5), (timer) { database.cleanupExpired(); }); final authRoutes = AuthRoutes(database: database,dotEnv: dotenv); final geoRoutes = GeoRoutes(database: database); final router = Router() ..mount('/', authRoutes.routes.call) ..mount('/', geoRoutes.routes.call); final staticHandler = createStaticHandler('web', defaultDocument: 'index.html'); final handler = Pipeline() .addMiddleware(_corsMiddleware) .addMiddleware(logRequests()) .addHandler(Cascade() .add(staticHandler) .add(router.call) .handler); final ip = dotenv['HOST'] ?? InternetAddress.anyIPv4; final port = int.parse(dotenv['PORT'] ?? '9090'); final server = await serve(handler, ip, port); print('Server listening on port ${server.port}'); }