# hudsonjr90/portfoliossr architecture

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

- Interactive diagram: https://gitdiagram.com/hudsonjr90/portfoliossr
- Repository: https://github.com/hudsonjr90/portfoliossr

## Overview

This is a Nuxt portfolio application: visitors browse a data-backed professional profile, while a development-only admin manages portfolio records. The public data path is documented as Nitro API → service → repository → Prisma/PostgreSQL; sampled service and repository code confirm the transformation and query stages. The README documents project listing and authenticated admin CRUD for projects, education, experience, testimonials, and technologies. Admin section components are visible in the dashboard, but most endpoint implementations and public-page data wiring were not sampled, so those connections are omitted or marked unverified.

Main entry points: [`app/components/pages/admin/AdminDashboard.vue`](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminDashboard.vue) (Admin dashboard), [`server/api/dev-admin`](https://github.com/hudsonjr90/portfoliossr/tree/main/server/api/dev-admin) (Admin endpoints), [`app/pages/index.vue`](https://github.com/hudsonjr90/portfoliossr/blob/main/app/pages/index.vue) (Portfolio page), [`server/utils/prisma.ts`](https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/prisma.ts) (Prisma client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public portfolio"]
  node_portfolio_page["Portfolio page<br/>[index.vue]"]
  node_profile_sections["Profile sections"]
  node_project_showcase["Project showcase"]
end

subgraph group_backend["Portfolio data"]
  node_public_api["Portfolio API<br/>[portfolio.get.ts]"]
  node_project_api["Project API<br/>[projects.get.ts]"]
  node_portfolio_service["Portfolio service"]
  node_portfolio_repository["Portfolio repository"]
end

subgraph group_admin["Development admin"]
  node_admin_page["Admin page<br/>[admin.vue]"]
  node_admin_dashboard["Admin dashboard<br/>[AdminDashboard.vue]"]
  node_admin_education["Education editor"]
  node_admin_experience["Experience editor"]
  node_admin_technology["Technology editor"]
  node_admin_testimonials["Testimonial editor"]
  node_admin_api["Admin endpoints"]
  node_admin_auth["Session controls<br/>[dev-admin.ts]"]
  node_admin_validation["Input validation"]
  node_admin_records["Record checks<br/>[admin-records.ts]"]
end

subgraph group_persistence["Persistence"]
  node_prisma_client["Prisma client<br/>[prisma.ts]"]
  node_database[("PostgreSQL")]
end

node_visitor(("Visitor"))

node_visitor -->|"opens"| node_portfolio_page
node_portfolio_page -.->|"renders"| node_profile_sections
node_portfolio_page -.->|"renders"| node_project_showcase
node_portfolio_page -.->|"requests data"| node_public_api
node_project_showcase -.->|"loads projects"| node_project_api
node_public_api -->|"delegates to"| node_portfolio_service
node_portfolio_service -->|"calls"| node_portfolio_repository
node_portfolio_repository -->|"queries"| node_prisma_client
node_project_api -->|"queries"| node_prisma_client
node_prisma_client -->|"persists data"| node_database
node_visitor -.->|"opens"| node_admin_page
node_admin_page -.->|"renders"| node_admin_dashboard
node_admin_dashboard -->|"renders"| node_admin_education
node_admin_dashboard -->|"renders"| node_admin_experience
node_admin_dashboard -->|"renders"| node_admin_technology
node_admin_dashboard -->|"renders"| node_admin_testimonials
node_admin_dashboard -->|"manages projects"| node_admin_api
node_admin_dashboard -->|"authenticates"| node_admin_api
node_admin_api -->|"checks session"| node_admin_auth
node_admin_api -->|"validates input"| node_admin_validation
node_admin_api -->|"checks records"| node_admin_records
node_admin_api -->|"writes records"| node_prisma_client

click node_portfolio_page "https://github.com/hudsonjr90/portfoliossr/blob/main/app/pages/index.vue"
click node_profile_sections "https://github.com/hudsonjr90/portfoliossr/tree/main/app/components/pages"
click node_project_showcase "https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/ProjectsSection.vue"
click node_public_api "https://github.com/hudsonjr90/portfoliossr/blob/main/server/api/portfolio.get.ts"
click node_project_api "https://github.com/hudsonjr90/portfoliossr/blob/main/server/api/projects.get.ts"
click node_portfolio_service "https://github.com/hudsonjr90/portfoliossr/blob/main/server/services/portfolio.service.ts"
click node_portfolio_repository "https://github.com/hudsonjr90/portfoliossr/blob/main/server/repositories/portfolio.repository.ts"
click node_admin_page "https://github.com/hudsonjr90/portfoliossr/blob/main/app/pages/admin.vue"
click node_admin_dashboard "https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminDashboard.vue"
click node_admin_education "https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminEducationSection.vue"
click node_admin_experience "https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminExperienceSection.vue"
click node_admin_technology "https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminTechnologySection.vue"
click node_admin_testimonials "https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminTestimonialsSection.vue"
click node_admin_api "https://github.com/hudsonjr90/portfoliossr/tree/main/server/api/dev-admin"
click node_admin_auth "https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/dev-admin.ts"
click node_admin_validation "https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/admin-record-input.ts"
click node_admin_records "https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/admin-records.ts"
click node_prisma_client "https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/prisma.ts"

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_portfolio_page,node_profile_sections,node_project_showcase toneBlue
class node_public_api,node_project_api,node_portfolio_service,node_portfolio_repository toneAmber
class node_admin_page,node_admin_dashboard,node_admin_education,node_admin_experience,node_admin_technology,node_admin_testimonials,node_admin_api,node_admin_auth,node_admin_validation,node_admin_records toneMint
class node_prisma_client,node_database toneRose
class node_visitor toneIndigo
```

## Components

### Public portfolio

- [Portfolio page](https://github.com/hudsonjr90/portfoliossr/blob/main/app/pages/index.vue): `app/pages/index.vue`
- [Profile sections](https://github.com/hudsonjr90/portfoliossr/tree/main/app/components/pages): `app/components/pages`
- [Project showcase](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/ProjectsSection.vue): `app/components/pages/ProjectsSection.vue`

### Portfolio data

- [Portfolio API](https://github.com/hudsonjr90/portfoliossr/blob/main/server/api/portfolio.get.ts): `server/api/portfolio.get.ts`
- [Project API](https://github.com/hudsonjr90/portfoliossr/blob/main/server/api/projects.get.ts): `server/api/projects.get.ts`
- [Portfolio service](https://github.com/hudsonjr90/portfoliossr/blob/main/server/services/portfolio.service.ts): `server/services/portfolio.service.ts`
- [Portfolio repository](https://github.com/hudsonjr90/portfoliossr/blob/main/server/repositories/portfolio.repository.ts): `server/repositories/portfolio.repository.ts`

### Development admin

- [Admin page](https://github.com/hudsonjr90/portfoliossr/blob/main/app/pages/admin.vue): `app/pages/admin.vue`
- [Admin dashboard](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminDashboard.vue): `app/components/pages/admin/AdminDashboard.vue`
- [Education editor](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminEducationSection.vue): `app/components/pages/admin/AdminEducationSection.vue`
- [Experience editor](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminExperienceSection.vue): `app/components/pages/admin/AdminExperienceSection.vue`
- [Technology editor](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminTechnologySection.vue): `app/components/pages/admin/AdminTechnologySection.vue`
- [Testimonial editor](https://github.com/hudsonjr90/portfoliossr/blob/main/app/components/pages/admin/AdminTestimonialsSection.vue): `app/components/pages/admin/AdminTestimonialsSection.vue`
- [Admin endpoints](https://github.com/hudsonjr90/portfoliossr/tree/main/server/api/dev-admin): `server/api/dev-admin`
- [Session controls](https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/dev-admin.ts): `server/utils/dev-admin.ts`
- [Input validation](https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/admin-record-input.ts): `server/utils/admin-record-input.ts`
- [Record checks](https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/admin-records.ts): `server/utils/admin-records.ts`

### Persistence

- [Prisma client](https://github.com/hudsonjr90/portfoliossr/blob/main/server/utils/prisma.ts): `server/utils/prisma.ts`
- **PostgreSQL**

### Other components

- **Visitor**

## Connections

- Visitor → Portfolio page: opens (evidence: `README.md`)
- Portfolio page → Profile sections: renders
- Portfolio page → Project showcase: renders
- Portfolio page → Portfolio API: requests data
- Project showcase → Project API: loads projects
- Portfolio API → Portfolio service: delegates to (evidence: `README.md`)
- Portfolio service → Portfolio repository: calls (evidence: `server/services/portfolio.service.ts`)
- Portfolio repository → Prisma client: queries (evidence: `server/repositories/portfolio.repository.ts`)
- Project API → Prisma client: queries (evidence: `server/api/projects.get.ts`)
- Prisma client → PostgreSQL: persists data (evidence: `README.md`)
- Visitor → Admin page: opens
- Admin page → Admin dashboard: renders
- Admin dashboard → Education editor: renders (evidence: `app/components/pages/admin/AdminDashboard.vue`)
- Admin dashboard → Experience editor: renders (evidence: `app/components/pages/admin/AdminDashboard.vue`)
- Admin dashboard → Technology editor: renders (evidence: `app/components/pages/admin/AdminDashboard.vue`)
- Admin dashboard → Testimonial editor: renders (evidence: `app/components/pages/admin/AdminDashboard.vue`)
- Admin dashboard → Admin endpoints: manages projects (evidence: `app/components/pages/admin/AdminDashboard.vue`)
- Admin dashboard → Admin endpoints: authenticates (evidence: `app/components/pages/admin/AdminDashboard.vue`)
- Admin endpoints → Session controls: checks session (evidence: `server/api/dev-admin/experiences.post.ts`)
- Admin endpoints → Input validation: validates input (evidence: `server/api/dev-admin/experiences.post.ts`)
- Admin endpoints → Record checks: checks records (evidence: `server/api/dev-admin/experiences.post.ts`)
- Admin endpoints → Prisma client: writes records (evidence: `server/api/dev-admin/experiences.post.ts`)
