Commit Graph
100 Commits
Author SHA1 Message Date
F4ilji 9ac4f89e36 feat(jenkins): add dashboard:sync-permissions after migrations
Ensures all dashboard permissions exist on every deploy.
Command is idempotent — safe to run repeatedly.
2026-07-11 14:22:05 +05:00
F4ilji c6ca3258c1 feat(permissions): add dashboard:sync-permissions artisan command
Auto-discovers all dashboard permissions from resource/prefix matrix,
creates missing ones in DB, syncs to super_admin and admin roles.
Run on production after deploy or when adding new menu sections.
2026-07-11 14:17:11 +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 c59a08b3a0 test(vikon): add live API integration tests
- getNaprs, getPrograms, getProgramByUuid — real API calls
- EducationalProgramService cross-check
- invalid token rejection via Http::fake
2026-07-10 16:55:30 +05:00
F4ilji 0ea2b7d9ef test(vikon): add ViconApiConfig unit tests
- token returns value from DB
- apiUrl returns value from DB
- apiUrl falls back to constant when not in payload
- token throws RuntimeException when not configured
- token throws when payload is empty
- inactive credential is ignored
2026-07-10 16:51:34 +05:00
F4ilji 73a0a6fe9c feat(vikon): extract API URL from hardcoded to integration_credentials
- Rename ViconApiToken → ViconApiConfig with token() and apiUrl()
- Replace 9 hardcoded db-nica.ru URLs with dynamic apiUrl()
- Payload now stores both token and api_url with fallback
2026-07-10 16:47:18 +05:00
F4ilji 7748b05547 feat(vikon): move API token from .env to integration_credentials
- Rename VICON_TOKEN → VIKON_API_TOKEN in .env and config
- Add ViconApiToken service reading from integration_credentials table
- Update 3 Vicon services to use ViconApiToken instead of config()
- Config/env kept as fallback for clean migration
2026-07-10 16:43:09 +05:00
F4ilji 8db442a34a Revert "fix(ssr): add Vue lifecycle guard plugin to suppress browser API errors in SSR hooks"
This reverts commit bb74bb48ba.
2026-07-07 11:22:32 +05:00
F4ilji bb74bb48ba fix(ssr): add Vue lifecycle guard plugin to suppress browser API errors in SSR hooks 2026-07-06 21:18:33 +05:00
F4ilji 6db62d9961 fix(ssr): suppress lifecycle hook errors (nextSibling null) at process level to prevent SSR crashes 2026-07-06 21:16:12 +05:00
F4ilji 63b71b87df fix(ssr): always return {head,body} from createInertiaApp — .then() fallback for undefined resolve 2026-07-06 18:59:24 +05:00
F4ilji f575325fa7 fix(ssr): remove window polyfill that broke Inertia SSR detection (typeof window check) 2026-07-06 18:53:06 +05:00
F4ilji 5fddb97cbf fix(ssr): return empty string on SSR failure instead of throwing to prevent undefined response 2026-07-06 18:30:26 +05:00
F4ilji 778ea67cb4 fix(ssr): add addEventListener/removeEventListener to document and window polyfills 2026-07-06 18:22:22 +05:00
F4ilji 48ab0b384e fix(ssr): add getElementById and other DOM methods to document polyfill 2026-07-06 18:05:35 +05:00
F4ilji 4c0152ae0f fix(ssr): polyfill localStorage/sessionStorage, guard BasicListBadge filters prop, remove this. from template 2026-07-06 17:57:28 +05:00
F4ilji eda69f4e37 fix(ssr): polyfill IntersectionObserver for Node.js SSR runtime 2026-07-06 17:53:46 +05:00
F4ilji 520533ef1f fix(ssr): null-safe campaign access to prevent TypeError during SSR 2026-07-06 14:11:38 +05:00
F4ilji 3ee875a6db fix(handler): fallback to HTML when Vite manifest missing during error rendering 2026-07-06 13:41:52 +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 9f4dfd9bfc ci: optimize Jenkinsfile — parallel pre-deploy, npm ci, fix rollback composer path 2026-07-06 12:39:40 +05:00
F4ilji 9943f7ab90 fix error 2026-07-06 12:35:40 +05:00
F4ilji b454c1ce97 fix(ssr): add null-check for breadcrumbs.page in Page.vue to prevent TypeError during SSR 2026-07-05 23:51: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 41b00fcdae feat(logging): migrate VK API jobs and services to vk channel 2026-07-05 23:26:41 +05:00
F4ilji 720aa4d0ae feat(logging): migrate VikonIntegration to vikon channel 2026-07-05 23:13:51 +05:00
F4ilji dfe8de0680 feat(logging): add 6 domain-specific daily channels to config 2026-07-05 23:11:27 +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 fd7de347d4 fix: null-safe role check, enable SQLite test DB, improve TinyMCE paste handling 2026-07-05 22:34:04 +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 a372f725cd fix(ssr): embed Ziggy routes as fallback for SSR context
ZiggyVue needs routes in its config, but page.props.ziggy from the
server may not carry them in the SSR worker. Importing the static
Ziggy config ensures routes are always available.
2026-07-05 21:56:51 +05:00
F4ilji 09771bf8ad fix(ssr): remove conflicting RouteMixin that caused 'Cannot read properties of undefined (reading index)'
RouteMixin received the full Inertia page object instead of page.props,
producing a Ziggy config without routes. ZiggyVue already provides the
route() function with the correct config, so the duplicate mixin is
unnecessary.
2026-07-05 21:47:03 +05:00
F4ilji a80a60bdbe feat(vikon): redesign UI with update all button, specialized icons, and manual ZIP upload 2026-07-05 18:00:49 +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 a18765aafa feat(vikon): merge update buttons into single flow with all parts selected by default 2026-07-05 13:10:49 +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 9a9521c570 fix(vikon): initialize selectedParts arrays to prevent crash on checkbox click 2026-07-05 11:11:24 +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 d83364432e feat(vikon): replace part select with checkboxes for multi-selection 2026-07-05 09:55:45 +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 514123a19f feat(vikon): add parts config for partial updates 2026-07-05 02:42:51 +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 982e80027d docs: add partial updates implementation plan 2026-07-05 02:31:27 +05:00
F4ilji 5c081261b0 docs: add partial updates design spec for VikonIntegration module 2026-07-05 02:29:18 +05:00
F4ilji cc69c3566b docs: add dashboard error page final report and plan 2026-07-05 01:21:39 +05:00
F4ilji df6110adf8 feat(dashboard): modify exception handlers to render DashboardError for dashboard routes 2026-07-05 01:19:04 +05:00
F4ilji a4fef0bb3d feat(dashboard): add DashboardError.vue with full error context display 2026-07-05 01:18:04 +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
F4ilji 241ac576fe fix(vikon): revert syncDirFiles - save files directly in files/ without subdirs 2026-07-04 21:52:21 +05:00
F4ilji 997ef6d483 fix(vikon): syncDirFiles saves to correct subdirectory, increase timeouts to 600s 2026-07-04 21:49:17 +05:00
F4ilji b115cb93fd fix(vikon): increase nginx fastcgi_read_timeout to 600s, PHP set_time_limit 600 2026-07-04 21:40:51 +05:00
F4ilji 204e31c06d fix(vikon): show detailed error message with HTTP status code 2026-07-04 21:33:20 +05:00
F4ilji 87732720ef feat(vikon): merge core update + FM sync into single Update button 2026-07-04 21:25:29 +05:00
F4ilji 20382da0bc fix(vikon): rewrite SyncFilesAction - always download, add logging 2026-07-04 21:11:00 +05:00
F4ilji 0811c4f1fc fix(vikon): add parameter to SyncFilesAction singleton 2026-07-04 20:55:14 +05:00
F4ilji 8e5f26da8d feat(vikon): add file sync from VIKON file manager (FM) 2026-07-04 20:41:49 +05:00
F4ilji e64f9cca83 fix(vikon): save ABITUR API response in temp for reference 2026-07-04 20:26:25 +05:00
F4ilji b4829492e5 fix(vikon): keep ZIP archive in temp after update 2026-07-04 20:17:33 +05:00
F4ilji d358e6fdb0 fix(vikon): keep downloaded files in temp after update 2026-07-04 20:16:56 +05:00
F4ilji b6140b77f5 vsoko conf changes 2026-07-04 20:03:19 +05:00
F4ilji b94e0aad87 fix(vikon): replace router.reload with alert after update success 2026-07-04 19:37:49 +05:00
F4ilji e0cf362433 fix(vikon): create target directories before rename in syncFiles 2026-07-04 19:29:50 +05:00
F4ilji 0097a803b4 fix(vikon): sync from extracted subdirectory inside ZIP 2026-07-04 19:21:32 +05:00
F4ilji 7d6b1a2342 fix(vikon): return actual error message in updateModule response 2026-07-04 19:16:43 +05:00
F4ilji 13df1c3a64 fix(vikon): simplify syncFiles - just overwrite, no backups or deletes 2026-07-04 19:11:25 +05:00
F4ilji 93bd3963bf fix(vikon): use rename() instead of copy() for syncFiles - atomic, no extra disk space 2026-07-04 19:09:13 +05:00
F4ilji e502225e9c fix(vikon): clean up corrupted CheckAccessAction file 2026-07-04 19:01:05 +05:00
F4ilji 44abdb471f fix(vikon): check writability only for module dirs (sveden, abitur, vsoko) 2026-07-04 18:46:23 +05:00