# fadarve1/prueba-tecnica architecture

> Architecture diagram of the GitHub repository fadarve1/prueba-tecnica, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-08-07). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/fadarve1/prueba-tecnica
- Repository: https://github.com/fadarve1/prueba-tecnica

## Overview

#### Purpose and Entry Points
OrderFlow is a small order-management system: a .NET 8 REST API backed by PostgreSQL and an Angular 22 standalone client for listing, filtering, creating, editing, and deleting orders. Backend startup is `backend/src/OrderManagement.Api/Program.cs`; frontend bootstrap is `frontend/src/main.ts`. Database schema initialization is supplied by `001_init.sql` and started through `docker-compose.yml`.

#### Backend Layering and Dependency Boundary
The backend follows Clean Architecture. The Domain layer owns order entities and status semantics without infrastructure dependencies: `backend/src/OrderManagement.Domain/Entities/Order.cs`, `backend/src/OrderManagement.Domain/Entities/OrderItem.cs`, and `backend/src/OrderManagement.Domain/Enums/OrderStatus.cs`. The Application layer defines use-case contracts, DTO boundaries, and domain-facing exceptions, insulating service logic from EF Core/PostgreSQL.

#### API Transport Layer
MVC routes are concentrated in `backend/src/OrderManagement.Api/Controllers/OrdersController.cs`, exposing CRUD and filtered search under `/api/orders`. Requests map into application DTOs such as `backend/src/OrderManagement.Application/DTOs/SaveOrderRequest.cs`; responses use order DTOs. `backend/src/OrderManagement.Api/Infrastructure/GlobalExceptionHandler.cs` is the HTTP error boundary, translating application failures such as missing or duplicate orders into consistent API responses.

#### Order Use-Case Flow
`backend/src/OrderManagement.Application/Services/OrderService.cs` is the central orchestration stage for listing, reading, saving/updating, and deleting orders. It enforces application behavior and converts between domain entities and DTOs. It depends only on the persistence abstraction at `backend/src/OrderManagement.Application/Abstractions/IOrderRepository.cs`, not the concrete database implementation. Application-specific failure paths are represented by `backend/src/OrderManagement.Application/Exceptions/OrderNotFoundException.cs` and `backend/src/OrderManagement.Application/Exceptions/DuplicateOrderNumberException.cs`.

#### Persistence and Database
Infrastructure implements the Application repository contract in `backend/src/OrderManagement.Infrastructure/Repositories/OrderRepository.cs`. EF Core mapping and aggregate persistence are defined by `backend/src/OrderManagement.Infrastructure/Persistence/OrderDbContext.cs`, with entity configuration in `backend/src/OrderManagement.Infrastructure/Persistence/Configurations/OrderConfiguration.cs` and `backend/src/OrderManagement.Infrastructure/Persistence/Configurations/OrderItemConfiguration.cs`. Dependency registrations cross the composition boundary through `backend/src/OrderManagement.Infrastructure/DependencyInjection.cs`, invoked by API startup.

PostgreSQL 18 is the external state service. `docker-compose.yml` provisions it; `001_init.sql` establishes its schema and database-side constraints/indexes/logic. The default connection can be overridden with `ConnectionStrings__DefaultConnection`.

#### Frontend Application Flow
The Angular client is a standalone SPA configured from `frontend/src/app/app.config.ts` and navigated through `frontend/src/app/app.routes.ts`. `frontend/src/app/core/services/order.service.ts` is the frontend/API boundary, using shared order models from `frontend/src/app/core/models/order.model.ts` to call the REST endpoints. UI feature components separate read and mutation workflows: `frontend/src/app/features/orders/order-list.component.ts` handles list/filter/delete behavior, while `frontend/src/app/features/orders/order-form.component.ts` handles create and edit submission.

#### Runtime Topology
The browser serves the Angular app on port 4200 and issues HTTP requests to the .NET API on port 5080. The API composes controllers, application services, and EF Core infrastructure, then connects to PostgreSQL on port 5432. Key deployment/runtime configuration is in `backend/src/OrderManagement.Api/appsettings.json` and `docker-compose.yml`.

Main entry points: [`backend/src/OrderManagement.Api/Controllers/OrdersController.cs`](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Controllers/OrdersController.cs) (Orders controller), [`frontend/src/app/app.config.ts`](https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/app.config.ts) (App config & routes), [`backend/src/OrderManagement.Application/Services/OrderService.cs`](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Application/Services/OrderService.cs) (Order service), [`backend/src/OrderManagement.Infrastructure/Repositories/OrderRepository.cs`](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/Repositories/OrderRepository.cs) (Order repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Angular SPA"]
  node_browser(("Browser<br/>runtime"))
  node_angular_bootstrap["Angular bootstrap<br/>frontend entry<br/>[main.ts]"]
  node_angular_config_routes["App config &amp; routes<br/>SPA configuration<br/>[app.config.ts]"]
  node_order_list["Order list<br/>read UI"]
  node_order_form["Order form<br/>mutation UI"]
  node_frontend_order_service["Order API service<br/>HTTP client boundary<br/>[order.service.ts]"]
end

subgraph group_api[".NET API"]
  node_api_startup["API startup<br/>composition root<br/>[Program.cs]"]
  node_orders_controller["Orders controller<br/>MVC transport"]
  node_exception_handler["Global exception handler<br/>HTTP error boundary"]
end

subgraph group_backend["Clean Architecture"]
  node_order_service["Order service<br/>application use cases<br/>[OrderService.cs]"]
  node_order_repository_contract["Order repository contract<br/>persistence abstraction"]
  node_order_domain["Order aggregate<br/>domain model<br/>[Order.cs]"]
  node_infrastructure_di["Infrastructure registration<br/>dependency wiring"]
  node_order_repository["Order repository<br/>EF persistence adapter<br/>[OrderRepository.cs]"]
  node_order_db_context["Order DbContext<br/>EF Core mapping<br/>[OrderDbContext.cs]"]
end

subgraph group_data["Database Runtime"]
  node_postgres[("PostgreSQL 18<br/>external state service")]
  node_schema_init["Schema initialization<br/>database schema<br/>[001_init.sql]"]
  node_compose["Docker Compose<br/>runtime provisioning<br/>[docker-compose.yml]"]
end

node_browser -->|"loads"| node_angular_bootstrap
node_angular_bootstrap -->|"initializes"| node_angular_config_routes
node_angular_config_routes -->|"routes to"| node_order_list
node_angular_config_routes -->|"routes to"| node_order_form
node_order_list -->|"list/filter/delete"| node_frontend_order_service
node_order_form -->|"create/edit"| node_frontend_order_service
node_frontend_order_service -->|"HTTP /api/orders"| node_orders_controller
node_api_startup -->|"hosts"| node_orders_controller
node_api_startup -->|"invokes"| node_infrastructure_di
node_orders_controller -->|"application DTOs"| node_order_service
node_exception_handler -.->|"translates failures"| node_orders_controller
node_order_service -->|"depends on"| node_order_repository_contract
node_order_service -->|"maps and applies semantics"| node_order_domain
node_infrastructure_di -->|"registers implementation"| node_order_repository
node_order_repository -.->|"implements"| node_order_repository_contract
node_order_repository -->|"uses"| node_order_db_context
node_order_db_context -->|"EF Core connection"| node_postgres
node_compose -->|"provisions"| node_postgres
node_schema_init -->|"initializes"| node_postgres

click node_angular_bootstrap "https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/main.ts"
click node_angular_config_routes "https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/app.config.ts"
click node_order_list "https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/features/orders/order-list.component.ts"
click node_order_form "https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/features/orders/order-form.component.ts"
click node_frontend_order_service "https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/core/services/order.service.ts"
click node_api_startup "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Program.cs"
click node_orders_controller "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Controllers/OrdersController.cs"
click node_exception_handler "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Infrastructure/GlobalExceptionHandler.cs"
click node_order_service "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Application/Services/OrderService.cs"
click node_order_repository_contract "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Application/Abstractions/IOrderRepository.cs"
click node_order_domain "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Domain/Entities/Order.cs"
click node_infrastructure_di "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/DependencyInjection.cs"
click node_order_repository "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/Repositories/OrderRepository.cs"
click node_order_db_context "https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/Persistence/OrderDbContext.cs"
click node_schema_init "https://github.com/fadarve1/prueba-tecnica/blob/main/001_init.sql"
click node_compose "https://github.com/fadarve1/prueba-tecnica/blob/main/docker-compose.yml"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_browser,node_angular_bootstrap,node_angular_config_routes,node_order_list,node_order_form,node_frontend_order_service toneBlue
class node_api_startup,node_orders_controller,node_exception_handler toneAmber
class node_order_service,node_order_repository_contract,node_order_domain,node_infrastructure_di,node_order_repository,node_order_db_context toneMint
class node_postgres,node_schema_init,node_compose toneRose
```

## Components

### Angular SPA

- **Browser**: runtime · Serves the SPA on port 4200.
- [Angular bootstrap](https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/main.ts): frontend entry · `frontend/src/main.ts`
- [App config & routes](https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/app.config.ts): SPA configuration · `frontend/src/app/app.config.ts`
- [Order list](https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/features/orders/order-list.component.ts): read UI · Lists, filters, and deletes orders. · `frontend/src/app/features/orders/order-list.component.ts`
- [Order form](https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/features/orders/order-form.component.ts): mutation UI · Creates and edits orders. · `frontend/src/app/features/orders/order-form.component.ts`
- [Order API service](https://github.com/fadarve1/prueba-tecnica/blob/main/frontend/src/app/core/services/order.service.ts): HTTP client boundary · Uses shared order models for REST calls. · `frontend/src/app/core/services/order.service.ts`

### .NET API

- [API startup](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Program.cs): composition root · Runs the .NET API on port 5080. · `backend/src/OrderManagement.Api/Program.cs`
- [Orders controller](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Controllers/OrdersController.cs): MVC transport · Exposes CRUD and filtered search at /api/orders. · `backend/src/OrderManagement.Api/Controllers/OrdersController.cs`
- [Global exception handler](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Api/Infrastructure/GlobalExceptionHandler.cs): HTTP error boundary · `backend/src/OrderManagement.Api/Infrastructure/GlobalExceptionHandler.cs`

### Clean Architecture

- [Order service](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Application/Services/OrderService.cs): application use cases · Orchestrates list, read, save/update, and delete operations. · `backend/src/OrderManagement.Application/Services/OrderService.cs`
- [Order repository contract](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Application/Abstractions/IOrderRepository.cs): persistence abstraction · `backend/src/OrderManagement.Application/Abstractions/IOrderRepository.cs`
- [Order aggregate](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Domain/Entities/Order.cs): domain model · Order, items, and status semantics remain infrastructure-free. · `backend/src/OrderManagement.Domain/Entities/Order.cs`
- [Infrastructure registration](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/DependencyInjection.cs): dependency wiring · `backend/src/OrderManagement.Infrastructure/DependencyInjection.cs`
- [Order repository](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/Repositories/OrderRepository.cs): EF persistence adapter · `backend/src/OrderManagement.Infrastructure/Repositories/OrderRepository.cs`
- [Order DbContext](https://github.com/fadarve1/prueba-tecnica/blob/main/backend/src/OrderManagement.Infrastructure/Persistence/OrderDbContext.cs): EF Core mapping · Persists the aggregate using entity configurations. · `backend/src/OrderManagement.Infrastructure/Persistence/OrderDbContext.cs`

### Database Runtime

- **PostgreSQL 18**: external state service · Database runtime on port 5432.
- [Schema initialization](https://github.com/fadarve1/prueba-tecnica/blob/main/001_init.sql): database schema · Establishes schema, constraints, indexes, and database logic. · `001_init.sql`
- [Docker Compose](https://github.com/fadarve1/prueba-tecnica/blob/main/docker-compose.yml): runtime provisioning · Provisions PostgreSQL. · `docker-compose.yml`

## Connections

- Browser → Angular bootstrap: loads
- Angular bootstrap → App config & routes: initializes
- App config & routes → Order list: routes to
- App config & routes → Order form: routes to
- Order list → Order API service: list/filter/delete
- Order form → Order API service: create/edit
- Order API service → Orders controller: HTTP /api/orders
- API startup → Orders controller: hosts
- API startup → Infrastructure registration: invokes
- Orders controller → Order service: application DTOs
- Global exception handler → Orders controller: translates failures
- Order service → Order repository contract: depends on
- Order service → Order aggregate: maps and applies semantics
- Infrastructure registration → Order repository: registers implementation
- Order repository → Order repository contract: implements
- Order repository → Order DbContext: uses
- Order DbContext → PostgreSQL 18: EF Core connection
- Docker Compose → PostgreSQL 18: provisions
- Schema initialization → PostgreSQL 18: initializes
