Reorganize app workspaces and align Admin architecture

This commit is contained in:
Igor Martyniuk
2026-07-17 13:46:21 +00:00
parent ba691d3a0c
commit 0ba01cd111
183 changed files with 3745 additions and 4354 deletions
+14 -14
View File
@@ -6,21 +6,21 @@ The generator is intended to produce a maintainable starting point. Generated au
## Source Ownership
| Part | Source |
| ------------------------------- | ---------------------------------------------- |
| Generator page and form | `apps/admin/src/devtools/` |
| Copied frontend module template | `apps/admin/src/modules/_template/` |
| Generator HTTP endpoints | `backend/start/routes.ts` |
| Generator controller | `backend/app/controllers/module_controller.ts` |
| Database inspection | `backend/app/services/database_inspector.ts` |
| Backend Handlebars templates | `backend/app/templates/backend/` |
| Frontend Handlebars templates | `backend/app/templates/frontend/` |
| Part | Source |
| ------------------------------- | --------------------------------------------------- |
| Generator page and form | `apps/admin/src/devtools/` |
| Copied frontend module template | `apps/admin/src/modules/_template/` |
| Generator HTTP endpoints | `apps/backend/start/routes.ts` |
| Generator controller | `apps/backend/app/controllers/module_controller.ts` |
| Database inspection | `apps/backend/app/services/database_inspector.ts` |
| Backend Handlebars templates | `apps/backend/app/templates/backend/` |
| Frontend Handlebars templates | `apps/backend/app/templates/frontend/` |
See [frontend.md](./frontend.md) for the UI, payload builders, and generated frontend architecture. See [backend.md](./backend.md) for endpoints, database inspection, templates, and generated backend files. If generated files are not loaded or the module is missing from the menu, use the [troubleshooting guide](./troubleshooting.md).
## Prerequisites
1. Run the backend from the `backend/` workspace. The controller resolves backend and frontend destinations relative to `process.cwd()`.
1. Run the backend from the `apps/backend/` workspace. The controller resolves backend and frontend destinations relative to `process.cwd()`.
2. Run the admin app with dev mode enabled so the devtools module is registered.
3. Authenticate in the admin app. All generator endpoints use authentication middleware.
4. Create and migrate the source database table before opening the generator. The form reads tables and columns from PostgreSQL `information_schema`.
@@ -45,12 +45,12 @@ The generator first copies the complete frontend template, then overwrites gener
## Generated Locations
```txt
backend/modules/<ModuleName>/
backend/tests/modules/<ModuleName>/
apps/backend/modules/<ModuleName>/
apps/backend/tests/modules/<ModuleName>/
apps/admin/src/modules/<name>/
```
Frontend modules are discovered automatically through their `config/module.ts` manifest. Backend module routes and API routes are loaded automatically from `backend/modules/` during application startup.
Frontend modules are discovered automatically through their `config/module.ts` manifest. Backend module routes and API routes are loaded automatically from `apps/backend/modules/` during application startup.
## Important Operational Behavior
@@ -75,4 +75,4 @@ After generating a module:
For restart, module-discovery, permission, and menu problems, see [Troubleshooting](./troubleshooting.md).
The generated frontend structure follows the [React frontend architecture](../../apps-architecture/react-frontend/Readme.md). Backend modules should be reviewed against the [backend architecture](../../apps-architecture/backend/Readme.md).
The generated frontend structure follows the [React frontend architecture](../../apps/admin/architecture/Readme.md). Backend modules should be reviewed against the [backend architecture](../../apps/backend/architecture/Readme.md).
+7 -7
View File
@@ -4,7 +4,7 @@ The backend generator exposes authenticated schema-inspection and generation end
## Endpoints
Routes are registered in `backend/start/routes.ts`.
Routes are registered in `apps/backend/start/routes.ts`.
| Method | Path | Controller method | Purpose |
| ------ | ---------------------------- | ----------------- | -------------------------------------------------- |
@@ -16,7 +16,7 @@ All three endpoints use `middleware.auth()`.
## Database Inspection
`backend/app/services/database_inspector.ts` reads PostgreSQL `information_schema`.
`apps/backend/app/services/database_inspector.ts` reads PostgreSQL `information_schema`.
- Table discovery is limited to the `public` schema.
- framework, authentication, access-control, migration, and PostgreSQL system tables are excluded.
@@ -45,7 +45,7 @@ Nullable database columns receive `| null` in generated model/entity types and o
For module name `<name>`, table `<table>`, and derived module class `<ModuleName>`, selected assets are written under:
```txt
backend/modules/<ModuleName>/
apps/backend/modules/<ModuleName>/
├── api/
│ ├── controllers/<entity>_api_controller.ts
│ ├── validators/<entity>_create_api_validator.ts
@@ -63,7 +63,7 @@ backend/modules/<ModuleName>/
Tests are written under:
```txt
backend/tests/modules/<ModuleName>/
apps/backend/tests/modules/<ModuleName>/
├── <entity>.spec.ts
└── <entity>.api.spec.ts
```
@@ -74,7 +74,7 @@ backend/tests/modules/<ModuleName>/
### Model
Renders `backend/app/templates/backend/model.hbs` with columns, inferred relationships, searchable fields, and optional password hashing.
Renders `apps/backend/app/templates/backend/model.hbs` with columns, inferred relationships, searchable fields, and optional password hashing.
### Controller and routes
@@ -86,7 +86,7 @@ Creates separate create and update Vine validators. Primary keys and timestamp/d
### Policy and permissions
Creates a Bouncer policy with view/create/update/delete checks, creates `config/permissions.ts`, and adds a lazy policy import to `backend/app/policies/main.ts` when missing.
Creates a Bouncer policy with view/create/update/delete checks, creates `config/permissions.ts`, and adds a lazy policy import to `apps/backend/app/policies/main.ts` when missing.
Permission slugs are derived from the module name, for example:
@@ -123,7 +123,7 @@ The controller registers Handlebars helpers for `eq`, `not`, `or`, and `and`. Ne
## Extending the Backend Generator
1. Add or update a Handlebars template under `backend/app/templates/`.
1. Add or update a Handlebars template under `apps/backend/app/templates/`.
2. Add an explicit destination path in the controller `paths` object.
3. Create its parent directory through the existing path initialization.
4. Render only when the corresponding asset is selected.
+1 -1
View File
@@ -132,6 +132,6 @@ When adding a new generated frontend artifact:
2. Add UI controls to `ModuleGeneratorForm`.
3. Add a focused builder under `data/builders/` if the artifact contains dynamic source.
4. Add the payload field to `GenerateModulePayload` and `buildGenerateModulePayload`.
5. Accept and write the field in `backend/app/controllers/module_controller.ts`.
5. Accept and write the field in `apps/backend/app/controllers/module_controller.ts`.
6. Add the static structure to `apps/admin/src/modules/_template/` when every module needs it.
7. Verify generation with and without the new asset selected.
@@ -20,7 +20,7 @@ Check for TypeScript errors, invalid generated imports, route-loading failures,
The restart is necessary because:
- the backend discovers generated route files under `backend/modules/` during startup;
- the backend discovers generated route files under `apps/backend/modules/` during startup;
- the admin app discovers `apps/admin/src/modules/**/config/module.ts` through Vite's module registry;
- adding an entirely new directory may not trigger the same reload behavior as editing an existing file.
@@ -33,7 +33,7 @@ If generation succeeded and both services restarted, a missing menu item usually
Check the generated backend permissions:
```txt
backend/modules/<ModuleName>/config/permissions.ts
apps/backend/modules/<ModuleName>/config/permissions.ts
```
Check the frontend permission constants:
@@ -112,7 +112,7 @@ npm run build:admin
Then verify:
1. `backend/modules/<ModuleName>/` exists and contains the selected backend assets.
1. `apps/backend/modules/<ModuleName>/` exists and contains the selected backend assets.
2. `apps/admin/src/modules/<name>/` exists and contains a valid module manifest.
3. Docker services or local development processes were restarted.
4. Backend and frontend permission slugs match.