'Seoski odbor Gornje Rapče', 'service' => 'SOGR Phase 7C-A2 Staging API', 'status' => 'healthy', 'phase' => '7C-A2', 'version' => '7C-A2.1', 'mode' => 'STAGING_CANARY_ROLLBACK_ONLY', 'productionIndexUntouched' => hash_equals( '4ef991b973409b9fba9f217a834c0a026235bd4d7e9fc6088e8de60ecba0095e', $productionSha256 ), 'productionIndexSha256' => $productionSha256, 'writeActionsEnabled' => false, 'commitRoutesRegistered' => [], 'rollbackOnlyRouteRegistered' => true, 'googleSheetsCallsAvailable' => false, 'database' => [ 'connected' => true, 'name' => (string) Database::connection()->query('SELECT DATABASE()')->fetchColumn(), ], 'gate' => $service->status(), ]; }; $router->get('healthCheck', $health); $router->post('healthCheck', $health); $router->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); $canManageBackend = (($session['user']['permissions']['canManageBackend'] ?? false) === true); if (!$canManageBackend) { throw new ApiException( 'FORBIDDEN', 'Samo vlasnik sistema može pokrenuti Fazu 7C-A2.', 403 ); } return $session; }; $statusHandler = static function (Request $request) use ( $requireOwner, $service ): array { $requireOwner($request); return $service->status(); }; $router->get('phase7cA2Status', $statusHandler); $router->post('phase7cA2Status', $statusHandler); $runHandler = static function (Request $request) use ( $requireOwner, $service ): array { $session = $requireOwner($request); if ($request->input('dryRun', true) !== true) { throw new ApiException( 'DRY_RUN_REQUIRED', 'Faza 7C-A2 dozvoljava samo dryRun=true.', 400 ); } if ((string) $request->input('confirm', '') !== 'ROLLBACK_ONLY') { throw new ApiException( 'ROLLBACK_CONFIRMATION_REQUIRED', 'Nedostaje potvrda ROLLBACK_ONLY.', 400 ); } $payload = [ 'requestId' => $request->input('requestId', ''), 'sourceRow' => $request->input('sourceRow', 0), 'membershipAmount' => $request->input('membershipAmount', null), 'donationAmount' => $request->input('donationAmount', 0), 'paymentDate' => $request->input('paymentDate', gmdate('Y-m-d')), 'place' => $request->input('place', 'G. RAPČA'), 'collector' => $request->input('collector', 'munir'), 'ipAddress' => $_SERVER['REMOTE_ADDR'] ?? null, 'userAgent' => $_SERVER['HTTP_USER_AGENT'] ?? null, ]; return $service->run($payload, $session); }; $router->post('phase7cA2Run', $runHandler); $router->dispatch($request);