# grupo-1-epialc/bolsa-de-trabajo architecture

> Architecture diagram of the GitHub repository grupo-1-epialc/bolsa-de-trabajo, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/grupo-1-epialc/bolsa-de-trabajo
- Repository: https://github.com/grupo-1-epialc/bolsa-de-trabajo

## Overview

Bolsa de Trabajo is a student–job matching product built from a React frontend and REST microservices, with rule-based scoring and AI workflows orchestrated by n8n. The main user journey is account access, profile/CV completion, job discovery or company vacancy management, and recommendations or candidate review. The map also includes admin controls and the internal MCP tool layer. Cross-service workflow links are based on README documentation; unsampled implementation details are not inferred.

Main entry points: [`frontend/src/App.tsx`](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/App.tsx) (App routing), [`n8n/generate_workflows.py`](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/n8n/generate_workflows.py) (AI workflows), [`frontend/src/services/authService.ts`](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/services/authService.ts) (Auth client), [`services/profile-service/app/api/routes_profiles.py`](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/api/routes_profiles.py) (Profile API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Frontend"]
  node_app["App routing<br/>[App.tsx]"]
  node_auth_ui["Auth client<br/>[authService.ts]"]
  node_api_client["API client<br/>[api.ts]"]
  node_student_ui["Student workspace<br/>[StudentArea.tsx]"]
  node_company_ui["Company workspace<br/>[CompanyArea.tsx]"]
  node_admin_ui["Admin workspace<br/>[AdminArea.tsx]"]
end

subgraph group_identity["Identity"]
  node_auth_service["Auth service<br/>[auth.service.ts]"]
  node_auth_accounts[("Account store<br/>[user.entity.ts]")]
end

subgraph group_marketplace["Profiles and Jobs"]
  node_profile_api["Profile API<br/>[routes_profiles.py]"]
  node_profile_core["Profile management<br/>[profile_service.py]"]
  node_cv_storage[("CV storage<br/>[storage_fs.py]")]
  node_jobs_api["Jobs API<br/>[routes_jobs.py]"]
  node_jobs_core["Job management<br/>[job_service.py]"]
end

subgraph group_matching["Matching and AI"]
  node_matching_api["Matching API<br/>[routes.py]"]
  node_matching_engine["Rule engine<br/>[engine.py]"]
end

subgraph group_automation["Agent Tooling"]
  node_n8n["AI workflows"]
  node_mcp["MCP tools<br/>[main.py]"]
  node_mcp_ports["Tool gateways<br/>[ports.py]"]
end

node_student(("Student"))
node_company_user(("Company user"))
node_admin_user(("Admin user"))

node_student -->|"uses"| node_app
node_company_user -->|"uses"| node_app
node_admin_user -->|"uses"| node_app
node_app -->|"routes auth"| node_auth_ui
node_auth_ui -->|"calls"| node_api_client
node_app -->|"renders"| node_student_ui
node_app -->|"renders"| node_company_ui
node_app -->|"renders"| node_admin_ui
node_auth_ui -->|"requests auth"| node_auth_service
node_auth_service -->|"persists accounts"| node_auth_accounts
node_student_ui -.->|"manages profile"| node_profile_api
node_company_ui -.->|"manages vacancies"| node_jobs_api
node_admin_ui -.->|"configures matching"| node_matching_api
node_profile_api -->|"delegates to"| node_profile_core
node_profile_core -.->|"stores CVs"| node_cv_storage
node_jobs_api -->|"calls"| node_jobs_core
node_matching_api -->|"computes matches"| node_matching_engine
node_n8n -->|"calls directly"| node_mcp
node_mcp -->|"uses gateways"| node_mcp_ports
node_n8n -.->|"requests CV extraction"| node_profile_api
node_n8n -.->|"requests recommendations"| node_matching_api

click node_app "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/App.tsx"
click node_auth_ui "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/services/authService.ts"
click node_api_client "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/services/api.ts"
click node_student_ui "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/pages/StudentArea.tsx"
click node_company_ui "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/pages/CompanyArea.tsx"
click node_admin_ui "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/pages/AdminArea.tsx"
click node_auth_service "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/auth-service/src/auth/auth.service.ts"
click node_auth_accounts "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/auth-service/src/users/user.entity.ts"
click node_profile_api "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/api/routes_profiles.py"
click node_profile_core "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/application/profile_service.py"
click node_cv_storage "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/infrastructure/storage_fs.py"
click node_jobs_api "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/jobs-service/app/api/routes_jobs.py"
click node_jobs_core "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/jobs-service/app/application/job_service.py"
click node_matching_api "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/matching-service/app/api/routes.py"
click node_matching_engine "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/matching-service/app/domain/engine.py"
click node_n8n "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/n8n/generate_workflows.py"
click node_mcp "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/mcp-tools/app/main.py"
click node_mcp_ports "https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/mcp-tools/app/domain/ports.py"

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_app,node_auth_ui,node_api_client,node_student_ui,node_company_ui,node_admin_ui,node_company_user,node_admin_user toneBlue
class node_auth_service,node_auth_accounts toneAmber
class node_profile_api,node_profile_core,node_cv_storage,node_jobs_api,node_jobs_core toneMint
class node_matching_api,node_matching_engine toneRose
class node_n8n,node_mcp,node_mcp_ports,node_student toneIndigo
```

## Components

### Frontend

- [App routing](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Auth client](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/services/authService.ts): `frontend/src/services/authService.ts`
- [API client](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/services/api.ts): `frontend/src/services/api.ts`
- [Student workspace](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/pages/StudentArea.tsx): `frontend/src/pages/StudentArea.tsx`
- [Company workspace](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/pages/CompanyArea.tsx): `frontend/src/pages/CompanyArea.tsx`
- [Admin workspace](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/frontend/src/pages/AdminArea.tsx): `frontend/src/pages/AdminArea.tsx`

### Identity

- [Auth service](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/auth-service/src/auth/auth.service.ts): `services/auth-service/src/auth/auth.service.ts`
- [Account store](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/auth-service/src/users/user.entity.ts): `services/auth-service/src/users/user.entity.ts`

### Profiles and Jobs

- [Profile API](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/api/routes_profiles.py): `services/profile-service/app/api/routes_profiles.py`
- [Profile management](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/application/profile_service.py): `services/profile-service/app/application/profile_service.py`
- [CV storage](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/profile-service/app/infrastructure/storage_fs.py): `services/profile-service/app/infrastructure/storage_fs.py`
- [Jobs API](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/jobs-service/app/api/routes_jobs.py): `services/jobs-service/app/api/routes_jobs.py`
- [Job management](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/jobs-service/app/application/job_service.py): `services/jobs-service/app/application/job_service.py`

### Matching and AI

- [Matching API](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/matching-service/app/api/routes.py): `services/matching-service/app/api/routes.py`
- [Rule engine](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/services/matching-service/app/domain/engine.py): `services/matching-service/app/domain/engine.py`

### Agent Tooling

- [AI workflows](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/n8n/generate_workflows.py): `n8n/generate_workflows.py`
- [MCP tools](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/mcp-tools/app/main.py): `mcp-tools/app/main.py`
- [Tool gateways](https://github.com/grupo-1-epialc/bolsa-de-trabajo/blob/dev/mcp-tools/app/domain/ports.py): `mcp-tools/app/domain/ports.py`

### Other components

- **Student**
- **Company user**
- **Admin user**

## Connections

- Student → App routing: uses (evidence: `README.md`)
- Company user → App routing: uses (evidence: `README.md`)
- Admin user → App routing: uses (evidence: `README.md`)
- App routing → Auth client: routes auth (evidence: `frontend/src/App.tsx`)
- Auth client → API client: calls (evidence: `frontend/src/services/authService.ts`)
- App routing → Student workspace: renders (evidence: `frontend/src/App.tsx`)
- App routing → Company workspace: renders (evidence: `frontend/src/App.tsx`)
- App routing → Admin workspace: renders (evidence: `frontend/src/App.tsx`)
- Auth client → Auth service: requests auth (evidence: `frontend/src/services/authService.ts`)
- Auth service → Account store: persists accounts (evidence: `services/auth-service/src/auth/auth.service.ts`)
- Student workspace → Profile API: manages profile (evidence: `README.md`)
- Company workspace → Jobs API: manages vacancies (evidence: `README.md`)
- Admin workspace → Matching API: configures matching (evidence: `README.md`)
- Profile API → Profile management: delegates to (evidence: `services/profile-service/app/api/routes_profiles.py`)
- Profile management → CV storage: stores CVs (evidence: `README.md`)
- Jobs API → Job management: calls (evidence: `services/jobs-service/app/api/routes_jobs.py`)
- Matching API → Rule engine: computes matches (evidence: `services/matching-service/app/api/routes.py`)
- AI workflows → MCP tools: calls directly (evidence: `README.md`)
- MCP tools → Tool gateways: uses gateways (evidence: `mcp-tools/app/domain/ports.py`)
- AI workflows → Profile API: requests CV extraction (evidence: `README.md`)
- AI workflows → Matching API: requests recommendations (evidence: `README.md`)
