import 'dart:io'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as shelf_io; import '../lib/db.dart'; import '../lib/env.dart'; import '../lib/firebase_auth.dart'; import '../lib/handlers/incoming_question_handler.dart'; import '../lib/handlers/profile_handler.dart'; import '../lib/handlers/questions_handler.dart'; import '../lib/handlers/questions_hub_handler.dart'; import '../lib/pipeline/question_pipeline.dart'; import '../lib/question_service.dart'; import '../lib/questions_db.dart'; import '../lib/workers/question_background_worker.dart'; Future main() async { final Directory serverRoot = Directory.current; if (!File('migrations/001_users.sql').existsSync()) { final String cwd = serverRoot.path; stderr.writeln( 'Run the API from the server/ directory (cd server && dart run bin/server.dart). ' 'Current directory: $cwd', ); exit(1); } final ServerEnv env = ServerEnv.load(); final ProfileDb db = await ProfileDb.connect(env.databaseUrl); await db.migrate(); final FirebaseAuthVerifier auth = FirebaseAuthVerifier(env.firebaseWebApiKey); final QuestionsDb questionsDb = QuestionsDb(db.connection); final QuestionService questionService = QuestionService( questionsDb: questionsDb, hubConnections: questionsHubConnections, ); final QuestionPipeline questionPipeline = QuestionPipeline( questionsDb: questionsDb, questionService: questionService, testMode: env.questionPipelineTestMode, ); QuestionBackgroundWorker? backgroundWorker; if (env.questionWorkerEnabled) { backgroundWorker = QuestionBackgroundWorker( pipeline: questionPipeline, interval: Duration(seconds: env.questionWorkerIntervalSeconds), ); backgroundWorker.start(); } final Handler profile = profileHandler(db: db, auth: auth); final Handler questionsHub = questionsHubHandler( auth: auth, questionService: questionService, ); final Handler incomingQuestion = incomingQuestionHandler( auth: auth, questionsDb: questionsDb, ); final Handler questions = questionsHandler( auth: auth, questionsDb: questionsDb, questionService: questionService, questionPipeline: questionPipeline, ); final Handler handler = Pipeline() .addMiddleware(logRequests()) .addHandler((Request request) { final String path = request.requestedUri.path; if (path.startsWith(questionsHubPath)) { return questionsHub(request); } if (path == '/v1/me/incoming-question') { return incomingQuestion(request); } if (path.startsWith(questionsBasePath)) { return questions(request); } return profile(request); }); final HttpServer server = await shelf_io.serve( handler, InternetAddress.anyIPv4, env.port, ); stdout.writeln( 'Cyber Hybrid Hub API listening on http://localhost:${server.port}', ); }