appName = $appName; $this->request = $request; $this->config = $config; } /** * Index page - render admin UI * * @NoAdminRequired * @NoCSRFRequired */ public function index(): TemplateResponse { // Load saved configuration $googleClientId = $this->config->getAppValue(Application::APP_NAME, 'google_client_id', ''); $googleClientSecret = '•••'; // Masked for display $anthropicApiKey = '••••••••'; // Masked for display $isConfigured = !empty($googleClientId) && !empty($this->config->getAppValue(Application::APP_NAME, 'anthropic_api_key', '')); return new TemplateResponse($this->appName, 'admin', [ 'app_name' => $this->appName, 'version' => Application::APP_VERSION, 'is_configured' => $isConfigured, 'google_client_id' => $googleClientId, 'google_client_secret_masked' => $googleClientSecret, 'anthropic_api_key_masked' => $anthropicApiKey, ]); } /** * Save configuration * * @NoAdminRequired * @NoCSRFRequired */ public function save(): JSONResponse { $params = $this->request->getParams(); // Validate required fields if (!isset($params['google_client_id']) || empty($params['google_client_id'])) { return new JSONResponse([ 'success' => false, 'error' => 'Google Client ID is required' ]); } if (!isset($params['google_client_secret']) || empty($params['google_client_secret'])) { return new JSONResponse([ 'success' => false, 'error' => 'Google Client Secret is required' ]); } if (!isset($params['anthropic_api_key']) || empty($params['anthropic_api_key'])) { return new JSONResponse([ 'success' => false, 'error' => 'Anthropic API Key is required' ]); } try { // Save configuration $this->config->setAppValue(Application::APP_NAME, 'google_client_id', $params['google_client_id']); $this->config->setAppValue(Application::APP_NAME, 'google_client_secret', $params['google_client_secret']); $this->config->setAppValue(Application::APP_NAME, 'anthropic_api_key', $params['anthropic_api_key']); // Check if now configured $isConfigured = !empty($params['google_client_id']) && !empty($params['anthropic_api_key']); return new JSONResponse([ 'success' => true, 'data' => [ 'is_configured' => $isConfigured, 'message' => 'Configuration saved successfully' ] ]); } catch (\Exception $e) { return new JSONResponse([ 'success' => false, 'error' => $e->getMessage() ]); } } /** * Load configuration * * @NoAdminRequired * @NoCSRFRequired */ public function load(): JSONResponse { try { // Load configuration $googleClientId = $this->config->getAppValue(Application::APP_NAME, 'google_client_id', ''); $googleClientSecret = ''; // Don't expose secret $anthropicApiKey = ''; // Don't expose secret $isConfigured = !empty($googleClientId) && !empty($this->config->getAppValue(Application::APP_NAME, 'anthropic_api_key', '')); return new JSONResponse([ 'success' => true, 'data' => [ 'google_client_id' => $googleClientId, 'google_client_secret_masked' => '•••', // Masked 'anthropic_api_key_masked' => '••••••••', // Masked 'is_configured' => $isConfigured, ] ]); } catch (\Exception $e) { return new JSONResponse([ 'success' => false, 'error' => $e->getMessage() ]); } } }