# augustosodre/linketinder architecture

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

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

## Overview

Linketinder is a candidate–company matching project with two currently separate runtime surfaces: a TypeScript SPA and a Groovy backend offering both a CLI and documented HTTP API. In the SPA, users register or log in against browser-stored candidate and company lists, then view profiles and candidate/job listings. The backend supports candidate, company, vacancy, and skill CRUD through its service/DAO layers and SQL storage. The README documents these backend capabilities, but the supplied excerpts do not establish individual controller-to-service calls; the frontend is explicitly not integrated with the backend.

Main entry points: [`frontend/src/handlers/formHandler.ts`](https://github.com/augustosodre/linketinder/blob/main/frontend/src/handlers/formHandler.ts) (Form handling), [`frontend/src/main.ts`](https://github.com/augustosodre/linketinder/blob/main/frontend/src/main.ts) (SPA startup), [`frontend/src/storage/lists.ts`](https://github.com/augustosodre/linketinder/blob/main/frontend/src/storage/lists.ts) (Browser lists), [`backend/src/main/groovy/com/augusto/linketinder/dao`](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/dao) (Domain DAOs)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web SPA"]
  node_webapp["SPA startup<br/>[main.ts]"]
  node_router["Page router<br/>[router.ts]"]
  node_pages["Page rendering"]
  node_forms["Registration forms<br/>[form-cadastro.ts]"]
  node_formhandler["Form handling<br/>[formHandler.ts]"]
  node_validation["Validation chain"]
  node_webmodels["Candidate, company, vacancy"]
  node_profiles["Profiles and listings<br/>[homeHelper.ts]"]
  node_browserstore[("Browser lists<br/>[lists.ts]")]
end

subgraph group_backend["Groovy backend"]
  node_cli["CLI entry and menus<br/>[App.groovy]"]
  node_controllers["CLI controllers"]
  node_httpserver["HTTP server<br/>[Server.groovy]"]
  node_api["REST handlers"]
  node_services["Domain services"]
  node_models["Domain models"]
  node_daos["Domain DAOs"]
end

subgraph group_persistence["Persistence"]
  node_providers["Connection providers"]
  node_database[("Relational schema")]
end

node_visitor(("Candidate or company"))
node_localstorage[("localStorage")]
node_cliuser(("CLI user"))
node_httpclient(("HTTP client"))

node_visitor -->|"opens"| node_webapp
node_webapp -->|"loads saved lists"| node_browserstore
node_webapp -->|"starts"| node_router
node_router -->|"selects page"| node_pages
node_visitor -->|"enters registration"| node_forms
node_forms -->|"registers listeners"| node_formhandler
node_formhandler -->|"validates fields"| node_validation
node_formhandler -->|"creates records"| node_webmodels
node_formhandler -->|"adds records"| node_browserstore
node_browserstore -->|"persists lists"| node_localstorage
node_localstorage -->|"restores lists"| node_webapp
node_pages -->|"renders home"| node_profiles
node_profiles -->|"reads lists"| node_browserstore
node_visitor -->|"uses CLI"| node_cli
node_cli -->|"starts menu flow"| node_controllers
node_cliuser -->|"uses CLI"| node_controllers
node_httpclient -->|"sends requests"| node_httpserver
node_httpserver -->|"dispatches requests"| node_api
node_controllers -.->|"uses services"| node_services
node_api -.->|"uses services"| node_services
node_services -.->|"accesses data"| node_daos
node_daos -.->|"maps records"| node_models
node_daos -.->|"gets connections"| node_providers
node_providers -.->|"connects to"| node_database

click node_webapp "https://github.com/augustosodre/linketinder/blob/main/frontend/src/main.ts"
click node_router "https://github.com/augustosodre/linketinder/blob/main/frontend/src/router.ts"
click node_pages "https://github.com/augustosodre/linketinder/tree/main/frontend/src/pages"
click node_forms "https://github.com/augustosodre/linketinder/blob/main/frontend/src/components/form-cadastro.ts"
click node_formhandler "https://github.com/augustosodre/linketinder/blob/main/frontend/src/handlers/formHandler.ts"
click node_validation "https://github.com/augustosodre/linketinder/tree/main/frontend/src/validators/chain"
click node_webmodels "https://github.com/augustosodre/linketinder/tree/main/frontend/src/models"
click node_profiles "https://github.com/augustosodre/linketinder/blob/main/frontend/src/helpers/homeHelper.ts"
click node_browserstore "https://github.com/augustosodre/linketinder/blob/main/frontend/src/storage/lists.ts"
click node_cli "https://github.com/augustosodre/linketinder/blob/main/backend/src/main/groovy/com/augusto/linketinder/App.groovy"
click node_controllers "https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/control"
click node_httpserver "https://github.com/augustosodre/linketinder/blob/main/backend/src/main/groovy/com/augusto/linketinder/Server.groovy"
click node_api "https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/API"
click node_services "https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/service"
click node_models "https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/model"
click node_daos "https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/dao"
click node_providers "https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/dao/connectionProvider"
click node_database "https://github.com/augustosodre/linketinder/blob/main/database/scriptEstruturaBasica.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_webapp,node_router,node_pages,node_forms,node_formhandler,node_validation,node_webmodels,node_profiles,node_browserstore,node_cliuser,node_httpclient toneBlue
class node_cli,node_controllers,node_httpserver,node_api,node_services,node_models,node_daos,node_localstorage toneAmber
class node_providers,node_database toneMint
class node_visitor toneIndigo
```

## Components

### Web SPA

- [SPA startup](https://github.com/augustosodre/linketinder/blob/main/frontend/src/main.ts): `frontend/src/main.ts`
- [Page router](https://github.com/augustosodre/linketinder/blob/main/frontend/src/router.ts): `frontend/src/router.ts`
- [Page rendering](https://github.com/augustosodre/linketinder/tree/main/frontend/src/pages): `frontend/src/pages`
- [Registration forms](https://github.com/augustosodre/linketinder/blob/main/frontend/src/components/form-cadastro.ts): `frontend/src/components/form-cadastro.ts`
- [Form handling](https://github.com/augustosodre/linketinder/blob/main/frontend/src/handlers/formHandler.ts): `frontend/src/handlers/formHandler.ts`
- [Validation chain](https://github.com/augustosodre/linketinder/tree/main/frontend/src/validators/chain): `frontend/src/validators/chain`
- [Candidate, company, vacancy](https://github.com/augustosodre/linketinder/tree/main/frontend/src/models): `frontend/src/models`
- [Profiles and listings](https://github.com/augustosodre/linketinder/blob/main/frontend/src/helpers/homeHelper.ts): `frontend/src/helpers/homeHelper.ts`
- [Browser lists](https://github.com/augustosodre/linketinder/blob/main/frontend/src/storage/lists.ts): `frontend/src/storage/lists.ts`

### Groovy backend

- [CLI entry and menus](https://github.com/augustosodre/linketinder/blob/main/backend/src/main/groovy/com/augusto/linketinder/App.groovy): `backend/src/main/groovy/com/augusto/linketinder/App.groovy`
- [CLI controllers](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/control): `backend/src/main/groovy/com/augusto/linketinder/control`
- [HTTP server](https://github.com/augustosodre/linketinder/blob/main/backend/src/main/groovy/com/augusto/linketinder/Server.groovy): `backend/src/main/groovy/com/augusto/linketinder/Server.groovy`
- [REST handlers](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/API): `backend/src/main/groovy/com/augusto/linketinder/API`
- [Domain services](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/service): `backend/src/main/groovy/com/augusto/linketinder/service`
- [Domain models](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/model): `backend/src/main/groovy/com/augusto/linketinder/model`
- [Domain DAOs](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/dao): `backend/src/main/groovy/com/augusto/linketinder/dao`

### Persistence

- [Connection providers](https://github.com/augustosodre/linketinder/tree/main/backend/src/main/groovy/com/augusto/linketinder/dao/connectionProvider): `backend/src/main/groovy/com/augusto/linketinder/dao/connectionProvider`
- [Relational schema](https://github.com/augustosodre/linketinder/blob/main/database/scriptEstruturaBasica.sql): `database/scriptEstruturaBasica.sql`

### Other components

- **Candidate or company**
- **localStorage**
- **CLI user**
- **HTTP client**

## Connections

- Candidate or company → SPA startup: opens
- SPA startup → Browser lists: loads saved lists
- SPA startup → Page router: starts
- Page router → Page rendering: selects page
- Candidate or company → Registration forms: enters registration
- Registration forms → Form handling: registers listeners
- Form handling → Validation chain: validates fields
- Form handling → Candidate, company, vacancy: creates records
- Form handling → Browser lists: adds records
- Browser lists → localStorage: persists lists
- localStorage → SPA startup: restores lists
- Page rendering → Profiles and listings: renders home
- Profiles and listings → Browser lists: reads lists
- Candidate or company → CLI entry and menus: uses CLI
- CLI entry and menus → CLI controllers: starts menu flow
- CLI user → CLI controllers: uses CLI
- HTTP client → HTTP server: sends requests
- HTTP server → REST handlers: dispatches requests
- CLI controllers → Domain services: uses services
- REST handlers → Domain services: uses services
- Domain services → Domain DAOs: accesses data
- Domain DAOs → Domain models: maps records
- Domain DAOs → Connection providers: gets connections
- Connection providers → Relational schema: connects to
