# jaimir14/scm-api architecture

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

- Interactive diagram: https://gitdiagram.com/jaimir14/scm-api
- Repository: https://github.com/jaimir14/scm-api

## Overview

This is a Fastify API for clinic/doctor tenants, with each deployment configured to use its own MySQL schema. The main workflow is a client request reaching the server, passing through registered routes, and—on patient endpoints—JWT authentication and input validation before patient services read or change database records. The API also provides a development token endpoint and health check. The README documents pagination and schema-per-tenant isolation; sampled source confirms route, service, and database-client responsibilities, but not the Prisma client’s internal connection wiring.

Main entry points: [`src/app.ts`](https://github.com/jaimir14/scm-api/blob/main/src/app.ts) (Fastify app), [`src/modules/patients/patient.routes.ts`](https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.routes.ts) (Patient routes), [`src/server.ts`](https://github.com/jaimir14/scm-api/blob/main/src/server.ts) (Server startup), [`src/plugins/jwt.ts`](https://github.com/jaimir14/scm-api/blob/main/src/plugins/jwt.ts) (JWT plugin)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["API runtime"]
  node_server["Server startup<br/>[server.ts]"]
  node_app["Fastify app<br/>[app.ts]"]
  node_errors["Error handling<br/>[error-handler.ts]"]
end

subgraph group_identity["Authentication"]
  node_auth_routes["Token endpoint<br/>[auth.routes.ts]"]
  node_auth_guard["JWT guard<br/>[auth.guard.ts]"]
  node_jwt_plugin["JWT plugin<br/>[jwt.ts]"]
end

subgraph group_patients["Patient management"]
  node_patient_routes["Patient routes<br/>[patient.routes.ts]"]
  node_patient_schema["Patient validation<br/>[patient.schema.ts]"]
  node_pagination_schema["Pagination validation"]
  node_patient_service["Patient service<br/>[patient.service.ts]"]
end

subgraph group_persistence["Configuration and data"]
  node_config["Environment config<br/>[env.ts]"]
  node_prisma_client["Prisma client<br/>[prisma.ts]"]
  node_patient_model["Patient model<br/>[schema.prisma]"]
end

node_client(("API client"))
node_mysql[("Tenant MySQL")]

node_client -->|"sends requests"| node_server
node_server -->|"builds app"| node_app
node_server -->|"reads settings"| node_config
node_app -->|"reads settings"| node_config
node_app -->|"registers routes"| node_auth_routes
node_app -->|"registers routes"| node_patient_routes
node_app -->|"registers plugin"| node_jwt_plugin
node_app -->|"sets handler"| node_errors
node_auth_routes -->|"signs token"| node_jwt_plugin
node_patient_routes -->|"checks requests"| node_auth_guard
node_auth_guard -->|"verifies token"| node_jwt_plugin
node_patient_routes -->|"validates input"| node_patient_schema
node_patient_routes -->|"validates query"| node_pagination_schema
node_patient_routes -->|"calls operations"| node_patient_service
node_patient_service -->|"queries records"| node_prisma_client
node_prisma_client -->|"accesses tenant schema"| node_mysql
node_patient_model -.->|"defines data shape"| node_mysql

click node_server "https://github.com/jaimir14/scm-api/blob/main/src/server.ts"
click node_app "https://github.com/jaimir14/scm-api/blob/main/src/app.ts"
click node_errors "https://github.com/jaimir14/scm-api/blob/main/src/common/middleware/error-handler.ts"
click node_auth_routes "https://github.com/jaimir14/scm-api/blob/main/src/modules/auth/auth.routes.ts"
click node_auth_guard "https://github.com/jaimir14/scm-api/blob/main/src/modules/auth/auth.guard.ts"
click node_jwt_plugin "https://github.com/jaimir14/scm-api/blob/main/src/plugins/jwt.ts"
click node_patient_routes "https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.routes.ts"
click node_patient_schema "https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.schema.ts"
click node_pagination_schema "https://github.com/jaimir14/scm-api/blob/main/src/common/schemas/pagination.schema.ts"
click node_patient_service "https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.service.ts"
click node_config "https://github.com/jaimir14/scm-api/blob/main/src/config/env.ts"
click node_prisma_client "https://github.com/jaimir14/scm-api/blob/main/src/database/prisma.ts"
click node_patient_model "https://github.com/jaimir14/scm-api/blob/main/prisma/schema.prisma"

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_server,node_app,node_errors,node_client toneBlue
class node_auth_routes,node_auth_guard,node_jwt_plugin,node_mysql toneAmber
class node_patient_routes,node_patient_schema,node_pagination_schema,node_patient_service toneMint
class node_config,node_prisma_client,node_patient_model toneRose
```

## Components

### API runtime

- [Server startup](https://github.com/jaimir14/scm-api/blob/main/src/server.ts): `src/server.ts`
- [Fastify app](https://github.com/jaimir14/scm-api/blob/main/src/app.ts): `src/app.ts`
- [Error handling](https://github.com/jaimir14/scm-api/blob/main/src/common/middleware/error-handler.ts): `src/common/middleware/error-handler.ts`

### Authentication

- [Token endpoint](https://github.com/jaimir14/scm-api/blob/main/src/modules/auth/auth.routes.ts): `src/modules/auth/auth.routes.ts`
- [JWT guard](https://github.com/jaimir14/scm-api/blob/main/src/modules/auth/auth.guard.ts): `src/modules/auth/auth.guard.ts`
- [JWT plugin](https://github.com/jaimir14/scm-api/blob/main/src/plugins/jwt.ts): `src/plugins/jwt.ts`

### Patient management

- [Patient routes](https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.routes.ts): `src/modules/patients/patient.routes.ts`
- [Patient validation](https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.schema.ts): `src/modules/patients/patient.schema.ts`
- [Pagination validation](https://github.com/jaimir14/scm-api/blob/main/src/common/schemas/pagination.schema.ts): `src/common/schemas/pagination.schema.ts`
- [Patient service](https://github.com/jaimir14/scm-api/blob/main/src/modules/patients/patient.service.ts): `src/modules/patients/patient.service.ts`

### Configuration and data

- [Environment config](https://github.com/jaimir14/scm-api/blob/main/src/config/env.ts): `src/config/env.ts`
- [Prisma client](https://github.com/jaimir14/scm-api/blob/main/src/database/prisma.ts): `src/database/prisma.ts`
- [Patient model](https://github.com/jaimir14/scm-api/blob/main/prisma/schema.prisma): `prisma/schema.prisma`

### Other components

- **API client**
- **Tenant MySQL**

## Connections

- API client → Server startup: sends requests
- Server startup → Fastify app: builds app
- Server startup → Environment config: reads settings
- Fastify app → Environment config: reads settings
- Fastify app → Token endpoint: registers routes
- Fastify app → Patient routes: registers routes
- Fastify app → JWT plugin: registers plugin
- Fastify app → Error handling: sets handler
- Token endpoint → JWT plugin: signs token
- Patient routes → JWT guard: checks requests
- JWT guard → JWT plugin: verifies token
- Patient routes → Patient validation: validates input
- Patient routes → Pagination validation: validates query
- Patient routes → Patient service: calls operations
- Patient service → Prisma client: queries records
- Prisma client → Tenant MySQL: accesses tenant schema
- Patient model → Tenant MySQL: defines data shape
