# marcossantoswz/unioff architecture

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

- Interactive diagram: https://gitdiagram.com/marcossantoswz/unioff
- Repository: https://github.com/marcossantoswz/unioff

## Overview

Unioff is a student-benefits platform: students and partner businesses use its API to register or sign in, discover businesses and offers, and redeem offers as coupons; businesses manage offers and validate coupons. The backend follows the documented controller–service–repository layering, with PostgreSQL as persistence. The README also describes administrative moderation, while sampled code shows admin authorization for benefit deactivation but not a separate admin panel. Frontend files are present, but their behavior was not sampled, so the graph focuses on evidenced API flows.

Main entry points: [`unioff-backend/src/main/java/com/unioff/controller/AuthController.java`](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/AuthController.java) (Auth API), [`unioff-backend/src/main/java/com/unioff/services/CupomService.java`](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/CupomService.java) (Coupon operations), [`unioff-backend/src/main/java/com/unioff/controller/EmpresaController.java`](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/EmpresaController.java) (Business API), [`unioff-backend/src/main/java/com/unioff/services/EmpresaService.java`](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/EmpresaService.java) (Business management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_identity["Accounts and access"]
  node_auth_controller["Auth API"]
  node_auth_service["Authentication<br/>[AuthService.java]"]
  node_student_service["Student registration"]
  node_jwt_service["JWT service<br/>[JwtService.java]"]
end

subgraph group_marketplace["Businesses and offers"]
  node_empresa_controller["Business API"]
  node_empresa_service["Business management"]
  node_beneficio_controller["Benefits API"]
  node_beneficio_service["Benefit management"]
end

subgraph group_redemption["Coupon lifecycle"]
  node_resgate_controller["Redemption API"]
  node_cupom_service["Coupon operations<br/>[CupomService.java]"]
end

subgraph group_persistence["Persistence"]
  node_usuario_repo["User repository"]
  node_estudante_repo["Student repository"]
  node_empresa_repo["Business repository"]
  node_beneficio_repo["Benefit repository"]
  node_cupom_repo["Coupon repository"]
  node_estudante_repo_redemption["Student repository"]
  node_postgres[("PostgreSQL")]
end

node_students(("Students"))
node_businesses(("Businesses"))
node_admins(("Admins"))

node_students -->|"register or sign in"| node_auth_controller
node_businesses -->|"register or sign in"| node_auth_controller
node_auth_controller -->|"register student"| node_student_service
node_auth_controller -->|"register business"| node_empresa_service
node_auth_controller -->|"authenticate"| node_auth_service
node_student_service -->|"check and save user"| node_usuario_repo
node_student_service -->|"save student"| node_estudante_repo
node_auth_service -->|"find by email"| node_usuario_repo
node_auth_service -->|"issue token"| node_jwt_service
node_businesses -->|"manage business"| node_empresa_controller
node_students -->|"browse businesses"| node_empresa_controller
node_empresa_controller -->|"request business data"| node_empresa_service
node_empresa_service -->|"read and save"| node_empresa_repo
node_empresa_service -->|"read and save user"| node_usuario_repo
node_empresa_controller -->|"request business offers"| node_beneficio_service
node_students -->|"search offers"| node_beneficio_controller
node_businesses -->|"manage offers"| node_beneficio_controller
node_admins -->|"deactivate offers"| node_beneficio_controller
node_beneficio_controller -->|"manage or find offers"| node_beneficio_service
node_beneficio_service -->|"read and save offers"| node_beneficio_repo
node_beneficio_service -->|"find owner"| node_empresa_repo
node_students -->|"redeem and view history"| node_resgate_controller
node_businesses -->|"validate and view coupons"| node_resgate_controller
node_resgate_controller -->|"process coupon request"| node_cupom_service
node_cupom_service -->|"find student"| node_estudante_repo_redemption
node_cupom_service -->|"find and increment offer"| node_beneficio_repo
node_cupom_service -->|"check, save, validate, list"| node_cupom_repo
node_usuario_repo -->|"read and write"| node_postgres
node_estudante_repo -->|"read and write"| node_postgres
node_empresa_repo -->|"read and write"| node_postgres
node_beneficio_repo -->|"read and write"| node_postgres
node_cupom_repo -->|"read and write"| node_postgres

click node_auth_controller "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/AuthController.java"
click node_auth_service "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/AuthService.java"
click node_student_service "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/EstudanteService.java"
click node_jwt_service "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/security/JwtService.java"
click node_usuario_repo "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/UsuarioRepository.java"
click node_estudante_repo "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/EstudanteRepository.java"
click node_empresa_controller "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/EmpresaController.java"
click node_empresa_service "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/EmpresaService.java"
click node_empresa_repo "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/EmpresaRepository.java"
click node_beneficio_controller "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/BeneficioController.java"
click node_beneficio_service "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/BeneficioService.java"
click node_beneficio_repo "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/BeneficioRepository.java"
click node_resgate_controller "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/ResgateController.java"
click node_cupom_service "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/CupomService.java"
click node_cupom_repo "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/CupomRepository.java"
click node_estudante_repo_redemption "https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/EstudanteRepository.java"

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_auth_controller,node_auth_service,node_student_service,node_jwt_service toneBlue
class node_empresa_controller,node_empresa_service,node_beneficio_controller,node_beneficio_service toneAmber
class node_resgate_controller,node_cupom_service toneMint
class node_usuario_repo,node_estudante_repo,node_empresa_repo,node_beneficio_repo,node_cupom_repo,node_estudante_repo_redemption,node_postgres toneRose
class node_students,node_businesses,node_admins toneIndigo
```

## Components

### Accounts and access

- [Auth API](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/AuthController.java): `unioff-backend/src/main/java/com/unioff/controller/AuthController.java`
- [Authentication](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/AuthService.java): `unioff-backend/src/main/java/com/unioff/services/AuthService.java`
- [Student registration](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/EstudanteService.java): `unioff-backend/src/main/java/com/unioff/services/EstudanteService.java`
- [JWT service](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/security/JwtService.java): `unioff-backend/src/main/java/com/unioff/security/JwtService.java`

### Businesses and offers

- [Business API](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/EmpresaController.java): `unioff-backend/src/main/java/com/unioff/controller/EmpresaController.java`
- [Business management](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/EmpresaService.java): `unioff-backend/src/main/java/com/unioff/services/EmpresaService.java`
- [Benefits API](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/BeneficioController.java): `unioff-backend/src/main/java/com/unioff/controller/BeneficioController.java`
- [Benefit management](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/BeneficioService.java): `unioff-backend/src/main/java/com/unioff/services/BeneficioService.java`

### Coupon lifecycle

- [Redemption API](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/controller/ResgateController.java): `unioff-backend/src/main/java/com/unioff/controller/ResgateController.java`
- [Coupon operations](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/services/CupomService.java): `unioff-backend/src/main/java/com/unioff/services/CupomService.java`

### Persistence

- [User repository](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/UsuarioRepository.java): `unioff-backend/src/main/java/com/unioff/repository/UsuarioRepository.java`
- [Student repository](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/EstudanteRepository.java): `unioff-backend/src/main/java/com/unioff/repository/EstudanteRepository.java`
- [Business repository](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/EmpresaRepository.java): `unioff-backend/src/main/java/com/unioff/repository/EmpresaRepository.java`
- [Benefit repository](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/BeneficioRepository.java): `unioff-backend/src/main/java/com/unioff/repository/BeneficioRepository.java`
- [Coupon repository](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/CupomRepository.java): `unioff-backend/src/main/java/com/unioff/repository/CupomRepository.java`
- [Student repository](https://github.com/marcossantoswz/unioff/blob/main/unioff-backend/src/main/java/com/unioff/repository/EstudanteRepository.java): `unioff-backend/src/main/java/com/unioff/repository/EstudanteRepository.java`
- **PostgreSQL**

### Other components

- **Students**
- **Businesses**
- **Admins**

## Connections

- Students → Auth API: register or sign in
- Businesses → Auth API: register or sign in
- Auth API → Student registration: register student
- Auth API → Business management: register business
- Auth API → Authentication: authenticate
- Student registration → User repository: check and save user
- Student registration → Student repository: save student
- Authentication → User repository: find by email
- Authentication → JWT service: issue token
- Businesses → Business API: manage business
- Students → Business API: browse businesses
- Business API → Business management: request business data
- Business management → Business repository: read and save
- Business management → User repository: read and save user
- Business API → Benefit management: request business offers
- Students → Benefits API: search offers
- Businesses → Benefits API: manage offers
- Admins → Benefits API: deactivate offers
- Benefits API → Benefit management: manage or find offers
- Benefit management → Benefit repository: read and save offers
- Benefit management → Business repository: find owner
- Students → Redemption API: redeem and view history
- Businesses → Redemption API: validate and view coupons
- Redemption API → Coupon operations: process coupon request
- Coupon operations → Student repository: find student
- Coupon operations → Benefit repository: find and increment offer
- Coupon operations → Coupon repository: check, save, validate, list
- User repository → PostgreSQL: read and write
- Student repository → PostgreSQL: read and write
- Business repository → PostgreSQL: read and write
- Benefit repository → PostgreSQL: read and write
- Coupon repository → PostgreSQL: read and write
