# 9090856788/portfolio architecture

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

- Interactive diagram: https://gitdiagram.com/9090856788/portfolio
- Repository: https://github.com/9090856788/portfolio

## Overview

Portfolio is a public-facing personal portfolio with a separate owner workspace and REST backend. Visitors browse profile, projects, skills, software, timeline, resume, and contact pages; the owner authenticates to manage those records, messages, and resume versions. The backend routes requests to controllers, which use persistent models and a fallback DataStore; contact messaging can send email, and uploaded profile assets can use Cloudinary. The README only identifies the product, so broader capabilities and wiring are based on the supplied tree and excerpts; client/admin API details and most controller internals were not sampled.

Main entry points: [`server/app.js`](https://github.com/9090856788/portfolio/blob/main/server/app.js) (Express API), [`admin/src/App.jsx`](https://github.com/9090856788/portfolio/blob/main/admin/src/App.jsx) (Admin app), [`server/controller/userController.js`](https://github.com/9090856788/portfolio/blob/main/server/controller/userController.js) (Account controller), [`server/controller/messageController.js`](https://github.com/9090856788/portfolio/blob/main/server/controller/messageController.js) (Message controller)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_visitor["Public portfolio"]
  node_clientapp["Portfolio app<br/>[App.jsx]"]
  node_publicpages["Portfolio pages"]
  node_contactform["Contact form<br/>[ContactForm.jsx]"]
  node_clientapi["Portfolio API client<br/>[portfolioApi.js]"]
end

subgraph group_owner["Owner workspace"]
  node_adminapp["Admin app<br/>[App.jsx]"]
  node_adminauth["Admin authentication<br/>[AdminAuth.jsx]"]
  node_adminpages["Management pages"]
  node_resumebuilder["Resume builder"]
  node_adminapi["Admin API client<br/>[adminApi.js]"]
end

subgraph group_api["REST service"]
  node_service["Express API<br/>[app.js]"]
  node_useroutes["User routes<br/>[userRoutes.js]"]
  node_messageroutes["Message routes<br/>[messageRoutes.js]"]
  node_domainroutes["Portfolio routes"]
end

subgraph group_domain["Domain services"]
  node_usercontroller["Account controller<br/>[userController.js]"]
  node_messagecontroller["Message controller"]
  node_resumecontroller["Resume controller"]
  node_contentcontrollers["Content controllers"]
  node_datastore[("Fallback data store<br/>[store.js]")]
  node_models[("MongoDB models")]
  node_email["Email delivery<br/>[sendEmail.js]"]
  node_filehandler["File handling<br/>[fileHandler.js]"]
end

node_visitor(("Portfolio visitor"))
node_owneractor(("Portfolio owner"))
node_cloudinary["Cloudinary"]

node_visitor -->|"opens"| node_clientapp
node_clientapp -->|"routes to"| node_publicpages
node_publicpages -->|"requests data"| node_clientapi
node_contactform -->|"submits inquiry"| node_clientapi
node_owneractor -->|"opens"| node_adminapp
node_adminapp -->|"guards access"| node_adminauth
node_adminapp -->|"selects views"| node_adminpages
node_adminapp -->|"selects view"| node_resumebuilder
node_adminauth -->|"uses"| node_adminapi
node_adminpages -->|"uses"| node_adminapi
node_resumebuilder -->|"uses"| node_adminapi
node_clientapi -->|"HTTP requests"| node_service
node_adminapi -->|"HTTP requests"| node_service
node_service -->|"dispatches"| node_useroutes
node_service -->|"dispatches"| node_messageroutes
node_service -->|"dispatches"| node_domainroutes
node_useroutes -->|"dispatches"| node_usercontroller
node_messageroutes -->|"dispatches"| node_messagecontroller
node_domainroutes -->|"dispatches"| node_contentcontrollers
node_domainroutes -->|"dispatches"| node_resumecontroller
node_usercontroller -->|"reads/writes"| node_datastore
node_messagecontroller -->|"reads/writes"| node_datastore
node_resumecontroller -->|"reads"| node_datastore
node_messagecontroller -->|"reads/writes"| node_models
node_usercontroller -->|"reads/writes"| node_models
node_resumecontroller -->|"uses"| node_models
node_contentcontrollers -->|"uses"| node_models
node_messagecontroller -->|"sends mail"| node_email
node_usercontroller -->|"processes uploads"| node_filehandler
node_filehandler -.->|"uploads assets"| node_cloudinary

click node_clientapp "https://github.com/9090856788/portfolio/blob/main/client/src/App.jsx"
click node_publicpages "https://github.com/9090856788/portfolio/tree/main/client/src/pages"
click node_contactform "https://github.com/9090856788/portfolio/blob/main/client/src/components/ContactForm.jsx"
click node_clientapi "https://github.com/9090856788/portfolio/blob/main/client/src/api/portfolioApi.js"
click node_adminapp "https://github.com/9090856788/portfolio/blob/main/admin/src/App.jsx"
click node_adminauth "https://github.com/9090856788/portfolio/blob/main/admin/src/components/AdminAuth.jsx"
click node_adminpages "https://github.com/9090856788/portfolio/tree/main/admin/src/pages"
click node_resumebuilder "https://github.com/9090856788/portfolio/blob/main/admin/src/pages/resume/ResumeBuilderPage.jsx"
click node_adminapi "https://github.com/9090856788/portfolio/blob/main/admin/src/api/adminApi.js"
click node_service "https://github.com/9090856788/portfolio/blob/main/server/app.js"
click node_useroutes "https://github.com/9090856788/portfolio/blob/main/server/router/userRoutes.js"
click node_messageroutes "https://github.com/9090856788/portfolio/blob/main/server/router/messageRoutes.js"
click node_domainroutes "https://github.com/9090856788/portfolio/tree/main/server/router"
click node_usercontroller "https://github.com/9090856788/portfolio/blob/main/server/controller/userController.js"
click node_messagecontroller "https://github.com/9090856788/portfolio/blob/main/server/controller/messageController.js"
click node_resumecontroller "https://github.com/9090856788/portfolio/blob/main/server/controller/resumeController.js"
click node_contentcontrollers "https://github.com/9090856788/portfolio/tree/main/server/controller"
click node_datastore "https://github.com/9090856788/portfolio/blob/main/server/data/store.js"
click node_models "https://github.com/9090856788/portfolio/tree/main/server/models"
click node_email "https://github.com/9090856788/portfolio/blob/main/server/utils/sendEmail.js"
click node_filehandler "https://github.com/9090856788/portfolio/blob/main/server/utils/fileHandler.js"

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_clientapp,node_publicpages,node_contactform,node_clientapi toneBlue
class node_adminapp,node_adminauth,node_adminpages,node_resumebuilder,node_adminapi toneAmber
class node_service,node_useroutes,node_messageroutes,node_domainroutes toneMint
class node_usercontroller,node_messagecontroller,node_resumecontroller,node_contentcontrollers,node_datastore,node_models,node_email,node_filehandler toneRose
class node_visitor,node_owneractor,node_cloudinary toneIndigo
```

## Components

### Public portfolio

- [Portfolio app](https://github.com/9090856788/portfolio/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [Portfolio pages](https://github.com/9090856788/portfolio/tree/main/client/src/pages): `client/src/pages`
- [Contact form](https://github.com/9090856788/portfolio/blob/main/client/src/components/ContactForm.jsx): `client/src/components/ContactForm.jsx`
- [Portfolio API client](https://github.com/9090856788/portfolio/blob/main/client/src/api/portfolioApi.js): `client/src/api/portfolioApi.js`

### Owner workspace

- [Admin app](https://github.com/9090856788/portfolio/blob/main/admin/src/App.jsx): `admin/src/App.jsx`
- [Admin authentication](https://github.com/9090856788/portfolio/blob/main/admin/src/components/AdminAuth.jsx): `admin/src/components/AdminAuth.jsx`
- [Management pages](https://github.com/9090856788/portfolio/tree/main/admin/src/pages): `admin/src/pages`
- [Resume builder](https://github.com/9090856788/portfolio/blob/main/admin/src/pages/resume/ResumeBuilderPage.jsx): `admin/src/pages/resume/ResumeBuilderPage.jsx`
- [Admin API client](https://github.com/9090856788/portfolio/blob/main/admin/src/api/adminApi.js): `admin/src/api/adminApi.js`

### REST service

- [Express API](https://github.com/9090856788/portfolio/blob/main/server/app.js): `server/app.js`
- [User routes](https://github.com/9090856788/portfolio/blob/main/server/router/userRoutes.js): `server/router/userRoutes.js`
- [Message routes](https://github.com/9090856788/portfolio/blob/main/server/router/messageRoutes.js): `server/router/messageRoutes.js`
- [Portfolio routes](https://github.com/9090856788/portfolio/tree/main/server/router): `server/router`

### Domain services

- [Account controller](https://github.com/9090856788/portfolio/blob/main/server/controller/userController.js): `server/controller/userController.js`
- [Message controller](https://github.com/9090856788/portfolio/blob/main/server/controller/messageController.js): `server/controller/messageController.js`
- [Resume controller](https://github.com/9090856788/portfolio/blob/main/server/controller/resumeController.js): `server/controller/resumeController.js`
- [Content controllers](https://github.com/9090856788/portfolio/tree/main/server/controller): `server/controller`
- [Fallback data store](https://github.com/9090856788/portfolio/blob/main/server/data/store.js): `server/data/store.js`
- [MongoDB models](https://github.com/9090856788/portfolio/tree/main/server/models): `server/models`
- [Email delivery](https://github.com/9090856788/portfolio/blob/main/server/utils/sendEmail.js): `server/utils/sendEmail.js`
- [File handling](https://github.com/9090856788/portfolio/blob/main/server/utils/fileHandler.js): `server/utils/fileHandler.js`

### Other components

- **Portfolio visitor**
- **Portfolio owner**
- **Cloudinary**

## Connections

- Portfolio visitor → Portfolio app: opens
- Portfolio app → Portfolio pages: routes to
- Portfolio pages → Portfolio API client: requests data
- Contact form → Portfolio API client: submits inquiry
- Portfolio owner → Admin app: opens
- Admin app → Admin authentication: guards access
- Admin app → Management pages: selects views
- Admin app → Resume builder: selects view
- Admin authentication → Admin API client: uses
- Management pages → Admin API client: uses
- Resume builder → Admin API client: uses
- Portfolio API client → Express API: HTTP requests
- Admin API client → Express API: HTTP requests
- Express API → User routes: dispatches
- Express API → Message routes: dispatches
- Express API → Portfolio routes: dispatches
- User routes → Account controller: dispatches
- Message routes → Message controller: dispatches
- Portfolio routes → Content controllers: dispatches
- Portfolio routes → Resume controller: dispatches
- Account controller → Fallback data store: reads/writes
- Message controller → Fallback data store: reads/writes
- Resume controller → Fallback data store: reads
- Message controller → MongoDB models: reads/writes
- Account controller → MongoDB models: reads/writes
- Resume controller → MongoDB models: uses
- Content controllers → MongoDB models: uses
- Message controller → Email delivery: sends mail
- Account controller → File handling: processes uploads
- File handling → Cloudinary: uploads assets
