Commit Graph
158 Commits
Author SHA1 Message Date
F4ilji d4ef7daeb1 feat(dashboard): add page export/import functionality
- ExportPageAction: exports page with SEO and section path as JSON
- ImportPageAction: imports page from JSON, resolves section by slug path
- PageController: export/download and import endpoints
- Routes: GET /{page}/export, POST /import
- Index.vue: export button per row, import button in header (local only)
- Import restricted to APP_ENV=local (backend + frontend check)
2026-08-03 10:21:14 +05:00
F4ilji 3860c5d24c fix(permissions): remove direct user permission sync — roles only
UpdateUserAction and CreateUserAction were calling syncPermissions()
which wrote to model_has_permissions table directly. This meant
permissions persisted even after being removed from the role.

Now users only get permissions through their roles.
2026-07-16 14:09:30 +05:00
F4ilji b7259fdd6f refactor(permissions): replace hardcoded route middleware with auto-resolving CheckDashboardPermission
- New middleware extracts permission name from route name automatically
- dashboard.posts.index → view_any_post
- dashboard.admission-campaigns.store → view_any_admission_campaign
- vikon-updates, integration-credentials excluded from check
- Single middleware on parent group instead of 28 individual ones
2026-07-16 12:05:15 +05:00
F4ilji b8fd42d9f8 fix(security): add permission middleware to dashboard routes
Each route group now requires view_any_{resource} permission.
Without the permission, Spatie returns 403 Forbidden.
VIKON updates and integration-credentials remain unprotected.
2026-07-16 11:57:20 +05:00
F4ilji 4e2105190b fix(tests): replace RefreshDatabase with DatabaseTransactions
- Prevents local DB data loss when running 'php artisan test'
- ViconApiConfigTest uses updateOrCreate to avoid unique constraint
- Delete + Cache::flush for 'not configured' test case
2026-07-10 17:11:27 +05:00
F4ilji 520533ef1f fix(ssr): null-safe campaign access to prevent TypeError during SSR 2026-07-06 14:11:38 +05:00
F4ilji 9bac98d175 fix(logging): route EmailFetchException to email channel instead of app 2026-07-06 13:39:26 +05:00
F4ilji 65f4220932 fix(vikon): store version in file instead of cache to prevent revert after TTL expiry 2026-07-06 13:28:22 +05:00
F4ilji 9943f7ab90 fix error 2026-07-06 12:35:40 +05:00
F4ilji 769b2ff342 feat(logging): migrate remaining files to app channel — all Log:: calls now use domain channels 2026-07-05 23:32:01 +05:00
F4ilji 6bc1b3e921 feat(logging): migrate Education container to education channel 2026-07-05 23:30:30 +05:00
F4ilji cd9b682994 feat(logging): migrate AI tasks to ai channel 2026-07-05 23:29:39 +05:00
F4ilji 49dd578e50 feat(logging): migrate email pipeline to email channel 2026-07-05 23:28:23 +05:00
F4ilji 720aa4d0ae feat(logging): migrate VikonIntegration to vikon channel 2026-07-05 23:13:51 +05:00
F4ilji e3eda2adbc fix(vikon): revert to api_domain for authorize URL, use vikon_core redirect_uri 2026-07-05 22:39:21 +05:00
F4ilji bec37c0e22 fix(vikon): use auth_domain for OAuth authorize URL instead of api_domain 2026-07-05 22:31:51 +05:00
F4ilji a32572f5e8 fix(vikon): remove env override for version, use hardcoded default 2026-07-05 17:44:45 +05:00
F4ilji eb142b2513 refactor(vikon): use Redis cache for version instead of file 2026-07-05 15:11:17 +05:00
F4ilji ad8a4d861b fix(vikon): read version from file and update after core update 2026-07-05 15:06:14 +05:00
F4ilji b0ff3bf397 feat(vikon): cleanup _old/_new artifacts after successful sync 2026-07-05 13:58:00 +05:00
F4ilji 416403b6ce debug(vikon): add detailed logging for ZIP size and FM sync stats 2026-07-05 13:33:13 +05:00
F4ilji b9ff255878 fix(vikon): use cURL streaming for ZIP downloads to avoid memory/timeout issues 2026-07-05 13:26:10 +05:00
F4ilji af86841ebc feat(vikon): improve part update UI with per-part status indicators and Russian messages 2026-07-05 12:53:44 +05:00
F4ilji 08c04c5615 feat(vikon): show disabled modules with warning instead of hiding them 2026-07-05 12:34:44 +05:00
F4ilji efce5be699 fix(vikon): use moduleData['id'] instead of array key, handle additional_access_flags 2026-07-05 12:25:15 +05:00
F4ilji 97c4ab99f1 debug(vikon): log raw API response structure for parts mapping 2026-07-05 12:19:14 +05:00
F4ilji a162154f70 fix(vikon): cast API module IDs to int for Vue compatibility 2026-07-05 12:12:04 +05:00
F4ilji 0a5f99e6ae refactor(vikon): remove hardcoded module IDs and use config everywhere 2026-07-05 11:40:02 +05:00
F4ilji 8cf195efb0 refactor(vikon): fetch parts from VIKON API instead of hardcoded config 2026-07-05 11:32:54 +05:00
F4ilji af1fb094d2 fix(vikon): check HTTP status instead of JSON field for part generation check 2026-07-05 10:55:37 +05:00
F4ilji 3d9982e5be fix(vikon): handle numeric status codes from VIKON API (1=completed, -1=failed) 2026-07-05 10:46:02 +05:00
F4ilji 2bf2f4a861 fix(vikon): send POST data as form-urlencoded to match VIKON API expectations 2026-07-05 10:31:40 +05:00
F4ilji e83cd0109d fix(vikon): correct VIKON API endpoint names for part updates 2026-07-05 10:21:27 +05:00
F4ilji 11b2def517 test(vikon): add validateFileTypes mock to UpdatePartActionTest 2026-07-05 03:02:03 +05:00
F4ilji e8e36156e9 fix(vikon): add file type validation and temp cleanup in UpdatePartAction 2026-07-05 03:01:12 +05:00
F4ilji 059705d60d test(vikon): add feature tests for part update endpoint 2026-07-05 02:58:32 +05:00
F4ilji 1d423adc12 feat(vikon): add part selection UI to Vue dashboard 2026-07-05 02:52:50 +05:00
F4ilji b259809960 feat(vikon): add updatePart endpoint with request validation 2026-07-05 02:50:41 +05:00
F4ilji 15f72b4de1 feat(vikon): add restoreAfterFail for crash recovery in FilesystemTask 2026-07-05 02:47:40 +05:00
F4ilji da90011ad3 feat(vikon): add UpdatePartAction for partial module updates 2026-07-05 02:45:47 +05:00
F4ilji 4764d4e2d9 feat(vikon): add PollPartStatusTask for part update polling 2026-07-05 02:41:23 +05:00
F4ilji a624b83f18 feat(vikon): add atomicSwap to FilesystemTask for crash-safe updates 2026-07-05 02:35:25 +05:00
F4ilji e3511462f7 fix(vikon): skip existing files during FM sync, match original PHP diff behavior
Original vikon_core sync_root_dir.php only downloads files that are
missing locally or have size 0. Added local file size check before
downloading to avoid re-fetching 14GB+ of existing files.
2026-07-04 23:25:59 +05:00
F4ilji b538b4119f fix(vikon): all FM files go to files/ dir, matching original PHP getFsPathByModule
Original vikon_core Path::getFsPathByModule() returns moduleRoot/files/,
not moduleRoot. Root FM files, 3-letter subdirs, and new files all go
under files/ directory. index.html etc come from core ZIP, not FM sync.
2026-07-04 23:02:43 +05:00
F4ilji cccdbbbbd8 fix(vikon): keep ZIP and extracted files in temp after update 2026-07-04 22:41:39 +05:00
F4ilji a33d93e163 fix(vikon): root files to module root, 3-letter dirs to files/{code}/
- UpdateCoreAction: split syncDirFiles into syncRootDir (→module root)
  and syncSubDir (→files/{dirId})
- SyncFilesAction: same split, matching original PHP vikon_core behavior
- index.html, file_stubs/ etc go to module root
- 3-letter FM codes (eib, eid, rir) go inside files/
2026-07-04 22:40:30 +05:00
F4ilji a7d0628a13 fix(vikon): use module root as FM sync base path instead of files/ subdir
Root files (index.html, file_stubs/) and non-3-letter directories now go
to module root where VIKON expects them, not into files/ subdirectory.
dir_name from FM API is relative to module root.
2026-07-04 22:31:10 +05:00
F4ilji bf3bcc4eca fix(vikon): revert syncDirFiles - keep 3-letter dirIds as subdirectories 2026-07-04 22:18:20 +05:00
F4ilji c4314e2f43 fix(vikon): use getFileByIdentityInfo dir_name for correct file paths 2026-07-04 22:15:59 +05:00
F4ilji d7c9de2bd6 fix(vikon): restore syncDirFiles subdirs - files go to files/{dirId}/ 2026-07-04 21:55:29 +05:00