# ugustavob/linketinder-project architecture

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

- Interactive diagram: https://gitdiagram.com/ugustavob/linketinder-project
- Repository: https://github.com/ugustavob/linketinder-project

## Overview

LinkeTinder combines a browser SPA for candidate/company recruitment workflows with a separately documented Groovy console MVC application. The sampled frontend persists data in browser localStorage; the README describes PostgreSQL-backed DAOs in the console application. No frontend-to-backend API integration is evidenced, so the two paths are shown separately. Backend wiring reflects README documentation where source excerpts were not available.

Main entry points: [`frontend/src/main.ts`](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/main.ts) (SPA router), [`frontend/src/services/armazenamento.ts`](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/services/armazenamento.ts) (Storage service), [`frontend/src/views/PerfilEmpresa.ts`](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/PerfilEmpresa.ts) (Company dashboard), [`frontend/src/views/Login.ts`](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/Login.ts) (Login)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_web_router["SPA router<br/>[main.ts]"]
  node_login["Login<br/>[Login.ts]"]
  node_registration["Registration<br/>[CadastroPessoa.ts]"]
  node_candidate_home["Candidate home<br/>[HomeCandidato.ts]"]
  node_company_home["Company home<br/>[HomeEmpresa.ts]"]
  node_candidate_jobs["Browse vacancies<br/>[VagasCandidato.ts]"]
  node_company_profile["Company dashboard<br/>[PerfilEmpresa.ts]"]
  node_my_profile["Personal profile<br/>[MeuPerfil.ts]"]
  node_web_types["Recruitment models<br/>[types.ts]"]
end

subgraph group_browser_state["Browser data"]
  node_web_storage["Storage service<br/>[armazenamento.ts]"]
  node_local_storage[("Browser storage")]
end

subgraph group_console_app["Console application"]
  node_main["Application entry<br/>[Main.groovy]"]
  node_console_ui["Console UI<br/>[ConsoleUI.groovy]"]
  node_controllers["MVC controllers"]
  node_services["Business services"]
  node_domain_models["Domain entities"]
end

subgraph group_backend_data["Backend data"]
  node_daos["Data access"]
  node_connection_factory["Connection factory"]
  node_postgres[("PostgreSQL")]
end

node_candidate(("Candidate"))
node_company(("Company"))
node_console_user(("Console user"))

node_candidate -->|"opens SPA"| node_web_router
node_company -->|"opens SPA"| node_web_router
node_web_router -->|"routes to"| node_login
node_web_router -->|"routes to"| node_registration
node_web_router -->|"dispatches"| node_candidate_home
node_web_router -->|"dispatches"| node_company_home
node_web_router -->|"routes to"| node_candidate_jobs
node_web_router -->|"routes to"| node_company_profile
node_web_router -->|"routes to"| node_my_profile
node_login -->|"authenticates via"| node_web_storage
node_registration -->|"saves profiles"| node_web_storage
node_candidate_home -->|"reads session"| node_web_storage
node_company_home -->|"reads session"| node_web_storage
node_candidate_jobs -->|"reads vacancies"| node_web_storage
node_company_profile -->|"manages vacancies"| node_web_storage
node_company_profile -->|"reads candidates"| node_web_storage
node_my_profile -->|"reads session"| node_web_storage
node_web_storage -->|"loads and saves"| node_local_storage
node_console_user -->|"uses"| node_console_ui
node_console_ui -->|"enters application"| node_main
node_main -->|"routes requests"| node_controllers
node_controllers -->|"invokes rules"| node_services
node_services -->|"accesses data"| node_daos
node_daos -->|"gets connection"| node_connection_factory
node_connection_factory -->|"connects"| node_postgres

click node_web_router "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/main.ts"
click node_login "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/Login.ts"
click node_registration "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/CadastroPessoa.ts"
click node_candidate_home "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/HomeCandidato.ts"
click node_company_home "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/HomeEmpresa.ts"
click node_candidate_jobs "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/VagasCandidato.ts"
click node_company_profile "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/PerfilEmpresa.ts"
click node_my_profile "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/MeuPerfil.ts"
click node_web_types "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/models/types.ts"
click node_web_storage "https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/services/armazenamento.ts"
click node_main "https://github.com/ugustavob/linketinder-project/blob/main/src/main/groovy/org/uGustavoDev/Main.groovy"
click node_console_ui "https://github.com/ugustavob/linketinder-project/blob/main/src/main/groovy/org/uGustavoDev/ui/ConsoleUI.groovy"
click node_controllers "https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/controller"
click node_services "https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/service"
click node_domain_models "https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/model"
click node_daos "https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/dao"
click node_connection_factory "https://github.com/ugustavob/linketinder-project/blob/main/src/main/groovy/org/uGustavoDev/factory/ConexaoFactory.groovy"

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_web_router,node_login,node_registration,node_candidate_home,node_company_home,node_candidate_jobs,node_company_profile,node_my_profile,node_web_types,node_console_user toneBlue
class node_web_storage,node_local_storage toneAmber
class node_main,node_console_ui,node_controllers,node_services,node_domain_models toneMint
class node_daos,node_connection_factory,node_postgres toneRose
class node_candidate,node_company toneIndigo
```

## Components

### Web application

- [SPA router](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/main.ts): `frontend/src/main.ts`
- [Login](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/Login.ts): `frontend/src/views/Login.ts`
- [Registration](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/CadastroPessoa.ts): `frontend/src/views/CadastroPessoa.ts`
- [Candidate home](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/HomeCandidato.ts): `frontend/src/views/HomeCandidato.ts`
- [Company home](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/HomeEmpresa.ts): `frontend/src/views/HomeEmpresa.ts`
- [Browse vacancies](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/VagasCandidato.ts): `frontend/src/views/VagasCandidato.ts`
- [Company dashboard](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/PerfilEmpresa.ts): `frontend/src/views/PerfilEmpresa.ts`
- [Personal profile](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/views/MeuPerfil.ts): `frontend/src/views/MeuPerfil.ts`
- [Recruitment models](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/models/types.ts): `frontend/src/models/types.ts`

### Browser data

- [Storage service](https://github.com/ugustavob/linketinder-project/blob/main/frontend/src/services/armazenamento.ts): `frontend/src/services/armazenamento.ts`
- **Browser storage**

### Console application

- [Application entry](https://github.com/ugustavob/linketinder-project/blob/main/src/main/groovy/org/uGustavoDev/Main.groovy): `src/main/groovy/org/uGustavoDev/Main.groovy`
- [Console UI](https://github.com/ugustavob/linketinder-project/blob/main/src/main/groovy/org/uGustavoDev/ui/ConsoleUI.groovy): `src/main/groovy/org/uGustavoDev/ui/ConsoleUI.groovy`
- [MVC controllers](https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/controller): `src/main/groovy/org/uGustavoDev/controller`
- [Business services](https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/service): `src/main/groovy/org/uGustavoDev/service`
- [Domain entities](https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/model): `src/main/groovy/org/uGustavoDev/model`

### Backend data

- [Data access](https://github.com/ugustavob/linketinder-project/tree/main/src/main/groovy/org/uGustavoDev/dao): `src/main/groovy/org/uGustavoDev/dao`
- [Connection factory](https://github.com/ugustavob/linketinder-project/blob/main/src/main/groovy/org/uGustavoDev/factory/ConexaoFactory.groovy): `src/main/groovy/org/uGustavoDev/factory/ConexaoFactory.groovy`
- **PostgreSQL**

### Other components

- **Candidate**
- **Company**
- **Console user**

## Connections

- Candidate → SPA router: opens SPA
- Company → SPA router: opens SPA
- SPA router → Login: routes to
- SPA router → Registration: routes to
- SPA router → Candidate home: dispatches
- SPA router → Company home: dispatches
- SPA router → Browse vacancies: routes to
- SPA router → Company dashboard: routes to
- SPA router → Personal profile: routes to
- Login → Storage service: authenticates via
- Registration → Storage service: saves profiles
- Candidate home → Storage service: reads session
- Company home → Storage service: reads session
- Browse vacancies → Storage service: reads vacancies
- Company dashboard → Storage service: manages vacancies
- Company dashboard → Storage service: reads candidates
- Personal profile → Storage service: reads session
- Storage service → Browser storage: loads and saves
- Console user → Console UI: uses
- Console UI → Application entry: enters application
- Application entry → MVC controllers: routes requests
- MVC controllers → Business services: invokes rules
- Business services → Data access: accesses data
- Data access → Connection factory: gets connection
- Connection factory → PostgreSQL: connects
