371 lines
34 KiB
Markdown
371 lines
34 KiB
Markdown
# Local Administration API Inventory
|
|
|
|
## Scope and method
|
|
|
|
This is the local baseline for the GVA parity audit. It inventories every
|
|
route registered by `internal/server/gin.go`, excluding no local route from the
|
|
inventory. The current route-contract test asserts **178 registered Gin
|
|
routes**, including `GET /health` and the Swagger wildcard. A configured
|
|
`routerPrefix` is prepended to every path below at runtime. Local-file
|
|
downloads are handled by the `NoRoute -> serveLocalStorage` fallback, so their
|
|
`GET`/`HEAD` URL is functional but intentionally does **not** appear in this
|
|
registered-route count, `engine.Routes()`, or `/api/syncApi` input. The local
|
|
dynamic Swagger is likewise built only from registered routes; the baseline
|
|
GVA's pre-generated Swagger also omits the static wildcard. The GVA reference
|
|
does register that wildcard in `Routes()`, so the count is not proof that the
|
|
two route tables are identical; see `parity-crosscut.md`.
|
|
|
|
Source of truth:
|
|
|
|
- registration: `internal/server/router/*.go` and `internal/server/gin.go`;
|
|
- handler-to-service calls: `internal/server/handler/*.go`;
|
|
- dependency assembly: `cmd/kratos-admin/wire_gen.go`;
|
|
- frontend comparison: `web/src/api/**/*.js`, `web/src/modules/**/api/*.js`,
|
|
and the direct SSE use in `web/src/view/systemTools/timedTask/useAlertStream.js`.
|
|
|
|
Unless marked `public`, routes are behind JWT authentication, forced-password
|
|
change protection, Casbin/data-scope access control, and the normal error/audit
|
|
middleware. `OK` means the standard JSON success envelope; `Page<T>` means
|
|
`{ list, total, page, pageSize }`. Download and SSE rows state their special
|
|
wire result. The `Call` column gives the exact handler and service entrypoint;
|
|
the module pipeline directly below it completes the service/biz/data chain.
|
|
|
|
`FE` means a matching frontend request exists. `FE-direct` means the browser
|
|
calls it directly rather than via an `api/*.js` function. `--` is a registered
|
|
backend route without a current frontend call site.
|
|
|
|
## Architecture map
|
|
|
|
| Local area | Handler service | Biz usecase | Repository/data implementation |
|
|
| --- | --- | --- | --- |
|
|
| API, Casbin | `APIService` | `APIUsecase` | `APIRepo` -> `data.apiRepo` |
|
|
| User/navigation | `UserService`, `AuthService`, `TokenService` | `UserUsecase`, `AuthenticationUsecase`, `TokenUsecase` | `UserRepo`, `APITokenRepo` -> `data.userRepo`, `data.apiTokenRepo` |
|
|
| Authority | `AuthorityService`, `PermissionService` | `AuthorityUsecase`, `PermissionUsecase` | `AuthorityAccessRepo`, `PermissionRepo` -> `data.authorityAccessRepo`, `data.permissionRepo` |
|
|
| Menu | `MenuService` | `MenuUsecase` | `MenuRepo` -> `data.menuRepo` |
|
|
| Organisation | `DepartmentService`, `PositionService` | `DepartmentUsecase`, `PositionUsecase` | `DepartmentRepo`, `PositionRepo` -> `data.departmentRepo`, `data.positionRepo` |
|
|
| Dictionary | `DictionaryService` | `DictionaryUsecase` | `DictionaryRepo` -> `data.dictionaryRepo` |
|
|
| Parameters | `ParameterService` | `ParameterUsecase` | `ParameterRepo` -> `data.parameterRepo` |
|
|
| Runtime/system/security | `SystemConfigService`, `SecurityService` | `SystemConfigUsecase`, `SecurityUsecase` | `InitializationRepo`, `SecurityRepo` -> `data.initializationRepo`, `data.securityRepo`; runtime settings/config store |
|
|
| Audit/logs/errors | `AuditService`, `LogViewerService` | `AuditUsecase`, `LogViewerUsecase` | `AuditQueryRepo`, `LogFileRepo` -> `data.auditRepo`, `data.logFileRepo` |
|
|
| Export/version | `ExportService`, `VersionService` | `ExportUsecase`, `VersionUsecase` | `ExportRepo`, `VersionRepo` -> `data.exportRepo`, `data.versionRepo`; export token cache |
|
|
| Tasks | `TaskService` | `TaskApplicationUsecase` -> `TaskUsecase` | `TaskRepo` -> `data.taskRepo`; worker scheduler/runtime |
|
|
| Media | `MediaService` | `MediaUsecase` | `MediaRepo` -> `data.mediaRepo`; `FileStorage`, upload sessions |
|
|
| Announcement/email | `AnnouncementService`, `EmailService` | `AnnouncementUsecase`, `EmailUsecase` | `AnnouncementRepo` -> `data.announcementRepo`; `EmailRepo` -> `data.NewEmailRepo(runtime)` |
|
|
|
|
## 1. Bootstrap and public endpoints
|
|
|
|
| Method/path | Visibility | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- | --- |
|
|
| `GET /health` | public | inline Gin handler | none -> `"ok"` | liveness only | -- |
|
|
| `GET /swagger/*any` | public | `registerSwagger` | Swagger UI/document -> HTML/JSON | generated from registered Gin routes | -- |
|
|
| `POST /base/captcha` | public | `Public.Captcha -> SecurityService.Captcha` | captcha config -> captcha payload | cache-backed captcha creation when enabled | FE |
|
|
| `POST /base/login` | public | `Public.Login -> AuthService.Login -> AuthenticationUsecase -> User/Security/Audit repos` | `LoginRequest` -> token/user result | authenticate, issue token, write login audit; apply lockout policy | FE |
|
|
| `POST /init/checkdb` | public | `Public.CheckDatabase -> SystemConfigService.IsInitialized -> SystemConfigUsecase -> InitializationRepo` | none -> initialization status | read DB/init state | FE |
|
|
| `POST /init/initdb` | public | `Public.InitializeDatabase -> SystemConfigService.InitializeRoutes -> SystemConfigUsecase -> InitializationRepo` | `dto.DatabaseInitRequest` + current routes -> OK | initialize schema/seed data and register current routes | FE |
|
|
|
|
## 2. API registry and Casbin policy
|
|
|
|
Pipeline: `API handler -> APIService -> APIUsecase -> APIRepo -> data.apiRepo`.
|
|
The Casbin endpoints share that pipeline because policy-path associations are
|
|
stored and queried through the API repository.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /api/getApiList` | `API.List -> ListAPI` | `APIListRequest(page,pageSize,filters)` -> `Page<API>` | read | FE |
|
|
| `POST /api/getAllApis` | `API.All -> AllAPI` | optional body ignored -> `{apis}` | read non-paginated, strict filtering | FE |
|
|
| `POST /api/createApi` | `API.Create -> CreateAPIRequest` | `APIRequest(path,method,group,description)` -> `{api}` | create API registry row | FE |
|
|
| `POST /api/updateApi` | `API.Update -> UpdateAPIRequest` | `APIRequest` -> OK | update registry row | FE |
|
|
| `POST /api/deleteApi` | `API.Delete -> DeleteAPI` | `{id}` -> OK | delete one API and policy association as repo defines | FE |
|
|
| `DELETE /api/deleteApisByIds` | `API.DeleteByIDs -> DeleteAPIs` | `{ids}` -> OK | batch delete APIs | FE |
|
|
| `POST /api/getApiById` | `API.Find -> FindAPIResponse` | `{id}` -> `{api}` | read | FE |
|
|
| `GET /api/getApiGroups` | `API.Groups -> Groups` | none -> `{groups,apiGroupMap}` | read group metadata | FE |
|
|
| `GET /api/getApiRoles` | `API.Roles -> APIRoleIDs` | `path,method` -> `authorityIds[]` | read role association | FE |
|
|
| `POST /api/setApiRoles` | `API.SetRoles -> SetAPIRoles` | `path,method,authorityIds[]` -> OK | replace API-role association | FE |
|
|
| `GET /api/syncApi` | `API.Sync -> SyncAPIResponses` | live `engine.Routes()` -> sync diff | calculate registry/runtime route diff | FE |
|
|
| `POST /api/ignoreApi` | `API.Ignore -> SetAPIIgnored` | `path,method,flag` -> OK | mark route ignored for sync | FE |
|
|
| `POST /api/enterSyncApi` | `API.ApplySync -> ApplyAPISyncRequest` | selected sync actions -> OK | apply API registry synchronization | FE |
|
|
| `GET /api/freshCasbin` | `API.FreshCasbin` | none -> OK | **public** compatibility no-op; policy is read per authorization decision | FE |
|
|
| `POST /casbin/updateCasbin` | `API.SetPolicyPaths -> SetPolicyPathsRequest` | `authorityId,paths[]` -> OK | replace policy paths for authority | FE |
|
|
| `POST /casbin/getPolicyPathByAuthorityId` | `API.PolicyPaths -> PolicyPathResponses` | `{authorityId}` -> `{paths}` | read policy paths | FE |
|
|
|
|
## 3. Users, session, and navigation
|
|
|
|
User pipeline: `User/Navigation handler -> UserService -> UserUsecase -> UserRepo -> data.userRepo`.
|
|
Authentication paths add `AuthenticationUsecase` with `SecurityUsecase` and
|
|
the audit recorder; logout uses `TokenUsecase -> APITokenRepo`.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /user/getUserList` | `User.List -> ListUsersRequest` | `UserListRequest` -> `Page<User>` | read, data-scope aware | FE |
|
|
| `POST /user/admin_register` | `User.Create -> CreateUserRequest` | `UserRequest` -> `{user}` | create user; password-policy validation | FE |
|
|
| `PUT /user/setUserInfo` | `User.Update -> UpdateUserRequest` | `UserRequest(id,profile)` -> OK | update selected user | FE |
|
|
| `PUT /user/setSelfInfo` | `User.UpdateSelf -> UpdateSelfUser` | authenticated `SelfUserRequest` -> OK | update current user's profile | FE |
|
|
| `DELETE /user/deleteUser` | `User.Delete -> DeleteUser` | `{id}` -> OK | delete user | FE |
|
|
| `POST /user/resetPassword` | `User.ResetPassword -> ResetPassword` | `id,password` -> OK | set another user's password | FE |
|
|
| `POST /user/changePassword` | `User.ChangePassword -> ChangePassword` | current and new passwords -> OK | verify and replace current password | FE |
|
|
| `PUT /user/setSelfSetting` | `User.SetSelfSetting -> SetUserSetting` | current-user UI settings -> OK | persist user settings | FE |
|
|
| `POST /user/setUserAuthorities` | `User.SetAuthorities -> SetUserAuthorities` | `id,authorityIds[]` -> OK | replace user authority groups | FE |
|
|
| `POST /user/setUserAuthority` | `User.SwitchAuthority -> AuthService.SwitchAuthority` | current claims + `authorityId` -> new token/user | switch active authority and issue new token | FE |
|
|
| `GET /user/getUserInfo` | `User.Get -> UserByUUID` | current claims -> `{user}` | read self/authority info | FE |
|
|
| `POST /menu/getMenu` | `Navigation.Menu -> UserService.Menus` | current authority -> menu tree | read authorized navigation | FE |
|
|
| `POST /jwt/jsonInBlacklist` | `Session.Logout -> TokenService.BlacklistToken` | bearer token -> OK | blacklist/revoke token | FE |
|
|
|
|
## 4. Authorities, menus, and button permissions
|
|
|
|
Authority and permissions pipeline: `handler -> AuthorityService/PermissionService ->
|
|
AuthorityUsecase/PermissionUsecase -> AuthorityAccessRepo/PermissionRepo -> data`.
|
|
Menu pipeline: `Menu handler -> MenuService -> MenuUsecase -> MenuRepo -> data.menuRepo`.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /authority/getAuthorityList` | `Authority.List -> Authorities` | none -> authority tree/list | read | FE |
|
|
| `POST /authority/createAuthority` | `Authority.Create -> CreateAuthorityRequest` | authority id/name -> `{authority}` | create authority | FE |
|
|
| `POST /authority/copyAuthority` | `Authority.Copy -> CopyAuthorityRequest` | source + new authority -> `{authority}` | duplicate authority permissions/menu relations | FE |
|
|
| `PUT /authority/updateAuthority` | `Authority.Update -> UpdateAuthorityRequest` | authority fields -> `{authority}` | update authority | FE |
|
|
| `POST /authority/deleteAuthority` | `Authority.Delete -> DeleteAuthority` | `{authorityId}` -> OK | delete authority subject to repo rules | FE |
|
|
| `POST /authority/setRoleUsers` | `Authority.SetUsers -> SetAuthorityUsers` | authority/user ids -> OK | replace authority-user relation | FE |
|
|
| `GET /authority/getUsersByAuthority` | `Authority.Users -> AuthorityUserIDs` | `authorityId` -> `userIds[]` | read relation | FE |
|
|
| `POST /authority/setDataScope` | `Authority.SetDataScope -> SetDataScope` | scope and department ids -> OK | update data-scope and departments | FE |
|
|
| `GET /authority/getDataScopeDepts` | `Authority.DataScopeDepartments -> DataScopeDepartmentIDs` | `authorityId` -> `departmentIds[]` | read custom scope departments | FE |
|
|
| `POST /menu/getMenuList` | `Menu.List -> Tree` | none -> menu tree | read | FE |
|
|
| `POST /menu/getBaseMenuTree` | `Menu.Tree -> Tree` | none -> `{menus}` | read | FE |
|
|
| `POST /menu/addBaseMenu` | `Menu.Create -> Create` | `MenuRequest` -> OK | create menu, parameters/buttons | FE |
|
|
| `POST /menu/updateBaseMenu` | `Menu.Update -> Update` | `MenuRequest` -> OK | update menu | FE |
|
|
| `POST /menu/deleteBaseMenu` | `Menu.Delete -> Delete` | `{id}` -> OK | delete menu and dependent mappings per repo | FE |
|
|
| `POST /menu/getBaseMenuById` | `Menu.Find -> Find` | `{id}` -> `{menu}` | read | FE |
|
|
| `POST /menu/addMenuAuthority` | `Menu.SetAuthorityMenus -> SetAuthorityMenus` | authority + menu ids -> OK | replace authority-menu mapping | FE |
|
|
| `POST /menu/getMenuAuthority` | `Menu.AuthorityMenus -> AuthorityMenus` | `{authorityId}` -> `{menus}` | read mapping | FE |
|
|
| `GET /menu/getMenuRoles` | `Menu.RoleIDs + DefaultRouterRoleIDs` | `menuId` -> `{authorityIds,defaultRouterAuthorityIds}` | read role mapping | FE |
|
|
| `POST /menu/setMenuRoles` | `Menu.SetRoles -> SetRoles` | menu + authority ids -> OK | replace menu-role mapping | FE |
|
|
| `POST /authorityBtn/getAuthorityBtn` | `Permission.Buttons -> SelectedButtons` | authority/menu ids -> selection | read button permission selection | FE |
|
|
| `POST /authorityBtn/setAuthorityBtn` | `Permission.SetButtons -> SetSelectedButtons` | authority/menu/selected -> OK | replace button permission selection | FE |
|
|
| `POST /authorityBtn/canRemoveAuthorityBtn` | `Permission.CanRemoveButton -> CanRemoveButton` | menu button id -> boolean | dependency/usage check | FE |
|
|
|
|
## 5. Departments and positions
|
|
|
|
Department pipeline: `Organization handler -> DepartmentService -> DepartmentUsecase ->
|
|
DepartmentRepo -> data.departmentRepo`. Position rows substitute the matching
|
|
`Position*` components and `data.positionRepo`.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /department/getDepartmentList` | `Organization.ListDepartments -> Departments` | filter body -> department tree/list | read | FE |
|
|
| `POST /department/createDepartment` | `CreateDepartment -> DepartmentService.Create` | `DepartmentRequest` -> OK | create department | FE |
|
|
| `PUT /department/updateDepartment` | `UpdateDepartment -> Update` | `DepartmentRequest` -> OK | update department | FE |
|
|
| `DELETE /department/deleteDepartment` | `DeleteDepartment -> Delete` | `{id}` -> OK | delete department | FE |
|
|
| `GET /department/findDepartment` | `FindDepartment -> Department` | `id` -> department | read | FE |
|
|
| `GET /department/getDepartmentUsers` | `DepartmentUsers -> UserIDs` | `departmentId` -> `userIds[]` | read membership | FE |
|
|
| `POST /department/setDepartmentUsers` | `SetDepartmentUsers -> SetUsers` | department/user ids -> OK | replace department membership | FE |
|
|
| `POST /user/setUserDepartments` | `SetUserDepartments -> DepartmentService.SetUserDepartments` | user + department ids -> OK | replace user's departments | FE |
|
|
| `POST /position/getPositionList` | `ListPositions -> Positions` | filter body -> position list | read | FE |
|
|
| `POST /position/createPosition` | `CreatePosition -> PositionService.Create` | `PositionRequest` -> OK | create position | FE |
|
|
| `PUT /position/updatePosition` | `UpdatePosition -> Update` | `PositionRequest` -> OK | update position | FE |
|
|
| `DELETE /position/deletePosition` | `DeletePosition -> Delete` | `{id}` -> OK | delete position | FE |
|
|
| `GET /position/findPosition` | `FindPosition -> Position` | `id` -> position | read | FE |
|
|
| `GET /position/getPositionUsers` | `PositionUsers -> UserIDs` | `positionId` -> `userIds[]` | read membership | FE |
|
|
| `POST /position/setPositionUsers` | `SetPositionUsers -> SetUsers` | position/user ids -> OK | replace position membership | FE |
|
|
| `POST /user/setUserPositions` | `SetUserPositions -> PositionService.SetUserPositions` | user + position ids -> OK | replace user's positions | FE |
|
|
|
|
## 6. Dictionaries
|
|
|
|
Pipeline: `Dictionary handler -> DictionaryService -> DictionaryUsecase -> DictionaryRepo -> data.dictionaryRepo`.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /sysDictionary/createSysDictionary` | `Create -> CreateDictionaryRequest` | dictionary DTO -> `{dictionary}` | create dictionary | FE |
|
|
| `PUT /sysDictionary/updateSysDictionary` | `Update -> UpdateDictionaryRequest` | dictionary DTO -> OK | update dictionary | FE |
|
|
| `DELETE /sysDictionary/deleteSysDictionary` | `Delete -> DeleteDictionary` | `id` -> OK | delete dictionary | FE |
|
|
| `GET /sysDictionary/findSysDictionary` | `Find -> Dictionary` | id/type/status -> `{sysDictionary}` | read dictionary | FE |
|
|
| `GET /sysDictionary/getSysDictionaryList` | `List(false) -> Dictionaries` | page/name/type -> `Page<Dictionary>` | read without details | FE |
|
|
| `GET /sysDictionary/getSysDictionaryListWithDetails` | `List(true) -> Dictionaries` | page/name/type -> `Page<Dictionary+details>` | read with details | -- |
|
|
| `GET /sysDictionary/exportSysDictionary` | `Export -> ExportDictionary` | `id` -> dictionary export payload | read/export JSON structure | FE |
|
|
| `POST /sysDictionary/importSysDictionary` | `Import -> ImportDictionaryJSON` | JSON document -> OK | validate and import dictionary | FE |
|
|
| `POST /sysDictionaryDetail/createSysDictionaryDetail` | `CreateDetail -> CreateDictionaryDetailRequest` | detail DTO -> OK | create detail | FE |
|
|
| `PUT /sysDictionaryDetail/updateSysDictionaryDetail` | `UpdateDetail -> UpdateDictionaryDetailRequest` | detail DTO -> OK | update detail | FE |
|
|
| `DELETE /sysDictionaryDetail/deleteSysDictionaryDetail` | `DeleteDetail -> DeleteDictionaryDetail` | `id` -> OK | delete detail | FE |
|
|
| `GET /sysDictionaryDetail/findSysDictionaryDetail` | `FindDetail -> DictionaryDetail` | `id` -> `{sysDictionaryDetail}` | read detail | FE |
|
|
| `GET /sysDictionaryDetail/getSysDictionaryDetailList` | `Details -> DictionaryDetails` | page/filter -> `Page<Detail>` | read | FE |
|
|
| `GET /sysDictionaryDetail/getDictionaryTreeList` | `Tree(false) -> DictionaryTree` | `id` -> tree | read tree by id | FE |
|
|
| `GET /sysDictionaryDetail/getDictionaryTreeListByType` | `Tree(true) -> DictionaryTree` | `type` -> tree | read tree by type | FE |
|
|
| `GET /sysDictionaryDetail/getDictionaryDetailsByParent` | `DetailsByParent -> DictionaryDetailsByParent` | dictionary/parent/includeChildren -> details | read descendants | FE |
|
|
| `GET /sysDictionaryDetail/getDictionaryPath` | `Path -> DictionaryPath` | `id` -> ancestor path | read ancestry | FE |
|
|
|
|
## 7. Parameters, API tokens, security, and system configuration
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /sysParams/createSysParams` | `Parameter.Create -> CreateParameterRequest -> ParameterUsecase -> ParameterRepo` | parameter DTO -> OK | create parameter | FE |
|
|
| `PUT /sysParams/updateSysParams` | `Parameter.Update -> UpdateParameterRequest -> ParameterUsecase -> ParameterRepo` | parameter DTO -> OK | update parameter | FE |
|
|
| `DELETE /sysParams/deleteSysParams` | `Parameter.Delete -> DeleteParameters -> ParameterUsecase -> ParameterRepo` | `ID` query -> OK | delete parameter | FE |
|
|
| `DELETE /sysParams/deleteSysParamsByIds` | `Parameter.DeleteMany -> DeleteParameters -> ParameterUsecase -> ParameterRepo` | `IDs[]` -> OK | batch delete | FE |
|
|
| `GET /sysParams/findSysParams` | `Parameter.Find -> ParameterByID -> ParameterUsecase -> ParameterRepo` | `ID` -> parameter | read | FE |
|
|
| `GET /sysParams/getSysParam` | `Parameter.Get -> ParameterByKey -> ParameterUsecase -> ParameterRepo` | `key` -> parameter | read by key | FE |
|
|
| `GET /sysParams/getSysParamsList` | `Parameter.List -> ParametersFilter -> ParameterUsecase -> ParameterRepo` | page/name/key/date -> `Page<Parameter>` | read | FE |
|
|
| `POST /sysApiToken/createApiToken` | `APIToken.Create -> TokenService.CreateAPIToken -> TokenUsecase -> APITokenRepo` | user/authority/days/remark -> token | issue persisted API token | FE |
|
|
| `POST /sysApiToken/getApiTokenList` | `APIToken.List -> APITokens -> TokenUsecase -> APITokenRepo` | page/user/status -> `Page<Token>` | read | FE |
|
|
| `POST /sysApiToken/deleteApiToken` | `APIToken.Delete -> DisableAPIToken -> TokenUsecase -> APITokenRepo` | `id` -> OK | disable token | FE |
|
|
| `GET /securityConfig/getSecurityConfig` | `SystemConfig.GetSecurity -> SecurityService.Security -> SecurityUsecase -> SecurityRepo` | none -> security config | read | FE |
|
|
| `POST /securityConfig/setSecurityConfig` | `SystemConfig.SetSecurity -> SaveSecurityRequest -> SecurityUsecase -> SecurityRepo` | security DTO -> config | update security/rate/password policies | FE |
|
|
| `POST /system/getSystemConfig` | `SystemConfig.Get -> SystemConfigService.Get -> SystemConfigUsecase -> InitializationRepo` | none -> config document | read runtime config | FE |
|
|
| `POST /system/setSystemConfig` | `SystemConfig.Set -> Set -> SystemConfigUsecase -> InitializationRepo` | config document -> OK | persist runtime config | FE |
|
|
| `POST /system/reloadSystem` | `SystemConfig.Reload -> Reload -> SystemConfigUsecase + TaskRuntime` | none -> OK | reload runtime config/task schedule | FE |
|
|
| `POST /system/getServerInfo` | `SystemConfig.ServerInfo -> SystemInfo` | none -> host/process metrics | read system state | FE |
|
|
|
|
## 8. Operation, login, data-access, file-log, and error audit
|
|
|
|
Audit pipeline: `Audit handler -> AuditService -> AuditUsecase -> AuditQueryRepo -> data.auditRepo`.
|
|
Log viewer uses `LogViewerService -> LogViewerUsecase -> LogFileRepo -> data.logFileRepo`.
|
|
Error-record rows use the audit repository's error-record implementation. The
|
|
public error creation route is intentionally callable by the frontend error handler.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `GET /sysOperationRecord/getSysOperationRecordList` | `Audit.Operations -> OperationsFilter` | page/path/method/status -> `Page<Operation>` | read | FE |
|
|
| `GET /sysOperationRecord/findSysOperationRecord` | `Audit.Operation -> Operation` | `id` -> operation | read | -- |
|
|
| `DELETE /sysOperationRecord/deleteSysOperationRecord` | `Audit.DeleteOperation -> DeleteOperations` | `id` -> OK | delete record | FE |
|
|
| `DELETE /sysOperationRecord/deleteSysOperationRecordByIds` | `Audit.DeleteOperations -> DeleteOperations` | `ids[]` -> OK | batch delete | FE |
|
|
| `GET /sysLoginLog/getLoginLogList` | `Audit.Logins -> LoginsFilter` | page/username/status -> `Page<LoginLog>` | read | FE |
|
|
| `GET /sysLoginLog/findLoginLog` | `Audit.Login -> Login` | `id` -> login log | read | FE |
|
|
| `DELETE /sysLoginLog/deleteLoginLog` | `Audit.DeleteLogin -> DeleteLogins` | `id` -> OK | delete login log | FE |
|
|
| `DELETE /sysLoginLog/deleteLoginLogByIds` | `Audit.DeleteLogins -> DeleteLogins` | `ids[]` -> OK | batch delete | FE |
|
|
| `POST /dataAccessLog/getDataAccessLogList` | `Audit.DataAccess -> DataAccessRequest` | filter/page -> `Page<DataAccessLog>` | read | FE |
|
|
| `DELETE /dataAccessLog/deleteDataAccessLogByIds` | `Audit.DeleteDataAccess -> DeleteDataAccess` | `ids[]` -> OK | batch delete | FE |
|
|
| `GET /logViewer/dates` | `Audit.LogDates -> LogViewerService.LogDates` | `month` -> dates | read filesystem log index | FE |
|
|
| `GET /logViewer/files` | `Audit.LogFiles -> LogViewerService.LogFiles` | `date` -> files | read filesystem log index | FE |
|
|
| `GET /logViewer/content` | `Audit.LogContent -> LogViewerService.LogContent` | date/path/cursor -> chunk | read log content, cursor pagination | FE |
|
|
| `POST /sysError/createSysError` | `Audit.CreateError -> AuditRecorder.RecordError` | frontend error payload -> OK | **public** append error record | FE |
|
|
| `GET /sysError/getSysErrorList` | `Audit.Errors -> ErrorsFilter` | page/form/info/date -> `Page<Error>` | read | FE |
|
|
| `GET /sysError/findSysError` | `Audit.Error -> Error` | `id` -> error record | read | FE |
|
|
| `PUT /sysError/updateSysError` | `Audit.UpdateError -> UpdateErrorRequest` | error mutation -> OK | update error record | FE |
|
|
| `DELETE /sysError/deleteSysError` | `Audit.DeleteError -> DeleteErrors` | `id` -> OK | delete error record | FE |
|
|
| `DELETE /sysError/deleteSysErrorByIds` | `Audit.DeleteErrors -> DeleteErrors` | `ids[]` -> OK | batch delete | FE |
|
|
|
|
## 9. Export templates and versions
|
|
|
|
Export pipeline: `Export handler -> ExportService -> ExportUsecase -> ExportRepo -> data.exportRepo`,
|
|
with short-lived download tokens in the cache. Version pipeline: `Version handler
|
|
-> VersionService -> VersionUsecase -> VersionRepo -> data.versionRepo`; export and
|
|
import also read/write menus, APIs, and dictionaries through `VersionUsecase`.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /sysExportTemplate/createSysExportTemplate` | `Export.Create -> CreateRequest` | template DTO -> OK | create template | FE |
|
|
| `PUT /sysExportTemplate/updateSysExportTemplate` | `Export.Update -> UpdateRequest` | template DTO -> OK | update template | FE |
|
|
| `DELETE /sysExportTemplate/deleteSysExportTemplate` | `Export.Delete -> Delete` | `id` -> OK | delete template | FE |
|
|
| `DELETE /sysExportTemplate/deleteSysExportTemplateByIds` | `Export.DeleteMany -> Delete` | `ids[]` -> OK | batch delete | FE |
|
|
| `GET /sysExportTemplate/findSysExportTemplate` | `Export.Find -> Template` | id/templateID -> template | read | FE |
|
|
| `GET /sysExportTemplate/getSysExportTemplateList` | `Export.List -> TemplatesFilter` | page/name/table/template/date -> `Page<Template>` | read | FE |
|
|
| `GET /sysExportTemplate/previewSQL` | `Export.Preview -> Preview` | templateID + query params -> SQL | render query only | FE |
|
|
| `GET /sysExportTemplate/exportExcel` | `Export.Issue(false) -> IssueToken` | templateID + params -> download token | cache token; no file yet | FE |
|
|
| `GET /sysExportTemplate/exportTemplate` | `Export.Issue(true) -> IssueToken` | templateID -> download token | cache blank-template token | FE |
|
|
| `POST /sysExportTemplate/importExcel` | `Export.Import -> Import` | multipart file + templateID -> OK | parse/import spreadsheet | -- |
|
|
| `GET /sysExportTemplate/exportExcelByToken` | `Export.Download(false) -> ConsumeToken + Export` | token -> XLSX stream | **public**, one-time token consumption and file generation | -- |
|
|
| `GET /sysExportTemplate/exportTemplateByToken` | `Export.Download(true) -> ConsumeToken + ExportBlankTemplate` | token -> XLSX stream | **public**, one-time token consumption and blank template | -- |
|
|
| `DELETE /sysVersion/deleteSysVersion` | `Version.Delete -> DeleteVersions` | `ID` -> OK | delete version record | FE |
|
|
| `DELETE /sysVersion/deleteSysVersionByIds` | `Version.DeleteMany -> DeleteVersions` | `IDs[]` -> OK | batch delete | FE |
|
|
| `GET /sysVersion/findSysVersion` | `Version.Find -> Version` | `ID` -> version | read | FE |
|
|
| `GET /sysVersion/getSysVersionList` | `Version.List -> Versions` | page/name/code/date -> `Page<Version>` | read | FE |
|
|
| `POST /sysVersion/exportVersion` | `Version.Export -> BuildVersionBundle/CreateVersion` | version metadata + menu/API/dict ids -> OK | compose and persist version JSON | FE |
|
|
| `GET /sysVersion/downloadVersionJson` | `Version.Download -> VersionData` | `ID` -> JSON attachment | create/download serialized version | FE |
|
|
| `POST /sysVersion/importVersion` | `Version.Import -> ImportRequest/ImportVersionBundle` | version JSON DTO -> OK | import menu/API/dictionary bundle and record import | FE |
|
|
|
|
## 10. Scheduled tasks and media
|
|
|
|
Task pipeline: `Task handler -> TaskService -> TaskApplicationUsecase -> TaskUsecase ->
|
|
TaskRepo -> data.taskRepo`, plus the worker scheduler/runtime. Media pipeline:
|
|
`Media handler -> MediaService -> MediaUsecase -> MediaRepo -> data.mediaRepo`,
|
|
using configured object/local storage and upload-session persistence.
|
|
|
|
| Method/path | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- |
|
|
| `POST /timedTask/createTimedTask` | `Task.Create -> CreateRequest` | task cron/executor DTO -> OK | persist task and schedule it | FE |
|
|
| `PUT /timedTask/updateTimedTask` | `Task.Update -> UpdateRequest` | task DTO -> OK | update and reschedule | FE |
|
|
| `DELETE /timedTask/deleteTimedTask` | `Task.Delete -> Delete` | `{id}` -> OK | unschedule and delete task | FE |
|
|
| `POST /timedTask/toggleTimedTask` | `Task.Toggle -> Toggle` | `id,enabled` -> OK | enable/disable schedule | FE |
|
|
| `POST /timedTask/triggerTimedTask` | `Task.Trigger -> Trigger` | `{id}` -> OK | enqueue/manual execute; log result asynchronously | FE |
|
|
| `GET /timedTask/getTimedTaskList` | `Task.List -> ListRequest` | page/name/type/enabled -> `Page<Task>` | read | FE |
|
|
| `GET /timedTask/getTimedTaskLogList` | `Task.Logs -> Logs` | page/task/status -> `Page<TaskLog>` | read | FE |
|
|
| `GET /timedTask/getRegisteredMethods` | `Task.Methods -> RegisteredMethods` | none -> `{methods}` | read task method registry | FE |
|
|
| `GET /timedTask/alertStream` | `Task.AlertStream -> Subscribe` | authenticated SSE -> event stream | subscribe/unsubscribe user failure alerts | FE-direct |
|
|
| `POST /fileUploadAndDownload/upload` | `Media.Upload -> Upload` | multipart file/category/save -> media item | write storage; optionally persist metadata | FE |
|
|
| `POST /fileUploadAndDownload/getFileList` | `Media.List -> MediaList` | media filter/page -> `Page<Media>` | read | FE |
|
|
| `POST /fileUploadAndDownload/deleteFile` | `Media.Delete -> Delete` | `{id}` -> OK | delete metadata and storage object | FE |
|
|
| `POST /fileUploadAndDownload/deleteFiles` | `Media.DeleteMany -> Delete` | `ids[]` -> OK | batch delete files | -- |
|
|
| `GET /fileUploadAndDownload/findFile` | `Media.Find -> Media` | `id` -> media item | read | -- |
|
|
| `POST /fileUploadAndDownload/editFileName` | `Media.Rename -> Rename` | `id,name` -> OK | rename metadata/storage object per backend | FE |
|
|
| `POST /fileUploadAndDownload/importURL` | `Media.ImportURLs -> ImportURLRequests` | URL items -> OK | import remote media references | FE |
|
|
| `POST /fileUploadAndDownload/listOssFiles` | `Media.Storage -> Storage` | prefix/cursor/limit -> object page | list configured object storage | -- |
|
|
| `GET /attachmentCategory/getCategoryList` | `Media.Categories -> Categories` | none -> categories | read | FE |
|
|
| `POST /attachmentCategory/addCategory` | `Media.SaveCategory -> SaveCategoryRequest` | category DTO -> OK | create/update category | FE |
|
|
| `POST /attachmentCategory/deleteCategory` | `Media.DeleteCategory -> DeleteCategory` | `{id}` -> OK | delete category | FE |
|
|
| `POST /mediaUpload/init` | `Media.InitUpload -> InitUpload` | name/hash/size/chunk metadata -> session/status | create/resume multipart upload session | FE |
|
|
| `POST /mediaUpload/chunk` | `Media.SaveChunk -> SaveChunk` | multipart chunk + upload/index/hash -> OK | persist/verify upload chunk | FE |
|
|
| `POST /mediaUpload/complete` | `Media.CompleteUpload -> CompleteUpload` | `uploadId` -> media item | assemble/persist completed media | FE |
|
|
| `DELETE /mediaUpload/:uploadId` | `Media.CancelUpload -> CancelUpload` | path upload id -> OK | remove pending upload session/chunks | FE |
|
|
|
|
## 11. Announcements and email
|
|
|
|
Announcement pipeline: `Announcement handler -> AnnouncementService -> AnnouncementUsecase
|
|
-> AnnouncementRepo -> data.announcementRepo`. Email pipeline: `Email handler ->
|
|
EmailService -> EmailUsecase -> EmailRepo`, where `NewEmailRepo(runtime)` uses the
|
|
configured runtime mail client rather than the database.
|
|
|
|
| Method/path | Visibility | Call | Key input -> output | Primary effect | FE |
|
|
| --- | --- | --- | --- | --- | --- |
|
|
| `POST /info/createInfo` | private | `Announcement.Create -> Create` | announcement DTO -> OK | create announcement | FE |
|
|
| `DELETE /info/deleteInfo` | private | `Announcement.Delete -> Delete` | `ID` -> OK | delete announcement | FE |
|
|
| `DELETE /info/deleteInfoByIds` | private | `Announcement.DeleteByIDs -> DeleteByIDs` | `IDs[]` -> OK | batch delete | FE |
|
|
| `PUT /info/updateInfo` | private | `Announcement.Update -> Update` | announcement DTO -> OK | update announcement | FE |
|
|
| `GET /info/findInfo` | private | `Announcement.Find -> Find` | `ID` -> announcement | read | FE |
|
|
| `GET /info/getInfoList` | private | `Announcement.List -> List` | page/date range -> `Page<Announcement>` | read | FE |
|
|
| `GET /info/getInfoDataSource` | public | `Announcement.DataSource -> UserOptions` | none -> `{userID: options}` | read selectable users | FE |
|
|
| `GET /info/getInfoPublic` | public | `Announcement.Public` | none -> compatibility text | no business read/write | -- |
|
|
| `POST /email/emailTest` | private | `Email.Test -> Test` | none -> OK | send configured test email | FE |
|
|
| `POST /email/sendEmail` | private | `Email.Send -> Send` | `to,subject,body` -> OK | send mail | FE |
|
|
|
|
## Frontend coverage difference
|
|
|
|
The web client has **no unmatched static API URL**: all inspected `service({url})`
|
|
calls resolve to a registered local route, including the dynamic
|
|
`DELETE /mediaUpload/:uploadId`. One direct browser request,
|
|
`GET /timedTask/alertStream`, is used by `EventSource` and is therefore counted
|
|
as covered even though it has no `web/src/api/timedTask.js` wrapper.
|
|
|
|
Registered routes without a current frontend API call are:
|
|
|
|
- platform/operational: `GET /health`, `GET /swagger/*any`;
|
|
- dictionary: `GET /sysDictionary/getSysDictionaryListWithDetails`;
|
|
- audit: `GET /sysOperationRecord/findSysOperationRecord`;
|
|
- export: `POST /sysExportTemplate/importExcel`, both public
|
|
`...ByToken` download routes;
|
|
- media: `POST /fileUploadAndDownload/deleteFiles`, `GET .../findFile`,
|
|
`POST .../listOssFiles`;
|
|
- announcement compatibility endpoint: `GET /info/getInfoPublic`.
|
|
|
|
The first group is operational or token-follow-up behavior. The others are
|
|
backend capabilities not represented by a client function today; they should be
|
|
explicitly marked as deliberately backend-only or added to the frontend when a
|
|
GVA behavioral comparison shows they are user-facing.
|
|
|
|
## Clearly excluded from the migration parity target
|
|
|
|
The supplied GVA checkout has router modules with no corresponding local router
|
|
registration: `system/sys_auto_code.go`, `system/sys_auto_code_history.go`,
|
|
`system/sys_skills.go`, and `example/exa_customer.go`. Its plugin tree also
|
|
contains AI/MCP/CLI/skills routes and auto/plugin-management routes. These
|
|
code-generation/history, AI/LLM/MCP/skills, plugin-management, and example
|
|
modules are explicitly outside this audit. The single GVA
|
|
`GET /sysError/getSysErrorSolution` action is likewise excluded because it
|
|
delegates to `AutoCodeService.LLMAuto`; the surrounding non-AI error CRUD is
|
|
included. No parity failure should be opened for excluded routes. The local
|
|
router inventory does include the GVA system/media modules that were migrated,
|
|
plus the local `announcement` and `email` modules.
|
|
|
|
## Audit use
|
|
|
|
For the next phase, compare each row to the same GVA route by method and path,
|
|
then verify: request binding location, validation/defaulting, response envelope,
|
|
authorization/data-scope behavior, database/storage transaction effects, and
|
|
side effects such as cache invalidation, token consumption, scheduler reload, or
|
|
mail/file output. Keep the exclusions above out of the parity score.
|