# alanf-oliveira/linketinder architecture

> Architecture diagram of the GitHub repository alanf-oliveira/linketinder, 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/alanf-oliveira/linketinder
- Repository: https://github.com/alanf-oliveira/linketinder

## Overview

Linketinder is a recruitment application with two distinct implementations: a Groovy terminal backend and a TypeScript browser SPA. The user workflow is to choose a candidate or company area, register or browse profiles and vacancies, and view candidate competency summaries. The frontend uses seeded in-memory data and does not communicate with the backend. Backend persistence through JDBC/PostgreSQL and its service/menu structure are documented in the README; individual backend call paths were not sampled, so those links reflect only documented responsibilities.

Main entry points: [`frontend/src/main.ts`](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/main.ts) (SPA Entry), [`frontend/src/views/home.ts`](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/home.ts) (Profile Home), [`frontend/src/views/areaEmpresa.ts`](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/areaEmpresa.ts) (Company Area), [`frontend/src/views/cadastrarCandidato.ts`](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarCandidato.ts) (Candidate Signup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Browser SPA"]
  node_spa["SPA Entry<br/>[main.ts]"]
  node_home["Profile Home<br/>[home.ts]"]
  node_candidate_form["Candidate Signup"]
  node_company_form["Company Signup"]
  node_candidate_area["Candidate Area<br/>[areaCandidato.ts]"]
  node_company_area["Company Area<br/>[areaEmpresa.ts]"]
  node_candidate_list["Candidate Listing"]
  node_vacancy_views["Vacancy Screens<br/>[listarVagas.ts]"]
  node_vacancy_form["Vacancy Signup<br/>[cadastrarVaga.ts]"]
  node_competency_chart["Competency Chart"]
end

subgraph group_domain["Recruitment Data"]
  node_candidate_service["Candidate Service"]
  node_company_service["Company Service<br/>[EmpresaService.ts]"]
  node_vacancy_service["Vacancy Service<br/>[VagaService.ts]"]
  node_chart_service["Chart Aggregation<br/>[GraficoService.ts]"]
  node_candidate_data["Candidate Seed Data<br/>[candidatos.ts]"]
  node_company_data["Company Seed Data<br/>[empresas.ts]"]
  node_vacancy_data["Vacancy Seed Data<br/>[vagas.ts]"]
  node_candidate_model["Candidate Model<br/>[Candidato.ts]"]
end

subgraph group_backend["Groovy Backend"]
  node_backend_main["Backend Entry<br/>[Main.groovy]"]
  node_menus["Entity Menus"]
  node_services["Backend Services"]
  node_backend_models["Domain Models"]
end

subgraph group_persistence["Database"]
  node_db_access["JDBC CRUD"]
  node_schema["SQL Schema<br/>[linketinder.sql]"]
end

node_user(("User"))
node_terminal(("Terminal User"))
node_postgres[("PostgreSQL")]

node_user -->|"opens"| node_spa
node_spa -->|"renders"| node_home
node_spa -->|"loads"| node_candidate_data
node_spa -->|"loads"| node_company_data
node_spa -->|"loads"| node_vacancy_data
node_spa -->|"creates"| node_candidate_service
node_spa -->|"creates"| node_company_service
node_spa -->|"creates"| node_vacancy_service
node_home -->|"opens"| node_candidate_form
node_home -->|"opens"| node_company_form
node_home -->|"opens"| node_vacancy_views
node_candidate_form -->|"saves"| node_candidate_service
node_candidate_form -->|"returns"| node_candidate_area
node_company_form -->|"saves"| node_company_service
node_company_form -->|"returns"| node_company_area
node_candidate_area -.->|"opens"| node_candidate_list
node_company_area -.->|"opens"| node_candidate_list
node_company_area -.->|"opens"| node_vacancy_form
node_company_area -.->|"opens"| node_competency_chart
node_candidate_service -->|"manages"| node_candidate_model
node_company_service -->|"manages"| node_company_data
node_vacancy_views -.->|"lists"| node_vacancy_service
node_vacancy_form -.->|"creates"| node_vacancy_service
node_competency_chart -.->|"counts"| node_chart_service
node_chart_service -->|"reads"| node_candidate_model
node_terminal -->|"runs"| node_backend_main
node_backend_main -.->|"dispatches"| node_menus
node_menus -.->|"uses"| node_services
node_services -.->|"manages"| node_backend_models
node_services -.->|"persists via"| node_db_access
node_db_access -.->|"reads/writes"| node_postgres
node_db_access -.->|"uses schema"| node_schema

click node_spa "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/main.ts"
click node_home "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/home.ts"
click node_candidate_form "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarCandidato.ts"
click node_company_form "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarEmpresa.ts"
click node_candidate_area "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/areaCandidato.ts"
click node_company_area "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/areaEmpresa.ts"
click node_candidate_list "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/listarCandidatos.ts"
click node_vacancy_views "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/listarVagas.ts"
click node_vacancy_form "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarVaga.ts"
click node_competency_chart "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/graficoCompetencias.ts"
click node_candidate_service "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/CandidatoService.ts"
click node_company_service "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/EmpresaService.ts"
click node_vacancy_service "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/VagaService.ts"
click node_chart_service "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/GraficoService.ts"
click node_candidate_data "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/data/candidatos.ts"
click node_company_data "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/data/empresas.ts"
click node_vacancy_data "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/data/vagas.ts"
click node_candidate_model "https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/models/Candidato.ts"
click node_backend_main "https://github.com/alanf-oliveira/linketinder/blob/main/src/main/groovy/org/alan/Main.groovy"
click node_menus "https://github.com/alanf-oliveira/linketinder/tree/main/src/main/groovy/org/alan/terminal"
click node_services "https://github.com/alanf-oliveira/linketinder/tree/main/src/main/groovy/org/alan/service"
click node_backend_models "https://github.com/alanf-oliveira/linketinder/tree/main/src/main/groovy/org/alan/model"
click node_db_access "https://github.com/alanf-oliveira/linketinder/blob/main/src/main/groovy/org/alan/database/BancoDeDados.groovy"
click node_schema "https://github.com/alanf-oliveira/linketinder/blob/main/src/main/groovy/org/alan/database/linketinder.sql"

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_spa,node_home,node_candidate_form,node_company_form,node_candidate_area,node_company_area,node_candidate_list,node_vacancy_views,node_vacancy_form,node_competency_chart,node_user,node_terminal toneBlue
class node_candidate_service,node_company_service,node_vacancy_service,node_chart_service,node_candidate_data,node_company_data,node_vacancy_data,node_candidate_model,node_postgres toneAmber
class node_backend_main,node_menus,node_services,node_backend_models toneMint
class node_db_access,node_schema toneRose
```

## Components

### Browser SPA

- [SPA Entry](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/main.ts): `frontend/src/main.ts`
- [Profile Home](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/home.ts): `frontend/src/views/home.ts`
- [Candidate Signup](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarCandidato.ts): `frontend/src/views/cadastrarCandidato.ts`
- [Company Signup](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarEmpresa.ts): `frontend/src/views/cadastrarEmpresa.ts`
- [Candidate Area](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/areaCandidato.ts): `frontend/src/views/areaCandidato.ts`
- [Company Area](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/areaEmpresa.ts): `frontend/src/views/areaEmpresa.ts`
- [Candidate Listing](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/listarCandidatos.ts): `frontend/src/views/listarCandidatos.ts`
- [Vacancy Screens](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/listarVagas.ts): `frontend/src/views/listarVagas.ts`
- [Vacancy Signup](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/cadastrarVaga.ts): `frontend/src/views/cadastrarVaga.ts`
- [Competency Chart](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/views/graficoCompetencias.ts): `frontend/src/views/graficoCompetencias.ts`

### Recruitment Data

- [Candidate Service](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/CandidatoService.ts): `frontend/src/services/CandidatoService.ts`
- [Company Service](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/EmpresaService.ts): `frontend/src/services/EmpresaService.ts`
- [Vacancy Service](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/VagaService.ts): `frontend/src/services/VagaService.ts`
- [Chart Aggregation](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/services/GraficoService.ts): `frontend/src/services/GraficoService.ts`
- [Candidate Seed Data](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/data/candidatos.ts): `frontend/src/data/candidatos.ts`
- [Company Seed Data](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/data/empresas.ts): `frontend/src/data/empresas.ts`
- [Vacancy Seed Data](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/data/vagas.ts): `frontend/src/data/vagas.ts`
- [Candidate Model](https://github.com/alanf-oliveira/linketinder/blob/main/frontend/src/models/Candidato.ts): `frontend/src/models/Candidato.ts`

### Groovy Backend

- [Backend Entry](https://github.com/alanf-oliveira/linketinder/blob/main/src/main/groovy/org/alan/Main.groovy): `src/main/groovy/org/alan/Main.groovy`
- [Entity Menus](https://github.com/alanf-oliveira/linketinder/tree/main/src/main/groovy/org/alan/terminal): `src/main/groovy/org/alan/terminal`
- [Backend Services](https://github.com/alanf-oliveira/linketinder/tree/main/src/main/groovy/org/alan/service): `src/main/groovy/org/alan/service`
- [Domain Models](https://github.com/alanf-oliveira/linketinder/tree/main/src/main/groovy/org/alan/model): `src/main/groovy/org/alan/model`

### Database

- [JDBC CRUD](https://github.com/alanf-oliveira/linketinder/blob/main/src/main/groovy/org/alan/database/BancoDeDados.groovy): `src/main/groovy/org/alan/database/BancoDeDados.groovy`
- [SQL Schema](https://github.com/alanf-oliveira/linketinder/blob/main/src/main/groovy/org/alan/database/linketinder.sql): `src/main/groovy/org/alan/database/linketinder.sql`

### Other components

- **User**
- **Terminal User**
- **PostgreSQL**

## Connections

- User → SPA Entry: opens
- SPA Entry → Profile Home: renders
- SPA Entry → Candidate Seed Data: loads
- SPA Entry → Company Seed Data: loads
- SPA Entry → Vacancy Seed Data: loads
- SPA Entry → Candidate Service: creates
- SPA Entry → Company Service: creates
- SPA Entry → Vacancy Service: creates
- Profile Home → Candidate Signup: opens
- Profile Home → Company Signup: opens
- Profile Home → Vacancy Screens: opens
- Candidate Signup → Candidate Service: saves
- Candidate Signup → Candidate Area: returns
- Company Signup → Company Service: saves
- Company Signup → Company Area: returns
- Candidate Area → Candidate Listing: opens
- Company Area → Candidate Listing: opens
- Company Area → Vacancy Signup: opens
- Company Area → Competency Chart: opens
- Candidate Service → Candidate Model: manages
- Company Service → Company Seed Data: manages
- Vacancy Screens → Vacancy Service: lists
- Vacancy Signup → Vacancy Service: creates
- Competency Chart → Chart Aggregation: counts
- Chart Aggregation → Candidate Model: reads
- Terminal User → Backend Entry: runs
- Backend Entry → Entity Menus: dispatches
- Entity Menus → Backend Services: uses
- Backend Services → Domain Models: manages
- Backend Services → JDBC CRUD: persists via
- JDBC CRUD → PostgreSQL: reads/writes
- JDBC CRUD → SQL Schema: uses schema
