# fooxo-jpg/siranaba architecture

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

- Interactive diagram: https://gitdiagram.com/fooxo-jpg/siranaba
- Repository: https://github.com/fooxo-jpg/siranaba

## Overview

SiraNaBa is a facility portal with tenant self-service and role-gated administration. Tenants sign in, view building and account information, submit and track maintenance requests, manage bills and payments, and receive notifications; administrators manage tenants, staff, billing, and ticket dispatch. The React app calls a Spring Boot API backed by MongoDB. Gemini-assisted ticket triage is documented, but its precise caller wiring is only partly evidenced by the sampled source. The remaining admin screens use local mock data. Backend wiring for unsampled controllers and services is not expanded.

Main entry points: [`src/App.jsx`](https://github.com/fooxo-jpg/siranaba/blob/main/src/App.jsx) (Route and role gates), [`src/api/client.js`](https://github.com/fooxo-jpg/siranaba/blob/main/src/api/client.js) (HTTP client), [`src/api/endpoints.js`](https://github.com/fooxo-jpg/siranaba/blob/main/src/api/endpoints.js) (API endpoints), [`src/pages/admin`](https://github.com/fooxo-jpg/siranaba/tree/main/src/pages/admin) (Admin screens)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Portal experience"]
  node_app["Route and role gates<br/>[App.jsx]"]
  node_tenant_pages["Tenant screens"]
  node_admin_pages["Admin screens"]
  node_session["Session context<br/>[SessionContext.jsx]"]
  node_registry["Tenant registry"]
  node_admin_mock[("Local admin data<br/>[adminMockDb.js]")]
end

subgraph group_api["API access"]
  node_endpoints["API endpoints<br/>[endpoints.js]"]
  node_client["HTTP client<br/>[client.js]"]
end

subgraph group_identity["Identity and access"]
  node_auth_controller["Authentication API"]
  node_auth_service["Authentication service<br/>[AuthService.java]"]
  node_jwt["JWT handling<br/>[JwtService.java]"]
end

subgraph group_facility["Facility operations"]
  node_tenant_admin_api["Tenant management API"]
  node_tenant_admin["Tenant administration"]
  node_billing["Billing service"]
  node_triage["AI ticket triage"]
  node_ticket_api["Ticket operations"]
  node_admin_api["Admin operations"]
end

subgraph group_records["Persistent records"]
  node_user_repo[("User records")]
  node_mongo[("MongoDB")]
end

node_tenant(("Tenant"))
node_admin(("Administrator"))
node_gemini{{"Google Gemini"}}

node_tenant -->|"uses portal"| node_app
node_admin -->|"uses portal"| node_app
node_app -->|"checks session"| node_session
node_app -->|"routes tenant"| node_tenant_pages
node_app -->|"routes admin"| node_admin_pages
node_tenant_pages -->|"requests data"| node_endpoints
node_admin_pages -->|"requests data"| node_endpoints
node_admin_pages -.->|"reads mock data"| node_admin_mock
node_session -->|"loads profile"| node_endpoints
node_registry -->|"fetches tenant data"| node_endpoints
node_endpoints -->|"calls helpers"| node_client
node_client -->|"sends API requests"| node_auth_controller
node_auth_controller -->|"calls"| node_auth_service
node_auth_service -->|"reads and saves"| node_user_repo
node_auth_service -->|"generates token"| node_jwt
node_tenant_pages -->|"calls API"| node_client
node_admin_pages -->|"calls API"| node_client
node_client -->|"sends admin requests"| node_tenant_admin_api
node_tenant_admin_api -->|"delegates tenant work"| node_tenant_admin
node_tenant_admin -->|"reads and writes"| node_mongo
node_billing -->|"reads and writes"| node_mongo
node_ticket_api -->|"triages submissions"| node_triage
node_triage -.->|"requests assessment"| node_gemini
node_ticket_api -->|"ticket persistence"| node_mongo
node_admin_api -->|"admin ticket data"| node_mongo

click node_app "https://github.com/fooxo-jpg/siranaba/blob/main/src/App.jsx"
click node_tenant_pages "https://github.com/fooxo-jpg/siranaba/tree/main/src/pages"
click node_admin_pages "https://github.com/fooxo-jpg/siranaba/tree/main/src/pages/admin"
click node_session "https://github.com/fooxo-jpg/siranaba/blob/main/src/context/SessionContext.jsx"
click node_registry "https://github.com/fooxo-jpg/siranaba/blob/main/src/context/TenantRegistryContext.jsx"
click node_endpoints "https://github.com/fooxo-jpg/siranaba/blob/main/src/api/endpoints.js"
click node_client "https://github.com/fooxo-jpg/siranaba/blob/main/src/api/client.js"
click node_auth_controller "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/AuthController.java"
click node_auth_service "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/AuthService.java"
click node_jwt "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/security/JwtService.java"
click node_user_repo "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/repository/UserRepository.java"
click node_tenant_admin_api "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/AdminTenantController.java"
click node_tenant_admin "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/AdminTenantService.java"
click node_billing "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/BillingService.java"
click node_triage "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/GeminiTriageService.java"
click node_ticket_api "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/TicketController.java"
click node_admin_api "https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/AdminTicketController.java"
click node_admin_mock "https://github.com/fooxo-jpg/siranaba/blob/main/src/data/adminMockDb.js"

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_app,node_tenant_pages,node_admin_pages,node_session,node_registry,node_admin_mock toneBlue
class node_endpoints,node_client toneAmber
class node_auth_controller,node_auth_service,node_jwt toneMint
class node_tenant_admin_api,node_tenant_admin,node_billing,node_triage,node_ticket_api,node_admin_api toneRose
class node_user_repo,node_mongo,node_tenant,node_admin,node_gemini toneIndigo
```

## Components

### Portal experience

- [Route and role gates](https://github.com/fooxo-jpg/siranaba/blob/main/src/App.jsx): `src/App.jsx`
- [Tenant screens](https://github.com/fooxo-jpg/siranaba/tree/main/src/pages): `src/pages`
- [Admin screens](https://github.com/fooxo-jpg/siranaba/tree/main/src/pages/admin): `src/pages/admin`
- [Session context](https://github.com/fooxo-jpg/siranaba/blob/main/src/context/SessionContext.jsx): `src/context/SessionContext.jsx`
- [Tenant registry](https://github.com/fooxo-jpg/siranaba/blob/main/src/context/TenantRegistryContext.jsx): `src/context/TenantRegistryContext.jsx`
- [Local admin data](https://github.com/fooxo-jpg/siranaba/blob/main/src/data/adminMockDb.js): `src/data/adminMockDb.js`

### API access

- [API endpoints](https://github.com/fooxo-jpg/siranaba/blob/main/src/api/endpoints.js): `src/api/endpoints.js`
- [HTTP client](https://github.com/fooxo-jpg/siranaba/blob/main/src/api/client.js): `src/api/client.js`

### Identity and access

- [Authentication API](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/AuthController.java): `server/src/main/java/com/siranaba/backend/controller/AuthController.java`
- [Authentication service](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/AuthService.java): `server/src/main/java/com/siranaba/backend/service/AuthService.java`
- [JWT handling](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/security/JwtService.java): `server/src/main/java/com/siranaba/backend/security/JwtService.java`

### Facility operations

- [Tenant management API](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/AdminTenantController.java): `server/src/main/java/com/siranaba/backend/controller/AdminTenantController.java`
- [Tenant administration](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/AdminTenantService.java): `server/src/main/java/com/siranaba/backend/service/AdminTenantService.java`
- [Billing service](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/BillingService.java): `server/src/main/java/com/siranaba/backend/service/BillingService.java`
- [AI ticket triage](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/service/GeminiTriageService.java): `server/src/main/java/com/siranaba/backend/service/GeminiTriageService.java`
- [Ticket operations](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/TicketController.java): `server/src/main/java/com/siranaba/backend/controller/TicketController.java`
- [Admin operations](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/controller/AdminTicketController.java): `server/src/main/java/com/siranaba/backend/controller/AdminTicketController.java`

### Persistent records

- [User records](https://github.com/fooxo-jpg/siranaba/blob/main/server/src/main/java/com/siranaba/backend/repository/UserRepository.java): `server/src/main/java/com/siranaba/backend/repository/UserRepository.java`
- **MongoDB**

### Other components

- **Tenant**
- **Administrator**
- **Google Gemini**

## Connections

- Tenant → Route and role gates: uses portal
- Administrator → Route and role gates: uses portal
- Route and role gates → Session context: checks session
- Route and role gates → Tenant screens: routes tenant
- Route and role gates → Admin screens: routes admin
- Tenant screens → API endpoints: requests data
- Admin screens → API endpoints: requests data
- Admin screens → Local admin data: reads mock data
- Session context → API endpoints: loads profile
- Tenant registry → API endpoints: fetches tenant data
- API endpoints → HTTP client: calls helpers
- HTTP client → Authentication API: sends API requests
- Authentication API → Authentication service: calls
- Authentication service → User records: reads and saves
- Authentication service → JWT handling: generates token
- Tenant screens → HTTP client: calls API
- Admin screens → HTTP client: calls API
- HTTP client → Tenant management API: sends admin requests
- Tenant management API → Tenant administration: delegates tenant work
- Tenant administration → MongoDB: reads and writes
- Billing service → MongoDB: reads and writes
- Ticket operations → AI ticket triage: triages submissions
- AI ticket triage → Google Gemini: requests assessment
- Ticket operations → MongoDB: ticket persistence
- Admin operations → MongoDB: admin ticket data
