- Rename logging-helper to logging for consistency - Remove git-commit-helper (superseded by /commit command) - Add git-workflow skill for Git Flow operations Co-Authored-By: Claude <noreply@anthropic.com>
50 KiB
ISA-Frontend Monorepo: Comprehensive Architectural Analysis
Document Version: 1.0
Last Updated: 2025-10-29
Monorepo Size: 63 total libraries + 1 main application
Angular Version: 20.3.6
Nx Version: 21.3.2
Node.js: >= 22.12.0, < 23.0.0
npm: >= 11.6.0, < 11.7.0
Table of Contents
- Project Structure Analysis
- Dependency Architecture
- Technology Stack
- Domain Boundaries
- Architecture Patterns
- C4 Model Components
Project Structure Analysis
Overall Organization
The ISA-Frontend is a sophisticated Angular monorepo employing Domain-Driven Design (DDD) principles with a strict layered architecture. The project uses Nx workspaces for efficient dependency management and build orchestration.
ISA-Frontend/
├── apps/
│ └── isa-app/ # Main Angular application (only runnable app)
│ └── src/
│ ├── app/ # Application bootstrap and root routing
│ ├── domain/ # Domain-specific feature implementations
│ ├── page/ # Page-level components
│ ├── modal/ # Modal dialogs
│ ├── adapter/ # External service adapters
│ ├── core/ # App-specific core services
│ ├── shared/ # App-specific shared utilities
│ ├── ui/ # App-specific UI components
│ ├── utils/ # App-specific utilities
│ ├── config/ # Configuration files
│ ├── environments/ # Environment-specific configs
│ └── assets/ # Static assets
│
├── libs/ # 63 domain-driven libraries
│ ├── core/ # Core infrastructure (5 libs)
│ ├── common/ # Common utilities (3 libs)
│ ├── ui/ # UI component system (17 libs)
│ ├── shared/ # Shared domain components (7 libs)
│ ├── availability/ # Availability domain (1 lib)
│ ├── catalogue/ # Catalogue domain (1 lib)
│ ├── checkout/ # Checkout domain (6 libs)
│ ├── crm/ # CRM domain (1 lib)
│ ├── oms/ # Order Management domain (9 libs)
│ ├── remission/ # Remission domain (8 libs)
│ ├── icons/ # Icon library (1 lib)
│ ├── utils/ # General utilities (3 libs)
│ └── [domain]/
│ ├── data-access/ # State & API integration
│ ├── feature/ # Feature components
│ ├── shared/ # Domain-specific shared
│ └── utils/ # Domain-specific utilities
│
├── generated/swagger/ # Auto-generated API clients (10 APIs)
│ ├── availability-api/
│ ├── cat-search-api/
│ ├── checkout-api/
│ ├── crm-api/
│ ├── eis-api/
│ ├── inventory-api/
│ ├── isa-api/
│ ├── oms-api/
│ ├── print-api/
│ └── wws-api/
│
├── tools/ # Build scripts and utilities
├── docs/ # Documentation
└── config files # Nx, TypeScript, Prettier configs
Library Count by Domain
| Domain | Count | Libraries |
|---|---|---|
| UI Components | 17 | buttons, carousel, datepicker, dialog, empty-state, expandable, input-controls, item-rows, label, layout, menu, progress-bar, search-bar, skeleton-loader, toolbar, tooltip, bullet-list |
| OMS (Orders) | 9 | data-access, feature (return-details, return-process, return-review, return-search, return-summary), shared (product-info, task-list), utils (translation) |
| Remission (Returns) | 8 | data-access, feature (remission-list, remission-return-receipt-details, remission-return-receipt-list), shared (product, remission-start-dialog, return-receipt-actions, search-item-to-remit-dialog) |
| Checkout | 6 | data-access, feature (reward-catalog, reward-order-confirmation, reward-shopping-cart), shared (product-info, reward-selection-dialog) |
| Core Infrastructure | 5 | config, logging, navigation, storage, tabs |
| Shared Components | 7 | address, filter, product-format, product-image, product-router-link, quantity-control, scanner |
| Common Utilities | 3 | data-access, decorators, print |
| Utility Libraries | 3 | ean-validation, scroll-position, z-safe-parse |
| Specialized Domains | 4 | availability (1), catalogue (1), crm (1), icons (1) |
| Generated APIs | 10 | Auto-generated from Swagger/OpenAPI specs |
| TOTAL | 63 | + 1 main application (isa-app) |
Dependency Architecture
Layer Model
The architecture enforces strict unidirectional dependencies following a layered approach:
┌─────────────────────────────────────────────┐
│ Feature Layer (Pages) │
│ [oms-feature-return-search, etc.] │
└────────────────┬────────────────────────────┘
│ depends on
┌────────────────▼────────────────────────────┐
│ Shared/UI Component Layer │
│ [oms-shared-product-info, etc.] │
│ [ui-buttons, ui-dialog, etc.] │
└────────────────┬────────────────────────────┘
│ depends on
┌────────────────▼────────────────────────────┐
│ Data Access & State Layer │
│ [oms-data-access, checkout-data-access] │
│ (NgRx Signals Stores) │
└────────────────┬────────────────────────────┘
│ depends on
┌────────────────▼────────────────────────────┐
│ Infrastructure/Common Layer │
│ [generated-swagger, common-data-access] │
│ [core-logging, core-config, core-storage] │
└─────────────────────────────────────────────┘
Import Boundaries
All imports use path aliases via TypeScript tsconfig.base.json:
// Correct (cross-domain)
import { OrderService } from '@isa/oms/data-access';
import { CheckoutService } from '@isa/checkout/data-access';
import { UiButton } from '@isa/ui/buttons';
// Correct (within domain)
import { OrderState } from '../data-access/order.store';
// INCORRECT (relative imports across domains)
// ❌ import { OrderService } from '../../../oms/data-access';
Path Alias Mapping
All 63 libraries are mapped via path aliases:
{
"paths": {
"@isa/[domain]/[layer]/[feature]": ["libs/[domain]/[layer]/[feature]/src/index.ts"],
"@generated/swagger/[api-name]": ["generated/swagger/[api-name]/src/index.ts"]
}
}
Dependency Graph Overview
Main Application (isa-app) Dependencies:
- All 9 OMS libraries
- All 8 Remission libraries
- All 6 Checkout libraries
- Specialized domains: Availability, Catalogue, CRM
- All 17 UI component libraries
- All 7 Shared component libraries
- Core infrastructure: 5 libraries
- Common utilities: 3 libraries
- Generated Swagger APIs: 10 clients
- Utility libraries: 3 libraries
Key Observations:
- No circular dependencies (strict acyclic graph)
- Feature libraries depend on shared/UI components
- Shared/UI libraries depend on data-access or core only
- Data-access libraries may depend on generated Swagger APIs and common utilities
- Core libraries have minimal dependencies (infrastructure only)
Technology Stack
Angular & Build Tools
| Component | Version | Purpose |
|---|---|---|
| Angular | 20.3.6 | Core framework with signals, standalone components |
| Angular CDK | 20.2.9 | Component primitives (overlays, focus, platform) |
| TypeScript | 5.8.3 | Type safety and modern language features |
| Nx | 21.3.2 | Monorepo management and build orchestration |
| Vite | 6.3.5 | Fast build tool (for testing) |
| esbuild | (via Nx) | Fast JavaScript bundler |
State Management
| Library | Version | Usage |
|---|---|---|
| NgRx Signals | 20.0.0 | Primary state management with signal stores |
| NgRx Entity | 20.0.0 | Normalized entity state management |
| NgRx Effects | 20.0.0 | Side effects handling |
| NgRx Store DevTools | 20.0.0 | Redux DevTools integration |
State Management Pattern:
- signalStore(): Modern functional signal-based stores
- withEntities(): Normalized data with entity adapters
- withStorage(): SessionStorage/IDB persistence
- rxMethod(): Reactive methods with cancellation support
- withHooks(): Lifecycle management and cleanup
Testing Frameworks
| Framework | Status | Count | Usage |
|---|---|---|---|
| Jest | Legacy | 40 libs (65.6%) | Older libraries (being phased out) |
| Vitest | Standard | 21 libs (34.4%) | New libraries (migration target) |
| Spectator | Jest only | - | Advanced mocking for Jest |
| ng-mocks | Both | - | Angular-specific mocking utilities |
| Angular Testing Utilities | Vitest | - | TestBed, ComponentFixture |
Testing Strategy:
- New libraries: Vitest + Angular Testing Utilities
- Legacy libraries: Jest + Spectator
- Migration: Ongoing from Jest to Vitest
HTTP & API Integration
| Library | Version | Purpose |
|---|---|---|
| HttpClient | 20.3.6 | Angular HTTP client |
| ng-swagger-gen | 2.3.1 | OpenAPI/Swagger code generation |
| Zod | 3.24.2 | Runtime schema validation |
Generated API Clients (10 total):
availability-api- Product availabilitycat-search-api- Catalogue searchcheckout-api- Shopping cart & orderscrm-api- Customer managementeis-api- Enterprise Info Systeminventory-api- Inventory managementisa-api- Main ISA APIoms-api- Order Management Systemprint-api- Print serviceswws-api- Warehouse services
Form Handling & Input
| Library | Version | Purpose |
|---|---|---|
| @angular/forms | 20.3.6 | Reactive and template-driven forms |
| Angular CDK | 20.2.9 | Form primitives and accessibility |
UI & Styling
| Library | Version | Purpose |
|---|---|---|
| Tailwind CSS | 3.4.14 | Utility-first CSS framework |
| ISA Custom Plugins | - | 7 custom Tailwind plugins (button, typography, menu, label, input, section, select-bullet) |
| @angular/animations | 20.3.6 | Animation framework |
Additional Libraries
| Library | Version | Purpose |
|---|---|---|
| date-fns | 4.1.0 | Modern date manipulation |
| moment | 2.30.1 | Legacy date library (being replaced by date-fns) |
| lodash | 4.17.21 | Utility functions |
| uuid | 8.3.2 | UUID generation |
| RxJS | 7.8.2 | Reactive programming |
| @microsoft/signalr | 8.0.7 | Real-time communication (SignalR) |
| angular-oauth2-oidc | 20.0.2 | OAuth2/OIDC authentication |
| ng2-pdf-viewer | 10.4.0 | PDF viewing |
| scandit-web-datacapture | 6.28.1 | Barcode scanning |
| ngx-matomo-client | 8.0.0 | Analytics (Matomo) |
Domain Boundaries
Domain 1: Order Management System (OMS)
Purpose: Handle product returns, receipt management, and return workflow processing
Libraries (9):
@isa/oms/data-access- State management for returns/receipts@isa/oms/feature/return-search- Receipt search & filtering@isa/oms/feature/return-details- Receipt detail view & item selection@isa/oms/feature/return-process- Return workflow with questions@isa/oms/feature/return-summary- Return confirmation & printing@isa/oms/feature/return-review- Return completion review@isa/oms/shared/product-info- Product display components@isa/oms/shared/task-list- Receipt task management@isa/oms/utils/translation- Receipt type translations
Key Workflows:
- Search for receipts by order ID, EAN, or date range
- Select items from receipt for return
- Configure return quantities and categories
- Answer dynamic return process questions
- Review and confirm return
- Print return receipt
API Dependencies:
oms-api- Main OMS APIisa-api- General ISA APIprint-api- Receipt printing
State Management:
- NgRx Signal Store with entity normalization
- Session persistence for in-progress returns
Domain 2: Remission (Returns Management)
Purpose: Manage warehouse remission processes (mandatory and department returns)
Libraries (8):
@isa/remission/data-access- Remission state and API@isa/remission/feature/remission-list- Main remission list view@isa/remission/feature/remission-return-receipt-list- Return receipts view@isa/remission/feature/remission-return-receipt-details- Receipt details@isa/remission/shared/product- Product components@isa/remission/shared/remission-start-dialog- Start remission workflow@isa/remission/shared/return-receipt-actions- Receipt action buttons@isa/remission/shared/search-item-to-remit-dialog- Item search dialog
Key Workflows:
- View mandatory (Pflicht) vs department (Abteilung) remissions
- Create return receipts ("Warenbegleitschein")
- Assign package numbers
- Search and add items to remission
- Complete remission items
- Delete/continue remission
API Dependencies:
- Remission-specific APIs via ISA backend
Domain 3: Checkout & Rewards
Purpose: Shopping cart, order placement, and loyalty rewards redemption
Libraries (6):
@isa/checkout/data-access- Cart and checkout state@isa/checkout/feature/reward-catalog- Reward item browsing@isa/checkout/feature/reward-shopping-cart- Cart with rewards@isa/checkout/feature/reward-order-confirmation- Order confirmation@isa/checkout/shared/product-info- Product display@isa/checkout/shared/reward-selection-dialog- Reward selection UI
Key Workflows:
- Add items to shopping cart
- View cart items and totals
- Redeem loyalty points for rewards
- Browse available rewards
- Place order with rewards
- View order confirmation
API Dependencies:
checkout-api- Cart and order APIscrm-api- Customer and bonus card info
State Management:
- NgRx Signal Store for cart/checkout state
- Reward selection dialog state
Domain 4: Catalogue
Purpose: Product search and catalogue management
Libraries (1):
@isa/catalogue/data-access- Catalogue search and filtering
Key Capabilities:
- Product search by EAN, title, author
- Loyalty program integration
- Format and edition handling
- Stock availability by location
API Dependencies:
cat-search-api- Catalogue searchavailability-api- Stock availability
Domain 5: Availability
Purpose: Product stock availability across retail locations
Libraries (1):
@isa/availability/data-access- Availability queries
Key Capabilities:
- Check stock by location
- Support multiple order types
- Delivery method validation
API Dependencies:
availability-api- Availability service
Domain 6: CRM (Customer Relationship Management)
Purpose: Customer data, addresses, and bonus card management
Libraries (1):
@isa/crm/data-access- Customer, address, and bonus card state
Key Capabilities:
- Customer lookup and management
- Shipping address management
- Payer information
- Bonus card (Prämienkarte) status and points
API Dependencies:
crm-api- Customer management
Shared Component Domains
UI Component Library (17 libraries)
Universal design system components used across all domains:
| Component | Purpose |
|---|---|
ui-buttons |
Button variants (primary, secondary, ghost, etc.) |
ui-input-controls |
Form inputs, checkboxes, radio buttons |
ui-dialog |
Modal dialogs and alert boxes |
ui-datepicker |
Date range picker |
ui-layout |
Responsive layout utilities and breakpoint service |
ui-menu |
Dropdown menus |
ui-toolbar |
Top bar container |
ui-search-bar |
Search input with autocomplete |
ui-expandable |
Expandable/collapsible sections |
ui-empty-state |
Empty state messages |
ui-skeleton-loader |
Loading placeholders |
ui-carousel |
Horizontal scroll container |
ui-item-rows |
Data row display |
ui-progress-bar |
Progress indication |
ui-tooltip |
Tooltip overlays |
ui-label |
Tag/label components |
ui-bullet-list |
Bullet point lists |
Design System Features:
- Tailwind CSS + 7 custom plugins
- Custom breakpoints: Tablet, Desktop, DesktopL, DesktopXL
- ISA brand color palette (isa-accent-, isa-text-)
- Typography system (14 custom utilities)
- Consistent spacing and sizing
Shared Components (7 libraries)
Domain-agnostic components for product display and interaction:
| Component | Purpose |
|---|---|
shared-address |
Address display (multi-line, inline) |
shared-filter |
Filter and search UI |
shared-product-image |
Product image with CDN support |
shared-product-format |
Format display (hardcover, audiobook, etc.) |
shared-product-router-link |
Product navigation links |
shared-quantity-control |
Quantity selector |
shared-scanner |
Barcode scanner interface |
Core Infrastructure Libraries (5)
@isa/core/config
- Type-safe configuration management
- Runtime validation
- Nested object access
@isa/core/logging
- Structured logging with log levels
- Multiple output sinks (console, remote)
- Hierarchical context support
- Performance optimized
@isa/core/navigation
- Context preservation for multi-step flows
- Tab-scoped temporary state storage
- Return URL management
- Wizard state preservation
@isa/core/storage
- Type-safe storage abstraction
- NgRx Signals integration
- Multiple backends: localStorage, sessionStorage, IndexedDB
- Server-side user state sync
@isa/core/tabs
- Browser-like tab management
- Multi-tab navigation
- History tracking
- Intelligent persistence
Common Utilities (3)
@isa/common/data-access
- Core data fetching patterns
- RxJS operator library
- Error handling and response models
- Request batching infrastructure
@isa/common/decorators
- Method validation decorators
- Caching and debouncing
- Rate limiting
- Enhanced logging decorators
@isa/common/print
- Printer discovery and selection
- Print queue management
- Label and office printer support
Utility Libraries (3)
| Utility | Purpose |
|---|---|
@isa/utils/ean-validation |
EAN barcode validation with reactive forms |
@isa/utils/scroll-position |
Scroll position preservation |
@isa/utils/z-safe-parse |
Safe Zod parsing with fallbacks |
Architecture Patterns
1. Feature-Based Organization
Each domain follows a feature-based organization:
libs/[domain]/
├── data-access/ # State store + API services
├── feature/ # Feature components (pages/views)
│ ├── feature-1/
│ ├── feature-2/
│ └── ...
├── shared/ # Domain-specific reusable components
└── utils/ # Domain-specific utilities
Benefits:
- Clear domain boundaries
- Easy to scale and maintain
- Explicit dependencies
- Parallel team development
2. Standalone Components
All new components use Angular's standalone architecture:
@Component({
selector: 'oms-return-details',
standalone: true,
imports: [CommonModule, OmsSharedModule, UiButtonsModule],
template: `...`,
})
export class OmsReturnDetailsComponent {}
Advantages:
- Explicit dependencies in imports
- Tree-shakeable
- Easier to test
- No NgModule boilerplate
3. Signal-Based State Management
Uses modern NgRx Signals with functional composition:
export const orderStore = signalStore(
withState({ orders: [] as Order[] }),
withEntities({ entity: type<Order>() }),
withMethods((store) => ({
loadOrders: rxMethod<void>(
pipe(
switchMap(() => api.getOrders()),
tapResponse(
(orders) => patchState(store, setAllEntities(orders)),
(error) => handleError(error)
)
)
),
})),
withStorage({ key: 'orders' }) // Session persistence
);
Features:
- Signals for reactive state
- Entity management for normalized data
- Request cancellation via
rxMethod() - Automatic persistence
- Type-safe
4. Data Access Layer Pattern
Each domain has a dedicated data-access library:
// Service wrapping generated API
export class OmsApiService {
private api = inject(OmsApi);
getReceipt(id: string): Observable<Receipt> {
return this.api.getReceipt(id).pipe(
tapResponse(
(receipt) => Receipt.parse(receipt), // Zod validation
(error) => this.handleError(error)
)
);
}
}
// Domain store
export const omsStore = signalStore(
withEntities({ entity: type<Receipt>() }),
withMethods((store, api = inject(OmsApiService)) => ({
load: rxMethod<string>(
pipe(
switchMap((id) => api.getReceipt(id)),
tapResponse(
(receipt) => patchState(store, addEntity(receipt))
)
)
),
}))
);
5. Responsive Design with Breakpoint Service
Uses breakpoint service instead of CSS-only solutions:
import { breakpoint, Breakpoint } from '@isa/ui/layout';
@Component({
template: `
@if (isDesktop()) {
<desktop-view />
} @else {
<mobile-view />
}
`,
})
export class ResponsiveComponent {
isDesktop = breakpoint([
Breakpoint.Desktop,
Breakpoint.DesktopL,
Breakpoint.DesktopXL
]);
}
Available Breakpoints:
- Tablet: max-width 1279px
- Desktop: 1280px - 1439px
- DesktopL: 1440px - 1919px
- DesktopXL: 1920px+
6. Error Handling & Validation
Two-tier approach with TypeScript + Zod:
import { z } from 'zod';
// Schema definition
const OrderSchema = z.object({
id: z.string().uuid(),
items: z.array(OrderItemSchema),
total: z.number().positive(),
});
type Order = z.infer<typeof OrderSchema>;
// Usage
function processOrder(data: unknown): Result<Order> {
return OrderSchema.safeParse(data);
}
7. Request Cancellation
Built-in cancellation support via custom RxJS operators:
export class ReturnSearchComponent {
private searchTerm$ = new Subject<string>();
search$ = this.searchTerm$.pipe(
debounceTime(300),
distinctUntilChanged(),
takeUntilKeydown('Escape'), // Cancel on ESC
switchMap((term) => this.api.search(term))
);
}
Custom Operators:
takeUntilAborted()- Abort signal supporttakeUntilKeydown()- Keyboard event cancellationtakeUntilKeydownEscape()- Escape key shortcut
C4 Model Components
C4 Level 1: System Context
┌─────────────────────────────────────────────────────────────┐
│ ISA Frontend │
│ (Angular 20.3.6 Monorepo - Order/Returns Management) │
│ - OMS (Order Management) │
│ - Remission (Returns Processing) │
│ - Checkout (Shopping Cart & Rewards) │
│ - Catalogue (Product Search) │
│ - CRM (Customer Management) │
└──────────────┬──────────────────────────────────────────────┘
│
┌────────┼────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ Backend │ │Browser/ │ │Native Mobile │
│ REST API │ │Web App │ │(WebView) │
└──────────┘ └──────────┘ └──────────────┘
C4 Level 2: Container Architecture
┌─────────────────────────────────────────────────────────┐
│ ISA Frontend Application │
│ (Angular 20.3.6 SPA + PWA) │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Routing & Shell │ │
│ │ - isa-app root │ │
│ │ - Tab navigation (5+ open tabs) │ │
│ │ - Auth flow │ │
│ └────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Domain Feature Modules │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ OMS (Return Management) │ │ │
│ │ │ - Search → Details → Process → Review │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ Remission (Warehouse Returns) │ │ │
│ │ │ - List → Receipt → Actions │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ Checkout (Orders & Rewards) │ │ │
│ │ │ - Cart → Rewards → Confirmation │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ Catalogue (Product Search) │ │ │
│ │ │ - Search → Browse → Details │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ CRM (Customer Management) │ │ │
│ │ │ - Customer → Address → Bonus Card │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Shared Component Layer │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ UI Component Library (17 libs) │ │ │
│ │ │ Buttons, Forms, Dialogs, etc. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Shared Components (7 libs) │ │ │
│ │ │ Product Info, Address, Scanner, etc. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Data Access & State Layer │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Domain Stores (NgRx Signals) │ │ │
│ │ │ - Order Store │ │ │
│ │ │ - Remission Store │ │ │
│ │ │ - Checkout Store │ │ │
│ │ │ - Catalogue Store │ │ │
│ │ │ - CRM Store │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Data Access Services │ │ │
│ │ │ (wrapping generated APIs) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Infrastructure & Core Layer │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Core Services (5 libs) │ │ │
│ │ │ - Config (runtime settings) │ │ │
│ │ │ - Logging (structured logging) │ │ │
│ │ │ - Navigation (context preservation) │ │ │
│ │ │ - Storage (localStorage/IDB) │ │ │
│ │ │ - Tabs (multi-tab management) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Common Services (3 libs) │ │ │
│ │ │ - Data Access (batching, operators) │ │ │
│ │ │ - Decorators (caching, validation) │ │ │
│ │ │ - Print (printer management) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Generated Swagger API Clients (10) │ │ │
│ │ │ - oms-api, checkout-api, crm-api, etc. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
│
│ HTTP/WebSocket
│
▼
┌──────────────────────────────────────────────────┐
│ Backend Services (REST + SignalR) │
├──────────────────────────────────────────────────┤
│ - ISA API (core business logic) │
│ - OMS API (order management) │
│ - Remission API (returns processing) │
│ - Checkout API (shopping cart) │
│ - CRM API (customer data) │
│ - Catalogue API (product search) │
│ - Availability API (stock checking) │
│ - Print API (label printing) │
│ - EIS API (enterprise info system) │
│ - WWS API (warehouse services) │
└──────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ External Services │
├──────────────────────────────────────────────────┤
│ - Database (SQL Server) │
│ - File Storage (CDN for product images) │
│ - Print Queue (label/office printers) │
│ - Barcode Scanner (Scandit SDK) │
│ - Analytics (Matomo) │
│ - OAuth/OIDC (authentication) │
└──────────────────────────────────────────────────┘
C4 Level 3: Component Structure (OMS Domain Example)
┌──────────────────────────────────────────────────────────────┐
│ OMS Domain (Order Management System) │
│ (9 Libraries) │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Feature Components (Route-Level) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-search │ │ │
│ │ │ - Search for receipts (EAN, order ID, date) │ │ │
│ │ │ - Filter and pagination │ │ │
│ │ │ - Imports: shared/product-info, ui/buttons │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-details │ │ │
│ │ │ - View receipt items │ │ │
│ │ │ - Select items for return │ │ │
│ │ │ - Configure quantities and categories │ │ │
│ │ │ - Imports: shared/product-info, ui/* │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-process │ │ │
│ │ │ - Dynamic return reason questions │ │ │
│ │ │ - Validation and backend integration │ │ │
│ │ │ - Imports: data-access, ui/input-controls │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-summary │ │ │
│ │ │ - Review all return details │ │ │
│ │ │ - Confirm and submit │ │ │
│ │ │ - Trigger receipt printing │ │ │
│ │ │ - Imports: data-access, shared/*, ui/* │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-review │ │ │
│ │ │ - View completed return confirmation │ │ │
│ │ │ - Display return receipt │ │ │
│ │ │ - Option to reprint │ │ │
│ │ │ - Imports: data-access, shared/* │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────────────┐ │
│ │ Shared Components (Reusable UI) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-shared-product-info │ │ │
│ │ │ - Product row display │ │ │
│ │ │ - EAN, title, author, format, stock info │ │ │
│ │ │ - Imports: shared/product-*, ui/item-rows │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-shared-task-list │ │ │
│ │ │ - Display return tasks │ │ │
│ │ │ - Mark complete/incomplete │ │ │
│ │ │ - Imports: ui/expandable, ui/item-rows │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────────────┐ │
│ │ Data Access Layer │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-data-access │ │ │
│ │ │ │ │ │
│ │ │ NgRx Signal Stores: │ │ │
│ │ │ - receiptStore (list, details, filters) │ │ │
│ │ │ - returnStore (current return process) │ │ │
│ │ │ - questionStore (dynamic questions) │ │ │
│ │ │ │ │ │
│ │ │ Services: │ │ │
│ │ │ - OmsReceiptService (API wrapper) │ │ │
│ │ │ - OmsReturnService (return workflow) │ │ │
│ │ │ - PrintService (receipt printing) │ │ │
│ │ │ │ │ │
│ │ │ Imports: @generated/swagger/oms-api │ │ │
│ │ │ @generated/swagger/print-api │ │ │
│ │ │ @isa/core/logging │ │ │
│ │ │ @isa/common/data-access │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────────────┐ │
│ │ Utilities │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-utils-translation │ │ │
│ │ │ - Receipt type translations (Rechnung, etc.) │ │ │
│ │ │ - Service and pipe for formatting │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
└──────────────────────────┬───────────────────────────────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ OMS API │ │ Print API │ │ ISA API │
│ │ │ │ │ │
│ - getReceipt │ │ - printLabel │ │ - createReturn
│ - listReceipts
│ - createReturn
└──────────────┘ └──────────────┘ └──────────────┘
C4 Level 4: Code Structure (Single Component)
// File: libs/oms/feature/return-search/src/return-search.component.ts
import { Component, OnInit, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
// Feature dependencies
import { OmsStore, omsStore } from '@isa/oms/data-access';
// Shared components
import { UiSearchBar } from '@isa/ui/search-bar';
import { UiButton, UiPrimaryButton } from '@isa/ui/buttons';
import { OmsProductInfoComponent } from '@isa/oms/shared/product-info';
// Shared utilities
import { UiEmptyState } from '@isa/ui/empty-state';
@Component({
selector: 'oms-feature-return-search',
standalone: true,
imports: [
CommonModule,
ReactiveFormsModule,
UiSearchBar,
UiButton,
UiPrimaryButton,
OmsProductInfoComponent,
UiEmptyState,
],
template: `
<div class="oms-return-search">
<ui-search-bar
(search)="onSearch($event)"
placeholder="EAN oder Bestellnummer eingeben"
/>
@if (store.receipts(); as receipts) {
@if (receipts.length > 0) {
<div class="receipt-list">
@for (receipt of receipts; track receipt.id) {
<oms-product-info [receipt]="receipt" />
}
</div>
} @else {
<ui-empty-state
title="Keine Belege gefunden"
description="Bitte versuchen Sie es mit einer anderen Suchanfrage"
/>
}
}
</div>
`,
})
export class OmsReturnSearchComponent implements OnInit {
// Inject the domain store (NgRx Signals)
protected store = inject(omsStore);
private router = inject(Router);
ngOnInit() {
// Load receipts on component init
// Store automatically handles state, persistence, etc.
}
onSearch(term: string) {
this.store.searchReceipts(term);
}
}
Architectural Strengths
- Strong Domain Separation: Clear boundaries between OMS, Remission, Checkout, etc.
- Scalable Structure: 63 libraries organized by domain and layer
- Type Safety: TypeScript + Zod validation across all APIs
- Modern Patterns: Standalone components, signals, NgRx Signals stores
- Code Reuse: 17 UI component libraries + 7 shared component libraries
- Testing Strategy: Vitest + Jest with clear framework separation
- Build Performance: Nx caching and incremental builds
- State Management: Centralized, persistent, typed NgRx Signals stores
- Error Handling: Global HTTP interceptors and consistent error patterns
- Responsive Design: Breakpoint service for proper mobile/desktop support
Architectural Considerations
- Migration from Jest to Vitest: Currently 40 Jest libraries, moving to 21 Vitest
- Legacy Code: Some legacy modules still exist alongside new standalone patterns
- Bundle Size: Monitor carefully (2MB warning, 5MB error limits)
- Cache Management: Nx cache can cause issues - use
--skip-nx-cachefor tests - Authentication: OAuth2/OIDC required for all API calls
- Multi-Tab State: Tab navigation requires careful state management
Key Files for Reference
- Architecture Definition:
/nx.json,/tsconfig.base.json - Library Reference:
/docs/library-reference.md - Testing Guidelines:
/docs/guidelines/testing.md - App Bootstrap:
/apps/isa-app/src/app/app.module.ts - Routing:
/apps/isa-app/src/app/app-routing.module.ts - Configuration:
/apps/isa-app/src/config/
Deployment & Build Configuration
Development
npm start # Run with SSL (required for auth flows)
Testing
npm test # All libraries except main app
npm run ci # CI with coverage
npx nx test <project> --skip-nx-cache # Specific project (fresh)
Production Build
npm run build-prod # Production bundle
npx nx build isa-app --configuration=production
API Generation
npm run generate:swagger # Regenerate all 10 Swagger clients
npm run fix:files:swagger # Unicode cleanup post-generation
Documentation
npm run docs:generate # Update library reference
npm run prettier # Format code