156 lines
4.2 KiB
Markdown
156 lines
4.2 KiB
Markdown
|
|
# Category Domain Report
|
||
|
|
|
||
|
|
## Scope
|
||
|
|
|
||
|
|
Sprint 4 added a complete Category Domain on top of the existing backend API contract. Backend endpoints and payload names were not changed.
|
||
|
|
|
||
|
|
Existing backend category fields remain isolated as DTO input:
|
||
|
|
|
||
|
|
- `categoryID`
|
||
|
|
- `parentID`
|
||
|
|
- `name`
|
||
|
|
- `icon`
|
||
|
|
- `priority`
|
||
|
|
- `visible`
|
||
|
|
- `categoriesCount`
|
||
|
|
- `itemCount`
|
||
|
|
- `names[]`
|
||
|
|
|
||
|
|
The UI now consumes category domain models rather than backend-shaped category responses.
|
||
|
|
|
||
|
|
## Implemented Files
|
||
|
|
|
||
|
|
### DTO
|
||
|
|
|
||
|
|
- `src/app/core/categories/dto/category.dto.ts`
|
||
|
|
|
||
|
|
Defines `CategoryDto` and `CategoryNameDto` for existing backend category payloads. Compatibility fields for current mock/API variants are accepted only at the DTO boundary.
|
||
|
|
|
||
|
|
### Domain Model
|
||
|
|
|
||
|
|
- `src/app/core/categories/models/category-domain.model.ts`
|
||
|
|
|
||
|
|
Frontend category model exposes:
|
||
|
|
|
||
|
|
- `id`
|
||
|
|
- `parentId`
|
||
|
|
- `title`
|
||
|
|
- `icon`
|
||
|
|
- `priority`
|
||
|
|
- `visible`
|
||
|
|
- `itemCount`
|
||
|
|
- `children[]`
|
||
|
|
- `translations`
|
||
|
|
|
||
|
|
No backend category naming is required by category UI consumers.
|
||
|
|
|
||
|
|
### Mapper
|
||
|
|
|
||
|
|
- `src/app/core/categories/mappers/category.mapper.ts`
|
||
|
|
|
||
|
|
Maps backend DTOs into domain categories, including:
|
||
|
|
|
||
|
|
- backend id normalization
|
||
|
|
- parent id normalization
|
||
|
|
- title fallback selection
|
||
|
|
- `names[]` to `translations`
|
||
|
|
- nested DTO flattening
|
||
|
|
- visible-category filtering
|
||
|
|
- priority sorting
|
||
|
|
- duplicate id de-duplication
|
||
|
|
|
||
|
|
### Tree Utilities
|
||
|
|
|
||
|
|
- `src/app/core/categories/utils/category-tree.utils.ts`
|
||
|
|
|
||
|
|
Supports:
|
||
|
|
|
||
|
|
- flat list to tree
|
||
|
|
- unlimited nesting
|
||
|
|
- parent lookup
|
||
|
|
- children lookup
|
||
|
|
- breadcrumb generation
|
||
|
|
- leaf detection
|
||
|
|
- tree flattening for future lazy-loading compatibility
|
||
|
|
|
||
|
|
### Repository Abstraction
|
||
|
|
|
||
|
|
- `src/app/core/categories/repositories/category.repository.ts`
|
||
|
|
- `src/app/core/categories/repositories/api-category.repository.ts`
|
||
|
|
- `src/app/core/categories/category-repository.token.ts`
|
||
|
|
|
||
|
|
`CategoryRepository` returns DTOs from the existing `GET /category` API. The injection token uses the existing runtime provider strategy and remains compatible with both mock and API modes. Mock mode continues to work through the existing mock-data interceptor.
|
||
|
|
|
||
|
|
### Category Service
|
||
|
|
|
||
|
|
- `src/app/core/categories/category.service.ts`
|
||
|
|
|
||
|
|
Converts repository DTOs through the mapper and exposes domain methods:
|
||
|
|
|
||
|
|
- all categories
|
||
|
|
- category tree
|
||
|
|
- root categories
|
||
|
|
- category by id
|
||
|
|
- children
|
||
|
|
- parent
|
||
|
|
- breadcrumb
|
||
|
|
- leaf detection
|
||
|
|
|
||
|
|
### Category Facade
|
||
|
|
|
||
|
|
- `src/app/facades/platform/category.facade.ts`
|
||
|
|
|
||
|
|
Exposes observable streams and state for:
|
||
|
|
|
||
|
|
- all categories
|
||
|
|
- category tree
|
||
|
|
- root categories
|
||
|
|
- category by id
|
||
|
|
- selected category
|
||
|
|
- breadcrumb
|
||
|
|
- children
|
||
|
|
|
||
|
|
### Product Compatibility
|
||
|
|
|
||
|
|
- `src/app/core/products/models/product-domain.model.ts`
|
||
|
|
- `src/app/core/products/providers/api-product-data.provider.ts`
|
||
|
|
|
||
|
|
`ProductFacade.getCategories()` now resolves through `CategoryService`, so compatibility category access also returns the new category domain model.
|
||
|
|
|
||
|
|
## UI Migration
|
||
|
|
|
||
|
|
Updated category-facing UI consumers:
|
||
|
|
|
||
|
|
- `src/app/pages/home/home.component.ts`
|
||
|
|
- `src/app/pages/home/home.component.html`
|
||
|
|
- `src/app/pages/category/subcategories.component.ts`
|
||
|
|
- `src/app/pages/category/subcategories.component.html`
|
||
|
|
- `src/app/pages/category/category.component.ts`
|
||
|
|
|
||
|
|
The home page and subcategory page now consume `CategoryFacade` and `Category` domain models. Category route item loading still uses the existing product facade for product lists, without changing product/payment/auth contracts.
|
||
|
|
|
||
|
|
## Validation
|
||
|
|
|
||
|
|
Completed checks:
|
||
|
|
|
||
|
|
- DTOs are isolated under `core/categories/dto`.
|
||
|
|
- Category mapper exists and is the only category DTO-to-domain conversion point.
|
||
|
|
- Category UI uses `CategoryFacade` and category domain models.
|
||
|
|
- Category backend field names are contained to the category DTO/mapper boundary and compatibility internals.
|
||
|
|
- Components do not use `HttpClient` for category data.
|
||
|
|
- No authentication changes were made.
|
||
|
|
- No payment changes were made.
|
||
|
|
- No bootstrap contract changes were made.
|
||
|
|
- No backend API contract changes were made.
|
||
|
|
- Mock/API compatibility is preserved through the repository token and existing mock interceptor.
|
||
|
|
|
||
|
|
Build validation passed:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
## Stop Point
|
||
|
|
|
||
|
|
Category Domain implementation is complete for Sprint 4. Stop here for approval before starting the next domain or any Builder/Backoffice work.
|