add backend server setup with environment configuration, tile caching, and bus stop fetching functionality

This commit is contained in:
ImBenji
2026-03-31 16:37:34 +01:00
parent 618f3dd3ed
commit 49fc04591b
27 changed files with 1536 additions and 374 deletions
+52
View File
@@ -0,0 +1,52 @@
import 'dart:io';
import 'package:dotenv/dotenv.dart';
import 'package:shelf/shelf.dart' show Middleware, Response;
import 'package:rra_backend/rra_backend.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
Middleware _logger() => (handler) => (request) async {
final sw = Stopwatch()..start();
final response = await handler(request);
sw.stop();
final ms = sw.elapsedMilliseconds;
print('${request.method} ${response.statusCode} ${ms}ms ${request.url.path}');
return response;
};
Middleware _cors() => (handler) => (request) async {
if (request.method == 'OPTIONS') {
return Response.ok('', headers: _corsHeaders);
}
final response = await handler(request);
return response.change(headers: _corsHeaders);
};
const _corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, OPTIONS',
'Access-Control-Allow-Headers': 'Origin, Content-Type',
};
void main() async {
final env = DotEnv(includePlatformEnvironment: true)..load();
final mapboxToken = env['MAPBOX_ACCESS_TOKEN'];
if (mapboxToken == null || mapboxToken.isEmpty) {
stderr.writeln('ERROR: MAPBOX_ACCESS_TOKEN not set');
exit(1);
}
final port = int.tryParse(env['PORT'] ?? '8080') ?? 8080;
await TileCache.init();
final handler = const Pipeline()
.addMiddleware(_logger())
.addMiddleware(_cors())
.addHandler(buildRouter(mapboxToken).call);
final server = await io.serve(handler, InternetAddress.anyIPv4, port);
print('rra_backend listening on :${server.port}');
}