From 49b6b3727777216c87e48b0d37c29e5b6b6babae Mon Sep 17 00:00:00 2001 From: WLTBAgent Date: Sun, 22 Feb 2026 06:56:57 +0000 Subject: [PATCH] Fixes: Simplify PageController, fix config API, update deployment package (2026-02-17) - Removed service dependencies from PageController constructor - Fixed AdminController config API signatures - Cleaned up Application.php resource loading - Updated template with proper resource includes - Simplified routes.php - Reduced analyticshub.zip from 50KB to 27KB - Status: Fixed and ready for redeployment --- STATUS.md | 51 +++++++++++++- analyticshub.zip | Bin 50008 -> 26827 bytes analyticshub/appinfo/Application.php | 5 -- analyticshub/appinfo/info.xml | 2 +- analyticshub/appinfo/routes.php | 6 +- .../lib/Controller/AdminController.php | 22 +++---- .../lib/Controller/PageController.php | 62 ++++++++---------- analyticshub/templates/admin.php | 5 +- 8 files changed, 94 insertions(+), 59 deletions(-) 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 e662a5cf98732734e83b8b030c70c3db2ee4c123..799db1f6f6b412627c507abbe830522362d03aac 100644 GIT binary patch delta 16356 zcmZv@WmH^Svo4IgI|O%kcM0z9?(Qy)6P(bvL(mZ1-GT>qcXxNVWS?`tbM}3|AFJ0G z-BmT`s?jx9$@46RgO5&uCg9b*tCztc9k?j#dEKVcFfXcWSfHiGH#T^M0z=5jV4F!K#Z*Jjl>D=Z$&{mv-TZHf#n7YsZoc?jN9OzmT;Md4s zhMB~sABf{*c^K=K!#w_RHfH%{Sq{=;ncl?2rn#zbxAhHUnI7k+6kvbwmPS`6vDw^I zDC$i({ZbB|hUL-jesO>qsE{OX0Pp2({L zX$n|Fdp1`^%))WO5a|z7(_{`NfQk4qPpuEwgje8W-E`lM)-Uy0Q*7A0Jz1UbQLoT) zOD$)4Pjixq254N|h)vMWdYu(HEXZ9-Q51XFuNcPbKy74boVAbTQ9#&GkZ}$a*P>IR zq2-uLjFtVAdK(7QsH%dvVM!ttUd}r^A3tBmHVkOEU@fZ8#4RvDRgJ}E-G6q`a~!x= z&QJqG^d^hw^QpnTl?575c-Lk41=1I8M^3fNQW_Lx0OI++U^4jA?O?XlWqs$ti>-6X z_M@pY$a<(^>~z&zcD)ELhlm4jT@N`6qlFSA>)C{VY*$-eP} z!YAbso%DcPPT7n=>X=Gs28HD=>^vuiphC3FSaGTaaDD@ zac@!6B*9DmX^$lYI$5{&;YP0FYZJ2B_y%u&MPy!tlqgWU>9KC7EzDZj-Ug#7`G8m5 zUC4x;)e`W;xfaieM=N*E6woLO>MZT4h$?y^aQ#tg(VbIXUj@(dwx))SwU4Btlr0a* zSU?4;jY&CI=Lvg!o-vI>AljFriK=*zm0z;dfO((0R6SHwXqV+k! zCua~LfhCuw#s^{40iL+*?9`=vVJ^=~*c~D1qt;HY3CnbYO4BV}l#WAW5bc=8UJPi! zHCNuTOgk>E!j7aF-Izw_PA-cmMtoB`5FhhHUm>l2%ft&iA=tlsn=y>(0Y!Yff^Sdh zw~X?jA;ROeRqWQpQEcvtxh4qEd8WBPkK??($Z8CPRSp=oJ~heqO}($7y`lFNp)~~2 z+b62SwAzPE{&>a)!ds{zNkl2>MW^voLw_Fa01TkL1sS-SG7xx!tN^H>cG@2YXTt`U z&}Kv*O^$)uy`c*h%J@P&V3VWeb3MXDA%iE2;2Yf3(jb$ln)s7EH>Caw<1`uM;jyt< zo@|61J!~(MCu0v;QXv9K0W2wW7~*#&caa7(&GRWCU)*3*&!`PJ2h|oUPJ2iE9*+_^!tYHS|5YT zY=k<@Ww?b8Ovx~lBUu7{?W1T$WNd1S!9AvW=sARrm9dS~1iuyKcAc6bCxr`oI&tbTHsAoiNM?*I(8~!$1d&%! zE}*eY1dZVZLDLyAQdipTqaC2K$}xVkNf{Iq1xxeI*z}+~o})%FC=o1S?zZ0l#Hyq{ zwxs070!KmY+Se14VMQY4Xoxu}0M}%6_MKQ^Ft#|J$*$$!k=Aa%m9Z_Vi9L+fq`)>v zUNt~-unDQ3<7oyQwWNsDwfoGc)~em#Tkg(vEtM#odpaHZ70HeZttRH?EzW#dokGPb zv_z{y9=La|3)`S)jdkD3MdLM5)Kl2uE~fIIrr|mjF|yA>D|dyVEj0t`!TY%bg7&`M zM$X+TM}I?FGBFOnqX~`}N+@z=j3^hYkQnZ!tbB_LuX)uQWn8#Drqt+6o2C;CIp>Jfq6D6H4&NC) z4mz{0e|^)FMgSYAA~NLz$0b2!VD=PNm>4?d@u(CJX|x)iv#j9OUwf)$^G*z8IWxJ@ zU8HGNra1-3R60*St_{@E7+SWVh_@Z%NpvVy83Lab|BR8Bq2!ApmK%0D>9N)R*{5_V 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 literal 50008 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

#JAPFOG3!vMM6$`xIbdM;qZoow9}e1|Q0x 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 NzZiJ(p!skSK9yp 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')])); ?> -