diff --git a/server/cinema/bin/server.dart b/server/cinema/bin/server.dart index 28057fc..a06cba7 100644 --- a/server/cinema/bin/server.dart +++ b/server/cinema/bin/server.dart @@ -1,9 +1,8 @@ -import 'dart:async'; import 'dart:io'; import 'package:cinema/feature/poster/poster.service.dart'; +import 'package:cinema/feature/root/root.service.dart'; import 'package:cinema/feature/version/version.dart'; -import 'package:cinema/feature/websocket/websocket.service.dart'; import 'package:cinema/injectable.dart'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as io; @@ -16,23 +15,17 @@ void main(List args) async { final router = Router(); router.mount("/poster", getIt().router.call); + router.mount("/", getIt().router.call); // Configure a pipeline that logs requests. final handler = Pipeline().addMiddleware(logRequests()).addHandler(router.call); - FutureOr combinedHandler(Request request) { - if (request.url.path == 'ws') { - return getIt().handler(request); - } - return handler(request); - } - // Use any available host or container IP (usually `0.0.0.0`). final ip = InternetAddress.anyIPv4; // For running in containers, we respect the PORT environment variable. final port = int.parse(Platform.environment['PORT'] ?? '3000'); - await io.serve(combinedHandler, ip, port, poweredByHeader: null).then((server) async { + await io.serve(handler, ip, port, poweredByHeader: null).then((server) async { final bannerFile = File('banner.txt'); if (await bannerFile.exists()) { final banner = await bannerFile.readAsString(); diff --git a/server/cinema/lib/feature/poster/poster.service.dart b/server/cinema/lib/feature/poster/poster.service.dart index 956517b..dccbb51 100644 --- a/server/cinema/lib/feature/poster/poster.service.dart +++ b/server/cinema/lib/feature/poster/poster.service.dart @@ -10,12 +10,12 @@ part 'poster.service.g.dart'; @injectable class PosterService { @Route.get('/') - Future listPosters(Request request) async { + Future getRoot(Request request) async { return Response.ok('deprecated poster endpoint. use POST /poster instead'); } @Route.post('/') - Future createPoster(Request request) async { + Future postRoot(Request request) async { final payload = await request.readAsString(); final body = jsonDecode(payload); final params = posterSchema.safeParse(body); @@ -32,6 +32,5 @@ class PosterService { return Response.ok(jsonEncode(params.data), headers: {'Content-Type': 'application/json'}); } - // Create router using the generate function defined in 'poster.g.dart'. Router get router => _$PosterServiceRouter(this); } diff --git a/server/cinema/lib/feature/root/root.service.dart b/server/cinema/lib/feature/root/root.service.dart new file mode 100644 index 0000000..f56ebc4 --- /dev/null +++ b/server/cinema/lib/feature/root/root.service.dart @@ -0,0 +1,25 @@ +import 'package:cinema/feature/websocket/websocket.service.dart'; +import 'package:cinema/injectable.dart'; +import 'package:injectable/injectable.dart'; +import 'package:shelf/shelf.dart'; +import 'package:shelf_router/shelf_router.dart'; + +part 'root.service.g.dart'; + +@injectable +class RootService { + @Route.get('/') + Future getRoot(Request request) async { + final isWebSocket = + request.headers['connection']?.toLowerCase() == 'upgrade' && + request.headers['upgrade']?.toLowerCase() == 'websocket'; + + if (isWebSocket) { + return getIt().handler(request); + } + + return Response.ok('REST response'); + } + + Router get router => _$RootServiceRouter(this); +}