# ajibare/business-platform-api architecture

> Architecture diagram of the GitHub repository ajibare/business-platform-api, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ajibare/business-platform-api
- Repository: https://github.com/ajibare/business-platform-api

## Overview

This is a NestJS REST API for a multi-product SaaS platform, with Pharmacy Stock Intelligence as its first product. Users call versioned API endpoints; authentication and organisation-role checks protect pharmacy operations, which cover medicine and supplier records, receipts, batches, inventory movements, stock counts, expiry monitoring and reports. Services use Prisma for persistence. The README names broader platform capabilities, but their implementations were not sampled, so those are shown as a single platform subsystem. Links reflect documented wiring or indexed source references; unsampled internals are not inferred.

Main entry points: [`src/app.module.ts`](https://github.com/ajibare/business-platform-api/blob/main/src/app.module.ts) (NestJS application), [`src/common/guards/roles.guard.ts`](https://github.com/ajibare/business-platform-api/blob/main/src/common/guards/roles.guard.ts) (Role guard), [`src/common/guards/jwt-auth.guard.ts`](https://github.com/ajibare/business-platform-api/blob/main/src/common/guards/jwt-auth.guard.ts) (JWT guard), [`src/modules/products/pharmacy/medicines/medicines.controller.ts`](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/medicines/medicines.controller.ts) (Medicine endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["API runtime"]
  node_api["NestJS application<br/>[app.module.ts]"]
end

subgraph group_identity["Identity and access"]
  node_auth_api["Auth endpoints<br/>[auth.controller.ts]"]
  node_auth_logic["Authentication<br/>[auth.service.ts]"]
  node_jwt_guard["JWT guard<br/>[jwt-auth.guard.ts]"]
  node_roles_guard["Role guard<br/>[roles.guard.ts]"]
  node_current_user["User context"]
  node_role_metadata["Role metadata<br/>[roles.decorator.ts]"]
end

subgraph group_platform["SaaS platform"]
  node_platform_services["Platform services"]
end

subgraph group_pharmacy["Pharmacy operations"]
  node_medicine_api["Medicine endpoints"]
  node_medicine_logic["Medicine catalogue"]
  node_supplier_api["Supplier endpoints"]
  node_supplier_logic["Supplier records"]
  node_receipt_api["Receipt endpoints"]
  node_receipt_logic["Receipt processing"]
  node_batch_api["Batch endpoints"]
  node_batch_logic["Batch records<br/>[batches.service.ts]"]
  node_inventory_api["Movement endpoints"]
  node_inventory_logic["Inventory movements"]
  node_count_api["Stock count endpoints"]
  node_count_logic["Stock counts<br/>[counts.service.ts]"]
  node_expiry_api["Expiry endpoints"]
  node_expiry_logic["Expiry monitoring<br/>[expiry.service.ts]"]
  node_report_api["Report endpoints"]
  node_report_logic["Pharmacy reports<br/>[reports.service.ts]"]
end

subgraph group_data["Persistence"]
  node_prisma["Prisma service<br/>[prisma.service.ts]"]
  node_postgres[("PostgreSQL")]
end

node_client(("API client"))

node_client -->|"calls"| node_auth_api
node_client -->|"calls"| node_medicine_api
node_client -->|"calls"| node_supplier_api
node_client -->|"calls"| node_receipt_api
node_client -->|"calls"| node_batch_api
node_client -->|"calls"| node_inventory_api
node_client -->|"calls"| node_count_api
node_client -->|"calls"| node_expiry_api
node_client -->|"calls"| node_report_api
node_api -->|"registers"| node_auth_api
node_api -->|"registers"| node_platform_services
node_api -->|"registers"| node_medicine_api
node_api -->|"registers"| node_supplier_api
node_api -->|"registers"| node_receipt_api
node_api -->|"registers"| node_batch_api
node_api -->|"registers"| node_inventory_api
node_api -->|"registers"| node_count_api
node_api -->|"registers"| node_expiry_api
node_api -->|"registers"| node_report_api
node_auth_api -->|"delegates to"| node_auth_logic
node_medicine_api -->|"delegates to"| node_medicine_logic
node_supplier_api -->|"delegates to"| node_supplier_logic
node_receipt_api -->|"delegates to"| node_receipt_logic
node_batch_api -->|"delegates to"| node_batch_logic
node_inventory_api -->|"delegates to"| node_inventory_logic
node_count_api -->|"delegates to"| node_count_logic
node_expiry_api -->|"delegates to"| node_expiry_logic
node_report_api -->|"delegates to"| node_report_logic
node_medicine_api -->|"guards with"| node_jwt_guard
node_supplier_api -->|"guards with"| node_jwt_guard
node_receipt_api -->|"guards with"| node_jwt_guard
node_batch_api -->|"guards with"| node_jwt_guard
node_inventory_api -->|"guards with"| node_jwt_guard
node_count_api -->|"guards with"| node_jwt_guard
node_expiry_api -->|"guards with"| node_jwt_guard
node_report_api -->|"guards with"| node_jwt_guard
node_medicine_api -->|"guards with"| node_roles_guard
node_supplier_api -->|"guards with"| node_roles_guard
node_receipt_api -->|"guards with"| node_roles_guard
node_batch_api -->|"guards with"| node_roles_guard
node_inventory_api -->|"guards with"| node_roles_guard
node_count_api -->|"guards with"| node_roles_guard
node_expiry_api -->|"guards with"| node_roles_guard
node_report_api -->|"guards with"| node_roles_guard
node_medicine_api -->|"extracts context"| node_current_user
node_supplier_api -->|"extracts context"| node_current_user
node_count_api -->|"sets roles"| node_role_metadata
node_roles_guard -->|"reads roles"| node_role_metadata

click node_api "https://github.com/ajibare/business-platform-api/blob/main/src/app.module.ts"
click node_auth_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/platform/auth/auth.controller.ts"
click node_auth_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/platform/auth/auth.service.ts"
click node_jwt_guard "https://github.com/ajibare/business-platform-api/blob/main/src/common/guards/jwt-auth.guard.ts"
click node_roles_guard "https://github.com/ajibare/business-platform-api/blob/main/src/common/guards/roles.guard.ts"
click node_current_user "https://github.com/ajibare/business-platform-api/blob/main/src/common/decorators/current-user.decorator.ts"
click node_role_metadata "https://github.com/ajibare/business-platform-api/blob/main/src/common/decorators/roles.decorator.ts"
click node_platform_services "https://github.com/ajibare/business-platform-api/tree/main/src/modules/platform"
click node_medicine_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/medicines/medicines.controller.ts"
click node_medicine_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/medicines/medicines.service.ts"
click node_supplier_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/suppliers/suppliers.controller.ts"
click node_supplier_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/suppliers/suppliers.service.ts"
click node_receipt_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/receipts/receipts.controller.ts"
click node_receipt_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/receipts/receipts.service.ts"
click node_batch_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/batches/batches.controller.ts"
click node_batch_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/batches/batches.service.ts"
click node_inventory_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/inventory/inventory.controller.ts"
click node_inventory_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/inventory/inventory.service.ts"
click node_count_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/counts/counts.controller.ts"
click node_count_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/counts/counts.service.ts"
click node_expiry_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/expiry/expiry.controller.ts"
click node_expiry_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/expiry/expiry.service.ts"
click node_report_api "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/reports/reports.controller.ts"
click node_report_logic "https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/reports/reports.service.ts"
click node_prisma "https://github.com/ajibare/business-platform-api/blob/main/src/database/prisma.service.ts"

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_api,node_client toneBlue
class node_auth_api,node_auth_logic,node_jwt_guard,node_roles_guard,node_current_user,node_role_metadata toneAmber
class node_platform_services toneMint
class node_medicine_api,node_medicine_logic,node_supplier_api,node_supplier_logic,node_receipt_api,node_receipt_logic,node_batch_api,node_batch_logic,node_inventory_api,node_inventory_logic,node_count_api,node_count_logic,node_expiry_api,node_expiry_logic,node_report_api,node_report_logic toneRose
class node_prisma,node_postgres toneIndigo
```

## Components

### API runtime

- [NestJS application](https://github.com/ajibare/business-platform-api/blob/main/src/app.module.ts): `src/app.module.ts`

### Identity and access

- [Auth endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/platform/auth/auth.controller.ts): `src/modules/platform/auth/auth.controller.ts`
- [Authentication](https://github.com/ajibare/business-platform-api/blob/main/src/modules/platform/auth/auth.service.ts): `src/modules/platform/auth/auth.service.ts`
- [JWT guard](https://github.com/ajibare/business-platform-api/blob/main/src/common/guards/jwt-auth.guard.ts): `src/common/guards/jwt-auth.guard.ts`
- [Role guard](https://github.com/ajibare/business-platform-api/blob/main/src/common/guards/roles.guard.ts): `src/common/guards/roles.guard.ts`
- [User context](https://github.com/ajibare/business-platform-api/blob/main/src/common/decorators/current-user.decorator.ts): `src/common/decorators/current-user.decorator.ts`
- [Role metadata](https://github.com/ajibare/business-platform-api/blob/main/src/common/decorators/roles.decorator.ts): `src/common/decorators/roles.decorator.ts`

### SaaS platform

- [Platform services](https://github.com/ajibare/business-platform-api/tree/main/src/modules/platform): `src/modules/platform`

### Pharmacy operations

- [Medicine endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/medicines/medicines.controller.ts): `src/modules/products/pharmacy/medicines/medicines.controller.ts`
- [Medicine catalogue](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/medicines/medicines.service.ts): `src/modules/products/pharmacy/medicines/medicines.service.ts`
- [Supplier endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/suppliers/suppliers.controller.ts): `src/modules/products/pharmacy/suppliers/suppliers.controller.ts`
- [Supplier records](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/suppliers/suppliers.service.ts): `src/modules/products/pharmacy/suppliers/suppliers.service.ts`
- [Receipt endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/receipts/receipts.controller.ts): `src/modules/products/pharmacy/receipts/receipts.controller.ts`
- [Receipt processing](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/receipts/receipts.service.ts): `src/modules/products/pharmacy/receipts/receipts.service.ts`
- [Batch endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/batches/batches.controller.ts): `src/modules/products/pharmacy/batches/batches.controller.ts`
- [Batch records](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/batches/batches.service.ts): `src/modules/products/pharmacy/batches/batches.service.ts`
- [Movement endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/inventory/inventory.controller.ts): `src/modules/products/pharmacy/inventory/inventory.controller.ts`
- [Inventory movements](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/inventory/inventory.service.ts): `src/modules/products/pharmacy/inventory/inventory.service.ts`
- [Stock count endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/counts/counts.controller.ts): `src/modules/products/pharmacy/counts/counts.controller.ts`
- [Stock counts](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/counts/counts.service.ts): `src/modules/products/pharmacy/counts/counts.service.ts`
- [Expiry endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/expiry/expiry.controller.ts): `src/modules/products/pharmacy/expiry/expiry.controller.ts`
- [Expiry monitoring](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/expiry/expiry.service.ts): `src/modules/products/pharmacy/expiry/expiry.service.ts`
- [Report endpoints](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/reports/reports.controller.ts): `src/modules/products/pharmacy/reports/reports.controller.ts`
- [Pharmacy reports](https://github.com/ajibare/business-platform-api/blob/main/src/modules/products/pharmacy/reports/reports.service.ts): `src/modules/products/pharmacy/reports/reports.service.ts`

### Persistence

- [Prisma service](https://github.com/ajibare/business-platform-api/blob/main/src/database/prisma.service.ts): `src/database/prisma.service.ts`
- **PostgreSQL**

### Other components

- **API client**

## Connections

- API client → Auth endpoints: calls (evidence: `README.md`)
- API client → Medicine endpoints: calls (evidence: `README.md`)
- API client → Supplier endpoints: calls (evidence: `README.md`)
- API client → Receipt endpoints: calls (evidence: `README.md`)
- API client → Batch endpoints: calls (evidence: `README.md`)
- API client → Movement endpoints: calls (evidence: `README.md`)
- API client → Stock count endpoints: calls (evidence: `README.md`)
- API client → Expiry endpoints: calls (evidence: `README.md`)
- API client → Report endpoints: calls (evidence: `README.md`)
- NestJS application → Auth endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Platform services: registers (evidence: `src/app.module.ts`)
- NestJS application → Medicine endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Supplier endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Receipt endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Batch endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Movement endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Stock count endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Expiry endpoints: registers (evidence: `src/app.module.ts`)
- NestJS application → Report endpoints: registers (evidence: `src/app.module.ts`)
- Auth endpoints → Authentication: delegates to (evidence: `src/modules/platform/auth/auth.controller.ts`)
- Medicine endpoints → Medicine catalogue: delegates to (evidence: `src/modules/products/pharmacy/medicines/medicines.controller.ts`)
- Supplier endpoints → Supplier records: delegates to (evidence: `src/modules/products/pharmacy/suppliers/suppliers.controller.ts`)
- Receipt endpoints → Receipt processing: delegates to (evidence: `src/modules/products/pharmacy/receipts/receipts.controller.ts`)
- Batch endpoints → Batch records: delegates to (evidence: `src/modules/products/pharmacy/batches/batches.controller.ts`)
- Movement endpoints → Inventory movements: delegates to (evidence: `src/modules/products/pharmacy/inventory/inventory.controller.ts`)
- Stock count endpoints → Stock counts: delegates to (evidence: `src/modules/products/pharmacy/counts/counts.controller.ts`)
- Expiry endpoints → Expiry monitoring: delegates to (evidence: `src/modules/products/pharmacy/expiry/expiry.controller.ts`)
- Report endpoints → Pharmacy reports: delegates to (evidence: `src/modules/products/pharmacy/reports/reports.controller.ts`)
- Medicine endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/medicines/medicines.controller.ts`)
- Supplier endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/suppliers/suppliers.controller.ts`)
- Receipt endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/receipts/receipts.controller.ts`)
- Batch endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/batches/batches.controller.ts`)
- Movement endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/inventory/inventory.controller.ts`)
- Stock count endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/counts/counts.controller.ts`)
- Expiry endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/expiry/expiry.controller.ts`)
- Report endpoints → JWT guard: guards with (evidence: `src/modules/products/pharmacy/reports/reports.controller.ts`)
- Medicine endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/medicines/medicines.controller.ts`)
- Supplier endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/suppliers/suppliers.controller.ts`)
- Receipt endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/receipts/receipts.controller.ts`)
- Batch endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/batches/batches.controller.ts`)
- Movement endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/inventory/inventory.controller.ts`)
- Stock count endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/counts/counts.controller.ts`)
- Expiry endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/expiry/expiry.controller.ts`)
- Report endpoints → Role guard: guards with (evidence: `src/modules/products/pharmacy/reports/reports.controller.ts`)
- Medicine endpoints → User context: extracts context (evidence: `src/modules/products/pharmacy/medicines/medicines.controller.ts`)
- Supplier endpoints → User context: extracts context (evidence: `src/modules/products/pharmacy/suppliers/suppliers.controller.ts`)
- Stock count endpoints → Role metadata: sets roles (evidence: `src/modules/products/pharmacy/counts/counts.controller.ts`)
- Role guard → Role metadata: reads roles (evidence: `src/common/guards/roles.guard.ts`)
