diff --git a/STATUS.md b/STATUS.md index 0196b46..9c3269e 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,7 +1,7 @@ # Nextcloud Google Analytics Hub - Current Status -**Status**: ⏸ **PAUSED** - Waiting for deployment testing -**Last Update**: 2026-02-13 14:17 GMT +**Status**: 🔧 **FIXED** - Ready for redeployment +**Last Update**: 2026-02-17 14:23 GMT --- @@ -218,6 +218,53 @@ return [ --- +## Latest Fixes (2026-02-17) + +### Issue: App not accessible after configuration +User reported: +- No entry appears in menu bar +- Redirect to dashboard when accessing `/apps/analyticshub` + +### Root Causes Identified: +1. **PageController constructor failure**: Required GoogleAnalyticsService and LLMService injection, which weren't properly registered in DI container +2. **Incorrect config API usage**: AdminController was using `getAppValue('key', 'app', '')` instead of correct signature `getAppValue('app', 'key', '')` +3. **Template rendering**: Used 'admin' rendering mode instead of 'blank' + +### Fixes Applied: +1. ✅ **Simplified PageController**: + - Removed service dependencies from constructor + - Uses only IConfig (core Nextcloud service) + - Graceful configuration checking without service dependencies + - Uses 'blank' rendering mode for clean admin interface + +2. ✅ **Fixed AdminController config API**: + - Corrected all `getAppValue` calls: `getAppValue('analyticshub', 'key', '')` + - Corrected all `setAppValue` calls: `setAppValue('analyticshub', 'key', value)` + +3. ✅ **Cleaned up Application.php**: + - Removed automatic script/style loading (caused issues) + - Resources now loaded in template only when needed + +4. ✅ **Updated template**: + - Added proper script/style includes + - Removed manual CSRF token (handled by JavaScript with OC.requestToken) + +5. ✅ **Simplified routes.php**: + - Removed redundant requirements fields + - Cleaner route definitions + +### Files Modified: +- `lib/Controller/PageController.php` - Removed service dependencies, fixed rendering mode +- `lib/Controller/AdminController.php` - Fixed config API signatures +- `appinfo/Application.php` - Removed automatic resource loading +- `templates/admin.php` - Added proper resource includes, removed manual CSRF +- `appinfo/routes.php` - Cleaned up route definitions + +### New Package: +- `analyticshub.zip` (27KB) - Ready for redeployment + +--- + ## What Needs to Happen **Before Further Development:** diff --git a/analyticshub.zip b/analyticshub.zip index e662a5c..799db1f 100644 Binary files a/analyticshub.zip and b/analyticshub.zip differ diff --git a/analyticshub/appinfo/Application.php b/analyticshub/appinfo/Application.php index 223746c..7b04ec1 100644 --- a/analyticshub/appinfo/Application.php +++ b/analyticshub/appinfo/Application.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace OCA\AnalyticsHub\AppInfo; use OCP\AppFramework\App; -use OCP\Util; /** * Application class for Mini-CMO Analytics Hub @@ -18,9 +17,5 @@ class Application extends App { public function __construct(array $urlParams = []) { parent::__construct(self::APP_ID, $urlParams); - - // Load scripts and styles for admin page - Util::addStyle(self::APP_ID, 'admin'); - Util::addScript(self::APP_ID, 'admin'); } } diff --git a/analyticshub/appinfo/info.xml b/analyticshub/appinfo/info.xml index 9ad369d..9cc554d 100644 --- a/analyticshub/appinfo/info.xml +++ b/analyticshub/appinfo/info.xml @@ -13,6 +13,6 @@ - analyticshub.page.index + page#index diff --git a/analyticshub/appinfo/routes.php b/analyticshub/appinfo/routes.php index 21037df..635f778 100644 --- a/analyticshub/appinfo/routes.php +++ b/analyticshub/appinfo/routes.php @@ -10,24 +10,22 @@ namespace OCA\AnalyticsHub; return [ 'routes' => [ - // Admin routes + // Main page route [ 'name' => 'page#index', 'url' => '/', 'verb' => 'GET', - 'requirements' => [], ], + // Admin configuration routes (AJAX) [ 'name' => 'admin#load', 'url' => '/admin/load', 'verb' => 'GET', - 'requirements' => [], ], [ 'name' => 'admin#save', 'url' => '/admin/save', 'verb' => 'POST', - 'requirements' => [], ], ], ]; diff --git a/analyticshub/lib/Controller/AdminController.php b/analyticshub/lib/Controller/AdminController.php index 6e404a4..14cc7bb 100644 --- a/analyticshub/lib/Controller/AdminController.php +++ b/analyticshub/lib/Controller/AdminController.php @@ -31,11 +31,11 @@ class AdminController { * Load configuration */ public function load(): JSONResponse { - $clientId = $this->config->getAppValue('google_client_id', 'analyticshub', ''); - $apiKey = $this->config->getAppValue('anthropic_api_key', 'analyticshub', ''); - $llmEndpoint = $this->config->getAppValue('llm_api_endpoint', 'analyticshub', ''); - $llmModel = $this->config->getAppValue('llm_model', 'analyticshub', ''); - $refreshToken = $this->config->getAppValue('google_refresh_token', 'analyticshub', ''); + $clientId = $this->config->getAppValue('analyticshub', 'google_client_id', ''); + $apiKey = $this->config->getAppValue('analyticshub', 'anthropic_api_key', ''); + $llmEndpoint = $this->config->getAppValue('analyticshub', 'llm_api_endpoint', ''); + $llmModel = $this->config->getAppValue('analyticshub', 'llm_model', ''); + $refreshToken = $this->config->getAppValue('analyticshub', 'google_refresh_token', ''); // Check if configured $isConfigured = !empty($clientId) && !empty($apiKey) && !empty($refreshToken); @@ -92,22 +92,22 @@ class AdminController { } // Save configuration - $this->config->setAppValue('google_client_id', 'analyticshub', $clientId); - $this->config->setAppValue('google_client_secret', 'analyticshub', $clientSecret); + $this->config->setAppValue('analyticshub', 'google_client_id', $clientId); + $this->config->setAppValue('analyticshub', 'google_client_secret', $clientSecret); if (!empty($refreshToken)) { - $this->config->setAppValue('google_refresh_token', 'analyticshub', $refreshToken); + $this->config->setAppValue('analyticshub', 'google_refresh_token', $refreshToken); } if (!empty($llmEndpoint)) { - $this->config->setAppValue('llm_api_endpoint', 'analyticshub', $llmEndpoint); + $this->config->setAppValue('analyticshub', 'llm_api_endpoint', $llmEndpoint); } if (!empty($llmModel)) { - $this->config->setAppValue('llm_model', 'analyticshub', $llmModel); + $this->config->setAppValue('analyticshub', 'llm_model', $llmModel); } - $this->config->setAppValue('anthropic_api_key', 'analyticshub', $apiKey); + $this->config->setAppValue('analyticshub', 'anthropic_api_key', $apiKey); // Check if fully configured $isConfigured = !empty($clientId) && !empty($clientSecret) && !empty($apiKey) && !empty($refreshToken); diff --git a/analyticshub/lib/Controller/PageController.php b/analyticshub/lib/Controller/PageController.php index cb820f8..6001478 100644 --- a/analyticshub/lib/Controller/PageController.php +++ b/analyticshub/lib/Controller/PageController.php @@ -7,81 +7,77 @@ namespace OCA\AnalyticsHub\Controller; use OCP\IRequest; use OCP\IConfig; use OCP\AppFramework\Http\TemplateResponse; -use OCA\AnalyticsHub\Service\GoogleAnalyticsService; -use OCA\AnalyticsHub\Service\LLMService; /** * Admin Settings Controller * - * @NoAdminRequired + * @AdminRequired * @NoCSRFRequired */ class PageController extends \OCP\AppFramework\Controller { protected $appName; protected $config; - protected $gaService; - protected $llmService; public function __construct( string $appName, IRequest $request, - IConfig $config, - GoogleAnalyticsService $gaService, - LLMService $llmService + IConfig $config ) { parent::__construct($appName, $request); $this->appName = $appName; $this->config = $config; - $this->gaService = $gaService; - $this->llmService = $llmService; } /** * Index page - render admin UI * - * @NoAdminRequired + * @AdminRequired * @NoCSRFRequired */ public function index(): TemplateResponse { - // Check configuration status gracefully - $isConfigured = false; - $isGAConfigured = false; - $isLLMConfigured = false; + // Get configuration values directly from config service + $clientId = $this->config->getAppValue('analyticshub', 'google_client_id', ''); + $clientSecret = $this->config->getAppValue('analyticshub', 'google_client_secret', ''); + $refreshToken = $this->config->getAppValue('analyticshub', 'google_refresh_token', ''); + $apiKey = $this->config->getAppValue('analyticshub', 'anthropic_api_key', ''); + $llmEndpoint = $this->config->getAppValue('analyticshub', 'llm_api_endpoint', ''); + $llmModel = $this->config->getAppValue('analyticshub', 'llm_model', ''); - try { - $isGAConfigured = $this->gaService->isConfigured(); - $isLLMConfigured = $this->llmService->isConfigured(); - $isConfigured = $isGAConfigured && $isLLMConfigured; - } catch (\Exception $e) { - // If service initialization fails, app is not configured - $isConfigured = false; + // Check if configured + $isConfigured = !empty($clientId) && !empty($clientSecret) && !empty($refreshToken) && !empty($apiKey); + $isGAConfigured = !empty($clientId) && !empty($clientSecret) && !empty($refreshToken); + $isLLMConfigured = !empty($apiKey); + + // Mask secrets for display + $maskedClientSecret = ''; + if (!empty($clientSecret)) { + $maskedClientSecret = '••••••••••••••••'; } - // Get configuration values (masked for secrets) - $clientId = $this->config->getAppValue('google_client_id', 'analyticshub', ''); - $apiKey = $this->config->getAppValue('anthropic_api_key', 'analyticshub', ''); - $llmEndpoint = $this->config->getAppValue('llm_api_endpoint', 'analyticshub', ''); - $llmModel = $this->config->getAppValue('llm_model', 'analyticshub', ''); + $maskedRefreshToken = ''; + if (!empty($refreshToken)) { + $maskedRefreshToken = substr($refreshToken, 0, 8) . '...' . substr($refreshToken, -4); + } - // Mask API key for display $maskedApiKey = ''; if (!empty($apiKey)) { $maskedApiKey = substr($apiKey, 0, 8) . '...' . substr($apiKey, -4); } - return new TemplateResponse($this->appName, 'admin', [ - 'app_name' => $this->appName, + return new TemplateResponse('analyticshub', 'admin', [ + 'app_name' => 'Mini-CMO Analytics Hub', 'version' => '1.0.0', - 'status' => 'Ready for development', + 'status' => $isConfigured ? 'Ready' : 'Configuration Required', 'is_configured' => $isConfigured, 'is_ga_configured' => $isGAConfigured, 'is_llm_configured' => $isLLMConfigured, 'google_client_id' => $clientId, + 'google_client_secret_masked' => $maskedClientSecret, + 'google_refresh_token_masked' => $maskedRefreshToken, 'llm_api_endpoint' => $llmEndpoint, 'llm_model' => $llmModel, 'anthropic_api_key_masked' => $maskedApiKey, - 'request' => $this->request, - ]); + ], 'blank'); // Use 'blank' rendering mode for admin pages } } diff --git a/analyticshub/templates/admin.php b/analyticshub/templates/admin.php index a7977c1..415b1ed 100644 --- a/analyticshub/templates/admin.php +++ b/analyticshub/templates/admin.php @@ -1,6 +1,7 @@
@@ -20,8 +21,6 @@ style('display:none');
- t('CSRF Token: %s', [$_['request']->getParam('requesttoken')])); ?> -