# ay2627s1-cs3219-p8/foc architecture

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

- Interactive diagram: https://gitdiagram.com/ay2627s1-cs3219-p8/foc
- Repository: https://github.com/ay2627s1-cs3219-p8/foc

## Overview

Friend on Campus (FoC) is a campus errand platform: students request collection and delivery, other students fulfil requests, and credits circulate in a closed economy. The visible frontend provides home, request, store-directory, and order screens; its mock-data module indicates the sampled UI is not evidence of live service integration. The User Service implements account, session, profile, and administrator operations. Supplier Service is represented here only by its app setup and health route. Order and credit services are README capabilities but have no source paths in the supplied tree, so their implementation is not mapped.

Main entry points: [`user-service/app/routes/users.py`](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/routes/users.py) (Account routes), [`user-service/app/services/users.py`](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/users.py) (User operations), [`user-service/app/models.py`](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/models.py) (User models), [`user-service/app/auth.py`](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/auth.py) (Session auth)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Student frontend"]
  node_home["Home screen<br/>[page.tsx]"]
  node_request["Errand request<br/>[page.tsx]"]
  node_storepage["Store request<br/>[page.tsx]"]
  node_directory["Store directory"]
  node_orderspage["Orders screen<br/>[page.tsx]"]
  node_feed["Favor feed<br/>[favor-feed.tsx]"]
  node_errand["Request form<br/>[request-errand.tsx]"]
  node_errandlist["Errand list<br/>[errand-list.tsx]"]
  node_mockdata["Mock data<br/>[mock-data.ts]"]
end

subgraph group_users["User service"]
  node_userapp["User API<br/>[main.py]"]
  node_useroutes["Account routes<br/>[users.py]"]
  node_userlogic["User operations<br/>[users.py]"]
  node_sessions["Session auth<br/>[auth.py]"]
  node_serviceauth["Service auth<br/>[service_auth.py]"]
  node_profiles["Profile responses<br/>[profiles.py]"]
  node_bootstrap["Admin bootstrap<br/>[bootstrap.py]"]
  node_schemas["User schemas<br/>[schemas.py]"]
  node_models["User models<br/>[models.py]"]
  node_userdb[("User database<br/>[db.py]")]
end

subgraph group_supplier["Supplier service"]
  node_supplierapp["Supplier app<br/>[main.py]"]
  node_supplierconfig["Supplier settings<br/>[config.py]"]
  node_health["Health route<br/>[health.py]"]
end

subgraph group_shared["Errand economy"]
  node_erranddomain["Errand fulfilment"]
  node_creditdomain["Closed credits"]
end

node_student(("Students"))

node_student -->|"requests errands"| node_request
node_student -->|"fulfils errands"| node_erranddomain
node_erranddomain -->|"circulates credits"| node_creditdomain
node_userapp -->|"registers routes"| node_useroutes
node_useroutes -->|"invokes operations"| node_userlogic
node_useroutes -->|"uses session auth"| node_sessions
node_useroutes -->|"guards service routes"| node_serviceauth
node_useroutes -->|"formats profiles"| node_profiles
node_useroutes -->|"validates payloads"| node_schemas
node_userlogic -->|"manages sessions"| node_sessions
node_userlogic -->|"reads and writes"| node_models
node_bootstrap -->|"hashes passwords"| node_userlogic
node_bootstrap -->|"creates admin"| node_models
node_sessions -->|"checks sessions"| node_models
node_models -->|"uses ORM base"| node_userdb
node_supplierapp -->|"registers route"| node_health
node_supplierapp -->|"loads settings"| node_supplierconfig

click node_home "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/home/page.tsx"
click node_request "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/request/page.tsx"
click node_storepage "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/request/store/page.tsx"
click node_directory "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/request/store-directory.tsx"
click node_orderspage "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/orders/page.tsx"
click node_feed "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/feed/favor-feed.tsx"
click node_errand "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/request/request-errand.tsx"
click node_errandlist "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/orders/errand-list.tsx"
click node_mockdata "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/lib/mock-data.ts"
click node_userapp "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/main.py"
click node_useroutes "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/routes/users.py"
click node_userlogic "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/users.py"
click node_sessions "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/auth.py"
click node_serviceauth "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/service_auth.py"
click node_profiles "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/profiles.py"
click node_bootstrap "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/bootstrap.py"
click node_schemas "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/schemas.py"
click node_models "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/models.py"
click node_userdb "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/db.py"
click node_supplierapp "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/supplier-service/app/main.py"
click node_supplierconfig "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/supplier-service/app/config.py"
click node_health "https://github.com/ay2627s1-cs3219-p8/foc/blob/main/supplier-service/app/routes/health.py"

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_home,node_request,node_storepage,node_directory,node_orderspage,node_feed,node_errand,node_errandlist,node_mockdata toneBlue
class node_userapp,node_useroutes,node_userlogic,node_sessions,node_serviceauth,node_profiles,node_bootstrap,node_schemas,node_models,node_userdb toneAmber
class node_supplierapp,node_supplierconfig,node_health toneMint
class node_erranddomain,node_creditdomain toneRose
class node_student toneIndigo
```

## Components

### Student frontend

- [Home screen](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/home/page.tsx): `frontend-service/app/(main)/home/page.tsx`
- [Errand request](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/request/page.tsx): `frontend-service/app/(main)/request/page.tsx`
- [Store request](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/request/store/page.tsx): `frontend-service/app/(main)/request/store/page.tsx`
- [Store directory](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/request/store-directory.tsx): `frontend-service/components/request/store-directory.tsx`
- [Orders screen](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/app/(main)/orders/page.tsx): `frontend-service/app/(main)/orders/page.tsx`
- [Favor feed](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/feed/favor-feed.tsx): `frontend-service/components/feed/favor-feed.tsx`
- [Request form](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/request/request-errand.tsx): `frontend-service/components/request/request-errand.tsx`
- [Errand list](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/components/orders/errand-list.tsx): `frontend-service/components/orders/errand-list.tsx`
- [Mock data](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/frontend-service/lib/mock-data.ts): `frontend-service/lib/mock-data.ts`

### User service

- [User API](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/main.py): `user-service/app/main.py`
- [Account routes](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/routes/users.py): `user-service/app/routes/users.py`
- [User operations](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/users.py): `user-service/app/services/users.py`
- [Session auth](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/auth.py): `user-service/app/auth.py`
- [Service auth](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/service_auth.py): `user-service/app/service_auth.py`
- [Profile responses](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/profiles.py): `user-service/app/services/profiles.py`
- [Admin bootstrap](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/services/bootstrap.py): `user-service/app/services/bootstrap.py`
- [User schemas](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/schemas.py): `user-service/app/schemas.py`
- [User models](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/models.py): `user-service/app/models.py`
- [User database](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/user-service/app/db.py): `user-service/app/db.py`

### Supplier service

- [Supplier app](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/supplier-service/app/main.py): `supplier-service/app/main.py`
- [Supplier settings](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/supplier-service/app/config.py): `supplier-service/app/config.py`
- [Health route](https://github.com/ay2627s1-cs3219-p8/foc/blob/main/supplier-service/app/routes/health.py): `supplier-service/app/routes/health.py`

### Errand economy

- **Errand fulfilment**
- **Closed credits**

### Other components

- **Students**

## Connections

- Students → Errand request: requests errands (evidence: `README.md`)
- Students → Errand fulfilment: fulfils errands (evidence: `README.md`)
- Errand fulfilment → Closed credits: circulates credits (evidence: `README.md`)
- User API → Account routes: registers routes (evidence: `user-service/app/main.py`)
- Account routes → User operations: invokes operations (evidence: `user-service/app/routes/users.py`)
- Account routes → Session auth: uses session auth (evidence: `user-service/app/routes/users.py`)
- Account routes → Service auth: guards service routes (evidence: `user-service/app/routes/users.py`)
- Account routes → Profile responses: formats profiles (evidence: `user-service/app/routes/users.py`)
- Account routes → User schemas: validates payloads (evidence: `user-service/app/routes/users.py`)
- User operations → Session auth: manages sessions (evidence: `user-service/app/services/users.py`)
- User operations → User models: reads and writes (evidence: `user-service/app/services/users.py`)
- Admin bootstrap → User operations: hashes passwords (evidence: `user-service/app/services/bootstrap.py`)
- Admin bootstrap → User models: creates admin (evidence: `user-service/app/services/bootstrap.py`)
- Session auth → User models: checks sessions (evidence: `user-service/app/auth.py`)
- User models → User database: uses ORM base (evidence: `user-service/app/models.py`)
- Supplier app → Health route: registers route (evidence: `supplier-service/app/main.py`)
- Supplier app → Supplier settings: loads settings (evidence: `supplier-service/app/main.py`)
