# mc-soltice/lab-app architecture

> Architecture diagram of the GitHub repository mc-soltice/lab-app, 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/mc-soltice/lab-app
- Repository: https://github.com/mc-soltice/lab-app

## Overview

LAB is a French-language publishing and community platform spanning posts, podcasts, books, user accounts, and administration. A principal workflow is creating content through an authenticated API, then exposing published content for browsing and search; users can also manage profiles and notifications. The tree shows separate public, user, and admin interfaces plus API routes and service/repository layers. Sampled routes confirm some service calls and direct persistence access; other route-to-service wiring is not expanded where source was not sampled.

Main entry points: [`app/api/auth/[...nextauth]/route.ts`](https://github.com/mc-soltice/lab-app/blob/main/app/api/auth/%5B...nextauth%5D/route.ts) (Authentication routes), [`lib/services/search.service.ts`](https://github.com/mc-soltice/lab-app/blob/main/lib/services/search.service.ts) (Search service), [`app/api/me/route.ts`](https://github.com/mc-soltice/lab-app/blob/main/app/api/me/route.ts) (Profile endpoint), [`app/api/posts/route.ts`](https://github.com/mc-soltice/lab-app/blob/main/app/api/posts/route.ts) (Post feed / create)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Web experience"]
  node_public_pages["Public pages<br/>[page.tsx]"]
  node_content_pages["Content pages<br/>[page.tsx]"]
  node_admin_pages["Admin dashboard<br/>[page.tsx]"]
end

subgraph group_api["API entry points"]
  node_post_api["Post feed / create<br/>[route.ts]"]
  node_podcast_api["Podcast list / create<br/>[route.ts]"]
  node_book_api["Book creation<br/>[route.ts]"]
  node_profile_api["Profile endpoint<br/>[route.ts]"]
  node_notification_api["Notifications endpoint<br/>[route.ts]"]
  node_search_api["Search endpoint<br/>[route.ts]"]
  node_category_api["Categories endpoint<br/>[route.ts]"]
  node_emission_api["Emissions endpoint<br/>[route.ts]"]
  node_admin_book_api["Admin books endpoint<br/>[route.ts]"]
  node_upload_api["Media upload endpoint<br/>[route.ts]"]
  node_auth_api["Authentication routes<br/>[route.ts]"]
end

subgraph group_domain["Domain services"]
  node_post_service["Post service<br/>[post.service.ts]"]
  node_podcast_service["Podcast service<br/>[podcast.service.ts]"]
  node_book_service["Book service<br/>[book.service.ts]"]
  node_user_service["User service<br/>[user.service.ts]"]
  node_notification_service["Notification service"]
  node_search_service["Search service<br/>[search.service.ts]"]
  node_category_service["Category service"]
  node_emission_service["Emission service"]
end

subgraph group_data["Data access"]
  node_user_repository["User repository<br/>[user.repository.ts]"]
  node_book_repository["Book repository<br/>[book.repository.ts]"]
  node_prisma_client["Prisma client<br/>[client.ts]"]
  node_database[("Application database")]
end

subgraph group_integrations["External services"]
  node_cloudinary["Cloudinary media"]
end

node_visitor(("Visitor / user"))

node_visitor -->|"browses"| node_public_pages
node_visitor -->|"uses"| node_content_pages
node_visitor -->|"administers"| node_admin_pages
node_post_api -->|"calls"| node_post_service
node_post_api -->|"gets session"| node_auth_api
node_podcast_api -->|"calls"| node_podcast_service
node_podcast_api -->|"gets session"| node_auth_api
node_book_api -->|"calls"| node_book_service
node_book_api -->|"gets session"| node_auth_api
node_profile_api -->|"gets session"| node_auth_api
node_profile_api -->|"reads profile"| node_user_repository
node_profile_api -->|"updates profile"| node_user_service
node_notification_api -->|"gets session"| node_auth_api
node_notification_api -->|"calls"| node_notification_service
node_search_api -->|"calls"| node_search_service
node_search_service -->|"searches posts"| node_post_service
node_search_service -->|"searches podcasts"| node_podcast_service
node_search_service -->|"searches books"| node_book_service
node_search_service -->|"queries users, tags"| node_prisma_client
node_category_api -->|"calls"| node_category_service
node_emission_api -->|"calls"| node_emission_service
node_admin_book_api -->|"gets user"| node_auth_api
node_admin_book_api -->|"reads books, stats"| node_book_repository
node_upload_api -->|"uploads / deletes"| node_cloudinary
node_prisma_client -->|"accesses"| node_database

click node_public_pages "https://github.com/mc-soltice/lab-app/blob/main/app/(public)/home/page.tsx"
click node_content_pages "https://github.com/mc-soltice/lab-app/blob/main/app/(user)/post/page.tsx"
click node_admin_pages "https://github.com/mc-soltice/lab-app/blob/main/app/(admin)/dashboard/page.tsx"
click node_post_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/posts/route.ts"
click node_podcast_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/podcasts/route.ts"
click node_book_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/books/route.ts"
click node_profile_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/me/route.ts"
click node_notification_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/notifications/route.ts"
click node_search_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/search/route.ts"
click node_category_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/categories/route.ts"
click node_emission_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/emissions/route.ts"
click node_admin_book_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/admin/books/route.ts"
click node_upload_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/upload/route.ts"
click node_auth_api "https://github.com/mc-soltice/lab-app/blob/main/app/api/auth/%5B...nextauth%5D/route.ts"
click node_post_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/post.service.ts"
click node_podcast_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/podcast.service.ts"
click node_book_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/book.service.ts"
click node_user_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/user.service.ts"
click node_notification_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/notification.service.ts"
click node_search_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/search.service.ts"
click node_category_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/category.service.ts"
click node_emission_service "https://github.com/mc-soltice/lab-app/blob/main/lib/services/emission.service.ts"
click node_user_repository "https://github.com/mc-soltice/lab-app/blob/main/lib/repositories/user.repository.ts"
click node_book_repository "https://github.com/mc-soltice/lab-app/blob/main/lib/repositories/book.repository.ts"
click node_prisma_client "https://github.com/mc-soltice/lab-app/blob/main/lib/prisma/client.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_public_pages,node_content_pages,node_admin_pages,node_visitor toneBlue
class node_post_api,node_podcast_api,node_book_api,node_profile_api,node_notification_api,node_search_api,node_category_api,node_emission_api,node_admin_book_api,node_upload_api,node_auth_api toneAmber
class node_post_service,node_podcast_service,node_book_service,node_user_service,node_notification_service,node_search_service,node_category_service,node_emission_service toneMint
class node_user_repository,node_book_repository,node_prisma_client,node_database toneRose
class node_cloudinary toneIndigo
```

## Components

### Web experience

- [Public pages](https://github.com/mc-soltice/lab-app/blob/main/app/(public)/home/page.tsx): `app/(public)/home/page.tsx`
- [Content pages](https://github.com/mc-soltice/lab-app/blob/main/app/(user)/post/page.tsx): `app/(user)/post/page.tsx`
- [Admin dashboard](https://github.com/mc-soltice/lab-app/blob/main/app/(admin)/dashboard/page.tsx): `app/(admin)/dashboard/page.tsx`

### API entry points

- [Post feed / create](https://github.com/mc-soltice/lab-app/blob/main/app/api/posts/route.ts): `app/api/posts/route.ts`
- [Podcast list / create](https://github.com/mc-soltice/lab-app/blob/main/app/api/podcasts/route.ts): `app/api/podcasts/route.ts`
- [Book creation](https://github.com/mc-soltice/lab-app/blob/main/app/api/books/route.ts): `app/api/books/route.ts`
- [Profile endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/me/route.ts): `app/api/me/route.ts`
- [Notifications endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/notifications/route.ts): `app/api/notifications/route.ts`
- [Search endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/search/route.ts): `app/api/search/route.ts`
- [Categories endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/categories/route.ts): `app/api/categories/route.ts`
- [Emissions endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/emissions/route.ts): `app/api/emissions/route.ts`
- [Admin books endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/admin/books/route.ts): `app/api/admin/books/route.ts`
- [Media upload endpoint](https://github.com/mc-soltice/lab-app/blob/main/app/api/upload/route.ts): `app/api/upload/route.ts`
- [Authentication routes](https://github.com/mc-soltice/lab-app/blob/main/app/api/auth/%5B...nextauth%5D/route.ts): `app/api/auth/[...nextauth]/route.ts`

### Domain services

- [Post service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/post.service.ts): `lib/services/post.service.ts`
- [Podcast service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/podcast.service.ts): `lib/services/podcast.service.ts`
- [Book service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/book.service.ts): `lib/services/book.service.ts`
- [User service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/user.service.ts): `lib/services/user.service.ts`
- [Notification service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/notification.service.ts): `lib/services/notification.service.ts`
- [Search service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/search.service.ts): `lib/services/search.service.ts`
- [Category service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/category.service.ts): `lib/services/category.service.ts`
- [Emission service](https://github.com/mc-soltice/lab-app/blob/main/lib/services/emission.service.ts): `lib/services/emission.service.ts`

### Data access

- [User repository](https://github.com/mc-soltice/lab-app/blob/main/lib/repositories/user.repository.ts): `lib/repositories/user.repository.ts`
- [Book repository](https://github.com/mc-soltice/lab-app/blob/main/lib/repositories/book.repository.ts): `lib/repositories/book.repository.ts`
- [Prisma client](https://github.com/mc-soltice/lab-app/blob/main/lib/prisma/client.ts): `lib/prisma/client.ts`
- **Application database**

### External services

- **Cloudinary media**

### Other components

- **Visitor / user**

## Connections

- Visitor / user → Public pages: browses
- Visitor / user → Content pages: uses
- Visitor / user → Admin dashboard: administers
- Post feed / create → Post service: calls
- Post feed / create → Authentication routes: gets session
- Podcast list / create → Podcast service: calls
- Podcast list / create → Authentication routes: gets session
- Book creation → Book service: calls
- Book creation → Authentication routes: gets session
- Profile endpoint → Authentication routes: gets session
- Profile endpoint → User repository: reads profile
- Profile endpoint → User service: updates profile
- Notifications endpoint → Authentication routes: gets session
- Notifications endpoint → Notification service: calls
- Search endpoint → Search service: calls
- Search service → Post service: searches posts
- Search service → Podcast service: searches podcasts
- Search service → Book service: searches books
- Search service → Prisma client: queries users, tags
- Categories endpoint → Category service: calls
- Emissions endpoint → Emission service: calls
- Admin books endpoint → Authentication routes: gets user
- Admin books endpoint → Book repository: reads books, stats
- Media upload endpoint → Cloudinary media: uploads / deletes
- Prisma client → Application database: accesses
