# adynu182/sigap-web architecture

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

- Interactive diagram: https://gitdiagram.com/adynu182/sigap-web
- Repository: https://github.com/adynu182/sigap-web

## Overview

SIGAP is a web app for SPPG teams to self-assess HACCP/GMP compliance and for administrators to verify accounts and manage assessment clauses. The main workflow is registration and approval, then answering clauses with findings and optional evidence photos, followed by a gap-map review and Excel results export. Admins also manage SPPG accounts and questions, and can back up data. The sampled source confirms key authentication, assessment, review, results, and question-management interactions; other admin page behavior is represented from the README and tree, with uncertain wiring omitted.

Main entry points: [`src/context/AuthProvider.tsx`](https://github.com/adynu182/sigap-web/blob/main/src/context/AuthProvider.tsx) (Auth and profile), [`src/app/assessment/page.tsx`](https://github.com/adynu182/sigap-web/blob/main/src/app/assessment/page.tsx) (Clause assessment), [`src/app/admin/page.tsx`](https://github.com/adynu182/sigap-web/blob/main/src/app/admin/page.tsx) (Admin dashboard), [`src/app/results/page.tsx`](https://github.com/adynu182/sigap-web/blob/main/src/app/results/page.tsx) (Results and export)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["Access and identity"]
  node_home["Home and entry<br/>[page.tsx]"]
  node_register["SPPG registration<br/>[page.tsx]"]
  node_login["Login<br/>[page.tsx]"]
  node_auth["Auth and profile<br/>[AuthProvider.tsx]"]
  node_pending["Pending notice<br/>[page.tsx]"]
  node_approved_guard["SPPG access guard"]
  node_admin_guard["Admin access guard<br/>[RequireAdmin.tsx]"]
  node_app_shell["App navigation<br/>[AppShell.tsx]"]
end

subgraph group_assessment["SPPG assessment"]
  node_assessment_page["Clause assessment<br/>[page.tsx]"]
  node_gap_map["Gap map<br/>[page.tsx]"]
  node_results["Results and export<br/>[page.tsx]"]
end

subgraph group_administration["Administration"]
  node_admin_dashboard["Admin dashboard<br/>[page.tsx]"]
  node_sppg_admin["SPPG approvals<br/>[page.tsx]"]
  node_sppg_detail["SPPG detail<br/>[page.tsx]"]
  node_question_admin["Question management<br/>[page.tsx]"]
  node_seed_questions["Seed clauses<br/>[seed-questions.ts]"]
end

subgraph group_services["Firebase services"]
  node_firebase_config["Firebase client<br/>[firebase.ts]"]
  node_firebase_auth(("Firebase Auth"))
  node_firestore[("Firestore")]
  node_storage[("Firebase Storage")]
  node_firestore_rules["Firestore rules<br/>[firestore.rules]"]
  node_storage_rules["Storage rules<br/>[storage.rules]"]
end

node_sppg_actor(("SPPG user"))
node_admin_actor(("Administrator"))

node_sppg_actor -->|"opens"| node_home
node_home -->|"starts registration"| node_register
node_home -->|"starts login"| node_login
node_sppg_actor -->|"submits details"| node_register
node_register -->|"registers account"| node_auth
node_auth -->|"uses client"| node_firebase_config
node_auth -->|"creates account"| node_firebase_auth
node_auth -->|"writes profile"| node_firestore
node_register -->|"routes after registration"| node_pending
node_sppg_actor -->|"submits credentials"| node_login
node_login -->|"signs in"| node_auth
node_auth -->|"authenticates"| node_firebase_auth
node_auth -->|"listens to profile"| node_firestore
node_auth -->|"pending status"| node_pending
node_approved_guard -->|"checks profile"| node_auth
node_admin_guard -->|"checks role"| node_auth
node_sppg_actor -->|"answers clauses"| node_assessment_page
node_assessment_page -->|"requires approval"| node_approved_guard
node_assessment_page -->|"reads questions and answers"| node_firestore
node_assessment_page -->|"writes answers"| node_firestore
node_assessment_page -.->|"uploads evidence"| node_storage
node_assessment_page -->|"opens map"| node_gap_map
node_gap_map -->|"requires approval"| node_approved_guard
node_gap_map -->|"reads clauses and answers"| node_firestore
node_sppg_actor -->|"views results"| node_results
node_results -->|"requires approval"| node_approved_guard
node_results -->|"reads clauses and answers"| node_firestore
node_results -->|"exports Excel"| node_results
node_admin_actor -->|"opens dashboard"| node_admin_dashboard
node_admin_dashboard -->|"requires admin"| node_admin_guard
node_admin_dashboard -->|"reads profiles and clauses"| node_firestore
node_admin_dashboard -->|"reads assessment backup data"| node_firestore
node_admin_dashboard -->|"opens approvals"| node_sppg_admin
node_admin_actor -->|"reviews registrations"| node_sppg_admin
node_sppg_admin -->|"requires admin"| node_admin_guard
node_sppg_admin -->|"manages profiles"| node_firestore
node_sppg_admin -->|"opens SPPG detail"| node_sppg_detail
node_sppg_detail -->|"requires admin"| node_admin_guard
node_admin_actor -->|"manages clauses"| node_question_admin
node_question_admin -->|"requires admin"| node_admin_guard
node_question_admin -->|"reads and writes clauses"| node_firestore
node_question_admin -->|"loads seed clauses"| node_seed_questions
node_seed_questions -->|"provides clauses"| node_question_admin
node_firebase_config -->|"connects"| node_firestore
node_firebase_config -->|"connects"| node_firebase_auth
node_firebase_config -.->|"connects"| node_storage
node_firestore_rules -->|"controls access"| node_firestore
node_storage_rules -.->|"controls access"| node_storage

click node_home "https://github.com/adynu182/sigap-web/blob/main/src/app/page.tsx"
click node_register "https://github.com/adynu182/sigap-web/blob/main/src/app/register/page.tsx"
click node_login "https://github.com/adynu182/sigap-web/blob/main/src/app/login/page.tsx"
click node_auth "https://github.com/adynu182/sigap-web/blob/main/src/context/AuthProvider.tsx"
click node_pending "https://github.com/adynu182/sigap-web/blob/main/src/app/pending/page.tsx"
click node_approved_guard "https://github.com/adynu182/sigap-web/blob/main/src/components/RequireApprovedSppg.tsx"
click node_admin_guard "https://github.com/adynu182/sigap-web/blob/main/src/components/RequireAdmin.tsx"
click node_app_shell "https://github.com/adynu182/sigap-web/blob/main/src/components/AppShell.tsx"
click node_assessment_page "https://github.com/adynu182/sigap-web/blob/main/src/app/assessment/page.tsx"
click node_gap_map "https://github.com/adynu182/sigap-web/blob/main/src/app/review/page.tsx"
click node_results "https://github.com/adynu182/sigap-web/blob/main/src/app/results/page.tsx"
click node_admin_dashboard "https://github.com/adynu182/sigap-web/blob/main/src/app/admin/page.tsx"
click node_sppg_admin "https://github.com/adynu182/sigap-web/blob/main/src/app/admin/sppg/page.tsx"
click node_sppg_detail "https://github.com/adynu182/sigap-web/blob/main/src/app/admin/sppg/%5Buid%5D/page.tsx"
click node_question_admin "https://github.com/adynu182/sigap-web/blob/main/src/app/admin/questions/page.tsx"
click node_seed_questions "https://github.com/adynu182/sigap-web/blob/main/src/lib/seed-questions.ts"
click node_firebase_config "https://github.com/adynu182/sigap-web/blob/main/src/lib/firebase.ts"
click node_firestore_rules "https://github.com/adynu182/sigap-web/blob/main/firestore.rules"
click node_storage_rules "https://github.com/adynu182/sigap-web/blob/main/storage.rules"

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_register,node_login,node_auth,node_pending,node_approved_guard,node_admin_guard,node_app_shell,node_sppg_actor toneBlue
class node_assessment_page,node_gap_map,node_results toneAmber
class node_admin_dashboard,node_sppg_admin,node_sppg_detail,node_question_admin,node_seed_questions toneMint
class node_firebase_config,node_firebase_auth,node_firestore,node_storage,node_firestore_rules,node_storage_rules toneRose
class node_admin_actor toneIndigo
```

## Components

### Access and identity

- [Home and entry](https://github.com/adynu182/sigap-web/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [SPPG registration](https://github.com/adynu182/sigap-web/blob/main/src/app/register/page.tsx): `src/app/register/page.tsx`
- [Login](https://github.com/adynu182/sigap-web/blob/main/src/app/login/page.tsx): `src/app/login/page.tsx`
- [Auth and profile](https://github.com/adynu182/sigap-web/blob/main/src/context/AuthProvider.tsx): `src/context/AuthProvider.tsx`
- [Pending notice](https://github.com/adynu182/sigap-web/blob/main/src/app/pending/page.tsx): `src/app/pending/page.tsx`
- [SPPG access guard](https://github.com/adynu182/sigap-web/blob/main/src/components/RequireApprovedSppg.tsx): `src/components/RequireApprovedSppg.tsx`
- [Admin access guard](https://github.com/adynu182/sigap-web/blob/main/src/components/RequireAdmin.tsx): `src/components/RequireAdmin.tsx`
- [App navigation](https://github.com/adynu182/sigap-web/blob/main/src/components/AppShell.tsx): `src/components/AppShell.tsx`

### SPPG assessment

- [Clause assessment](https://github.com/adynu182/sigap-web/blob/main/src/app/assessment/page.tsx): `src/app/assessment/page.tsx`
- [Gap map](https://github.com/adynu182/sigap-web/blob/main/src/app/review/page.tsx): `src/app/review/page.tsx`
- [Results and export](https://github.com/adynu182/sigap-web/blob/main/src/app/results/page.tsx): `src/app/results/page.tsx`

### Administration

- [Admin dashboard](https://github.com/adynu182/sigap-web/blob/main/src/app/admin/page.tsx): `src/app/admin/page.tsx`
- [SPPG approvals](https://github.com/adynu182/sigap-web/blob/main/src/app/admin/sppg/page.tsx): `src/app/admin/sppg/page.tsx`
- [SPPG detail](https://github.com/adynu182/sigap-web/blob/main/src/app/admin/sppg/%5Buid%5D/page.tsx): `src/app/admin/sppg/[uid]/page.tsx`
- [Question management](https://github.com/adynu182/sigap-web/blob/main/src/app/admin/questions/page.tsx): `src/app/admin/questions/page.tsx`
- [Seed clauses](https://github.com/adynu182/sigap-web/blob/main/src/lib/seed-questions.ts): `src/lib/seed-questions.ts`

### Firebase services

- [Firebase client](https://github.com/adynu182/sigap-web/blob/main/src/lib/firebase.ts): `src/lib/firebase.ts`
- **Firebase Auth**
- **Firestore**
- **Firebase Storage**
- [Firestore rules](https://github.com/adynu182/sigap-web/blob/main/firestore.rules): `firestore.rules`
- [Storage rules](https://github.com/adynu182/sigap-web/blob/main/storage.rules): `storage.rules`

### Other components

- **SPPG user**
- **Administrator**

## Connections

- SPPG user → Home and entry: opens
- Home and entry → SPPG registration: starts registration
- Home and entry → Login: starts login
- SPPG user → SPPG registration: submits details
- SPPG registration → Auth and profile: registers account
- Auth and profile → Firebase client: uses client
- Auth and profile → Firebase Auth: creates account
- Auth and profile → Firestore: writes profile
- SPPG registration → Pending notice: routes after registration
- SPPG user → Login: submits credentials
- Login → Auth and profile: signs in
- Auth and profile → Firebase Auth: authenticates
- Auth and profile → Firestore: listens to profile
- Auth and profile → Pending notice: pending status
- SPPG access guard → Auth and profile: checks profile
- Admin access guard → Auth and profile: checks role
- SPPG user → Clause assessment: answers clauses
- Clause assessment → SPPG access guard: requires approval
- Clause assessment → Firestore: reads questions and answers
- Clause assessment → Firestore: writes answers
- Clause assessment → Firebase Storage: uploads evidence
- Clause assessment → Gap map: opens map
- Gap map → SPPG access guard: requires approval
- Gap map → Firestore: reads clauses and answers
- SPPG user → Results and export: views results
- Results and export → SPPG access guard: requires approval
- Results and export → Firestore: reads clauses and answers
- Results and export → Results and export: exports Excel
- Administrator → Admin dashboard: opens dashboard
- Admin dashboard → Admin access guard: requires admin
- Admin dashboard → Firestore: reads profiles and clauses
- Admin dashboard → Firestore: reads assessment backup data
- Admin dashboard → SPPG approvals: opens approvals
- Administrator → SPPG approvals: reviews registrations
- SPPG approvals → Admin access guard: requires admin
- SPPG approvals → Firestore: manages profiles
- SPPG approvals → SPPG detail: opens SPPG detail
- SPPG detail → Admin access guard: requires admin
- Administrator → Question management: manages clauses
- Question management → Admin access guard: requires admin
- Question management → Firestore: reads and writes clauses
- Question management → Seed clauses: loads seed clauses
- Seed clauses → Question management: provides clauses
- Firebase client → Firestore: connects
- Firebase client → Firebase Auth: connects
- Firebase client → Firebase Storage: connects
- Firestore rules → Firestore: controls access
- Storage rules → Firebase Storage: controls access
