post('login',static fn(Request $r):array=>(new AuthService())->login($r)); $router->post('logout',static fn(Request $r):array=>(new AuthService())->logout($r)); $router->get('me',static fn(Request $r):array=>(new AuthService())->me($r));$router->post('me',static fn(Request $r):array=>(new AuthService())->me($r)); $owner=static function(Request $r)use($auth):void{$s=$auth->requireUser($r);if(($s['user']['permissions']['canManageBackend']??false)!==true)throw new ApiException('FORBIDDEN','Samo vlasnik može pokrenuti finalizaciju.',403);}; $run=static function(Request $r,string $operation,callable $fn)use($owner,$pr):array{try{$owner($r);$svc=new Phase7CA6R2R3R8AtomicSyncFinalizerService(Database::connection(),$pr);return $fn($svc);}catch(Throwable $e){return ['phase'=>Phase7CA6R2R3R8AtomicSyncFinalizerService::PHASE,'version'=>Phase7CA6R2R3R8AtomicSyncFinalizerService::VERSION,'mode'=>Phase7CA6R2R3R8AtomicSyncFinalizerService::MODE,'valid'=>false,'operation'=>$operation,'error'=>['code'=>'R3_R8_ENDPOINT_RUNTIME_ERROR','message'=>$e->getMessage(),'exceptionClass'=>get_class($e),'exceptionFile'=>basename($e->getFile()),'exceptionLine'=>$e->getLine()],'safeToRepeatPaymentCommit'=>false,'voidCalled'=>false,'checkedAtUtc'=>gmdate('c')];}}; $health=static fn(Request $r):array=>['application'=>'Seoski odbor Gornje Rapče','phase'=>Phase7CA6R2R3R8AtomicSyncFinalizerService::PHASE,'version'=>Phase7CA6R2R3R8AtomicSyncFinalizerService::VERSION,'mode'=>Phase7CA6R2R3R8AtomicSyncFinalizerService::MODE,'status'=>'available','payAvailable'=>false,'voidAvailable'=>false,'targetQueueId'=>10]; $router->get('healthCheck',$health);$router->post('healthCheck',$health); $status=static fn(Request $r):array=>$run($r,'status',static fn($s):array=>$s->status()); $router->get('phase7cA6R2R3R8Status',$status);$router->post('phase7cA6R2R3R8Status',$status); $router->post('phase7cA6R2R3R8Recover',static fn(Request $r):array=>$run($r,'recover',static fn($s):array=>$s->recover((string)$r->input('confirmation','')))); $router->dispatch($request);