post('login', static fn(Request $request): array => (new AuthService())->login($request)); $router->post('logout', static fn(Request $request): array => (new AuthService())->logout($request)); $router->get('me', static fn(Request $request): array => (new AuthService())->me($request)); $router->post('me', static fn(Request $request): array => (new AuthService())->me($request)); $requireOwner = static function (Request $request) use ($authService): array { $session = $authService->requireUser($request); if (($session['user']['permissions']['canManageBackend'] ?? false) !== true) { throw new ApiException( 'FORBIDDEN', 'Samo vlasnik sistema može pokrenuti post-cutover smoke test.', 403 ); } return $session; }; $health = static function (Request $request) use ($service): array { return [ 'application' => 'Seoski odbor Gornje Rapče', 'service' => 'SOGR Post-Cutover Smoke API', 'phase' => Phase7CA6R2R2PostCutoverSmokeService::PHASE, 'version' => Phase7CA6R2R2PostCutoverSmokeService::VERSION, 'mode' => Phase7CA6R2R2PostCutoverSmokeService::MODE, 'status' => 'available', 'writesAvailableThroughThisEndpoint' => false, ]; }; $router->get('healthCheck', $health); $router->post('healthCheck', $health); $status = static function (Request $request) use ($requireOwner, $service): array { $requireOwner($request); return $service->status(); }; $router->get('phase7cA6R2R2Status', $status); $router->post('phase7cA6R2R2Status', $status); $run = static function (Request $request) use ($requireOwner, $service): array { $requireOwner($request); if ($request->input('dryRun', true) !== true) { throw new ApiException( 'DRY_RUN_REQUIRED', 'Post-cutover smoke test podržava isključivo dryRun=true.', 400 ); } return $service->run(); }; $router->post('phase7cA6R2R2Run', $run); $router->dispatch($request);