# pustamrai/ebooks architecture

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

- Interactive diagram: https://gitdiagram.com/pustamrai/ebooks
- Repository: https://github.com/pustamrai/ebooks

## Overview

This is an e-book catalog and download application with account registration, login, book submission, browsing, and book-detail views. Its main workflow is browsing the catalog, opening a book, and downloading its file; signed-in users can submit books, whose files are uploaded to Cloudinary and whose metadata is stored in MongoDB. Authentication uses cookie-backed tokens and a client-side context. The README is a generic Next.js starter and documents no product-specific capabilities; several page and API implementations were not excerpted, so their internal relationships are not inferred.

Main entry points: [`src/lib/db.ts`](https://github.com/pustamrai/ebooks/blob/main/src/lib/db.ts) (Database connection), [`src/app/api/books/add-book/route.ts`](https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/add-book/route.ts) (Book submission API), [`src/components/layouts/Navbar.tsx`](https://github.com/pustamrai/ebooks/blob/main/src/components/layouts/Navbar.tsx) (Navigation), [`src/app/api/users/me/route.ts`](https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/me/route.ts) (Current-user API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_home["Catalog page<br/>[page.tsx]"]
  node_booklist["Book list<br/>[BookList.tsx]"]
  node_bookcard["Book card<br/>[BookCard.tsx]"]
  node_detail["Book detail<br/>[page.tsx]"]
  node_download["Download button<br/>[DownloadButton.tsx]"]
  node_addpage["Submit book page<br/>[page.tsx]"]
  node_layout["App layout<br/>[layout.tsx]"]
  node_navbar["Navigation<br/>[Navbar.tsx]"]
end

subgraph group_identity["Accounts"]
  node_authcontext["Auth context<br/>[AuthContext.tsx]"]
  node_loginpage["Login page<br/>[page.tsx]"]
  node_loginform["Login form<br/>[LoginForm.tsx]"]
  node_signuppage["Signup page<br/>[page.tsx]"]
  node_signupform["Signup form<br/>[SignupForm.tsx]"]
  node_logout["Logout control<br/>[LogoutButton.tsx]"]
  node_meapi["Current-user API<br/>[route.ts]"]
  node_loginapi["Login API<br/>[route.ts]"]
  node_signupapi["Signup API<br/>[route.ts]"]
end

subgraph group_catalog["Book catalog"]
  node_addapi["Book submission API<br/>[route.ts]"]
  node_listapi["Book listing API<br/>[route.ts]"]
  node_singleapi["Single-book API<br/>[route.ts]"]
end

subgraph group_services["Application services"]
  node_verify["Token verification<br/>[verifyToken.ts]"]
  node_cloudinary["File hosting<br/>[cloudinary.ts]"]
  node_dbconnect["Database connection<br/>[db.ts]"]
end

subgraph group_storage["Persistence"]
  node_bookmodel[("Book model<br/>[book.models.ts]")]
  node_usermodel[("User model<br/>[user.models.ts]")]
end

node_visitor(("Reader"))

node_visitor -->|"browses"| node_home
node_home -->|"renders"| node_booklist
node_booklist -->|"renders"| node_bookcard
node_visitor -->|"opens"| node_detail
node_detail -->|"renders"| node_download
node_visitor -->|"submits"| node_addpage
node_layout -->|"renders"| node_navbar
node_layout -->|"provides"| node_authcontext
node_navbar -->|"reads"| node_authcontext
node_navbar -->|"renders"| node_logout
node_navbar -->|"routes to"| node_addpage
node_visitor -->|"signs in"| node_loginpage
node_loginpage -->|"renders"| node_loginform
node_visitor -->|"registers"| node_signuppage
node_signuppage -->|"renders"| node_signupform
node_authcontext -->|"fetches user"| node_meapi
node_meapi -->|"verifies token"| node_verify
node_meapi -->|"loads user"| node_usermodel
node_loginapi -->|"checks credentials"| node_usermodel
node_signupapi -->|"creates user"| node_usermodel
node_addapi -->|"verifies token"| node_verify
node_addapi -->|"uploads files"| node_cloudinary
node_addapi -->|"creates book"| node_bookmodel
node_listapi -->|"queries books"| node_bookmodel
node_singleapi -->|"loads book"| node_bookmodel
node_addapi -->|"connects"| node_dbconnect
node_loginapi -->|"connects"| node_dbconnect
node_signupapi -->|"connects"| node_dbconnect
node_listapi -->|"connects"| node_dbconnect
node_meapi -->|"connects"| node_dbconnect
node_bookmodel -->|"references author"| node_usermodel

click node_home "https://github.com/pustamrai/ebooks/blob/main/src/app/(home)/page.tsx"
click node_booklist "https://github.com/pustamrai/ebooks/blob/main/src/components/home/BookList.tsx"
click node_bookcard "https://github.com/pustamrai/ebooks/blob/main/src/components/home/BookCard.tsx"
click node_detail "https://github.com/pustamrai/ebooks/blob/main/src/app/books/%5Bslug%5D/page.tsx"
click node_download "https://github.com/pustamrai/ebooks/blob/main/src/app/books/%5Bslug%5D/components/DownloadButton.tsx"
click node_addpage "https://github.com/pustamrai/ebooks/blob/main/src/app/add-book/page.tsx"
click node_layout "https://github.com/pustamrai/ebooks/blob/main/src/app/layout.tsx"
click node_navbar "https://github.com/pustamrai/ebooks/blob/main/src/components/layouts/Navbar.tsx"
click node_authcontext "https://github.com/pustamrai/ebooks/blob/main/src/app/context/AuthContext.tsx"
click node_loginpage "https://github.com/pustamrai/ebooks/blob/main/src/app/login/page.tsx"
click node_loginform "https://github.com/pustamrai/ebooks/blob/main/src/components/login/LoginForm.tsx"
click node_signuppage "https://github.com/pustamrai/ebooks/blob/main/src/app/signup/page.tsx"
click node_signupform "https://github.com/pustamrai/ebooks/blob/main/src/components/signup/SignupForm.tsx"
click node_logout "https://github.com/pustamrai/ebooks/blob/main/src/components/LogoutButton.tsx"
click node_meapi "https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/me/route.ts"
click node_loginapi "https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/login/route.ts"
click node_signupapi "https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/signup/route.ts"
click node_verify "https://github.com/pustamrai/ebooks/blob/main/src/lib/auth/verifyToken.ts"
click node_addapi "https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/add-book/route.ts"
click node_listapi "https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/list-books/route.ts"
click node_singleapi "https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/single-book/%5Bslug%5D/route.ts"
click node_cloudinary "https://github.com/pustamrai/ebooks/blob/main/src/lib/cloudinary.ts"
click node_dbconnect "https://github.com/pustamrai/ebooks/blob/main/src/lib/db.ts"
click node_bookmodel "https://github.com/pustamrai/ebooks/blob/main/src/models/book.models.ts"
click node_usermodel "https://github.com/pustamrai/ebooks/blob/main/src/models/user.models.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_home,node_booklist,node_bookcard,node_detail,node_download,node_addpage,node_layout,node_navbar toneBlue
class node_authcontext,node_loginpage,node_loginform,node_signuppage,node_signupform,node_logout,node_meapi,node_loginapi,node_signupapi toneAmber
class node_addapi,node_listapi,node_singleapi toneMint
class node_verify,node_cloudinary,node_dbconnect toneRose
class node_bookmodel,node_usermodel,node_visitor toneIndigo
```

## Components

### Web experience

- [Catalog page](https://github.com/pustamrai/ebooks/blob/main/src/app/(home)/page.tsx): `src/app/(home)/page.tsx`
- [Book list](https://github.com/pustamrai/ebooks/blob/main/src/components/home/BookList.tsx): `src/components/home/BookList.tsx`
- [Book card](https://github.com/pustamrai/ebooks/blob/main/src/components/home/BookCard.tsx): `src/components/home/BookCard.tsx`
- [Book detail](https://github.com/pustamrai/ebooks/blob/main/src/app/books/%5Bslug%5D/page.tsx): `src/app/books/[slug]/page.tsx`
- [Download button](https://github.com/pustamrai/ebooks/blob/main/src/app/books/%5Bslug%5D/components/DownloadButton.tsx): `src/app/books/[slug]/components/DownloadButton.tsx`
- [Submit book page](https://github.com/pustamrai/ebooks/blob/main/src/app/add-book/page.tsx): `src/app/add-book/page.tsx`
- [App layout](https://github.com/pustamrai/ebooks/blob/main/src/app/layout.tsx): `src/app/layout.tsx`
- [Navigation](https://github.com/pustamrai/ebooks/blob/main/src/components/layouts/Navbar.tsx): `src/components/layouts/Navbar.tsx`

### Accounts

- [Auth context](https://github.com/pustamrai/ebooks/blob/main/src/app/context/AuthContext.tsx): `src/app/context/AuthContext.tsx`
- [Login page](https://github.com/pustamrai/ebooks/blob/main/src/app/login/page.tsx): `src/app/login/page.tsx`
- [Login form](https://github.com/pustamrai/ebooks/blob/main/src/components/login/LoginForm.tsx): `src/components/login/LoginForm.tsx`
- [Signup page](https://github.com/pustamrai/ebooks/blob/main/src/app/signup/page.tsx): `src/app/signup/page.tsx`
- [Signup form](https://github.com/pustamrai/ebooks/blob/main/src/components/signup/SignupForm.tsx): `src/components/signup/SignupForm.tsx`
- [Logout control](https://github.com/pustamrai/ebooks/blob/main/src/components/LogoutButton.tsx): `src/components/LogoutButton.tsx`
- [Current-user API](https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/me/route.ts): `src/app/api/users/me/route.ts`
- [Login API](https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/login/route.ts): `src/app/api/users/login/route.ts`
- [Signup API](https://github.com/pustamrai/ebooks/blob/main/src/app/api/users/signup/route.ts): `src/app/api/users/signup/route.ts`

### Book catalog

- [Book submission API](https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/add-book/route.ts): `src/app/api/books/add-book/route.ts`
- [Book listing API](https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/list-books/route.ts): `src/app/api/books/list-books/route.ts`
- [Single-book API](https://github.com/pustamrai/ebooks/blob/main/src/app/api/books/single-book/%5Bslug%5D/route.ts): `src/app/api/books/single-book/[slug]/route.ts`

### Application services

- [Token verification](https://github.com/pustamrai/ebooks/blob/main/src/lib/auth/verifyToken.ts): `src/lib/auth/verifyToken.ts`
- [File hosting](https://github.com/pustamrai/ebooks/blob/main/src/lib/cloudinary.ts): `src/lib/cloudinary.ts`
- [Database connection](https://github.com/pustamrai/ebooks/blob/main/src/lib/db.ts): `src/lib/db.ts`

### Persistence

- [Book model](https://github.com/pustamrai/ebooks/blob/main/src/models/book.models.ts): `src/models/book.models.ts`
- [User model](https://github.com/pustamrai/ebooks/blob/main/src/models/user.models.ts): `src/models/user.models.ts`

### Other components

- **Reader**

## Connections

- Reader → Catalog page: browses (evidence: `src/app/(home)/page.tsx`)
- Catalog page → Book list: renders (evidence: `src/app/(home)/page.tsx`)
- Book list → Book card: renders (evidence: `src/components/home/BookList.tsx`)
- Reader → Book detail: opens (evidence: `src/app/books/[slug]/page.tsx`)
- Book detail → Download button: renders (evidence: `src/app/books/[slug]/page.tsx`)
- Reader → Submit book page: submits (evidence: `src/app/add-book/page.tsx`)
- App layout → Navigation: renders (evidence: `src/app/layout.tsx`)
- App layout → Auth context: provides (evidence: `src/app/layout.tsx`)
- Navigation → Auth context: reads (evidence: `src/components/layouts/Navbar.tsx`)
- Navigation → Logout control: renders (evidence: `src/components/layouts/Navbar.tsx`)
- Navigation → Submit book page: routes to (evidence: `src/components/layouts/Navbar.tsx`)
- Reader → Login page: signs in (evidence: `src/app/login/page.tsx`)
- Login page → Login form: renders (evidence: `src/app/login/page.tsx`)
- Reader → Signup page: registers (evidence: `src/app/signup/page.tsx`)
- Signup page → Signup form: renders (evidence: `src/app/signup/page.tsx`)
- Auth context → Current-user API: fetches user (evidence: `src/app/context/AuthContext.tsx`)
- Current-user API → Token verification: verifies token (evidence: `src/app/api/users/me/route.ts`)
- Current-user API → User model: loads user (evidence: `src/app/api/users/me/route.ts`)
- Login API → User model: checks credentials (evidence: `src/app/api/users/login/route.ts`)
- Signup API → User model: creates user (evidence: `src/app/api/users/signup/route.ts`)
- Book submission API → Token verification: verifies token (evidence: `src/app/api/books/add-book/route.ts`)
- Book submission API → File hosting: uploads files (evidence: `src/app/api/books/add-book/route.ts`)
- Book submission API → Book model: creates book (evidence: `src/app/api/books/add-book/route.ts`)
- Book listing API → Book model: queries books (evidence: `src/app/api/books/list-books/route.ts`)
- Single-book API → Book model: loads book (evidence: `src/app/api/books/single-book/[slug]/route.ts`)
- Book submission API → Database connection: connects (evidence: `src/app/api/books/add-book/route.ts`)
- Login API → Database connection: connects (evidence: `src/app/api/users/login/route.ts`)
- Signup API → Database connection: connects (evidence: `src/app/api/users/signup/route.ts`)
- Book listing API → Database connection: connects (evidence: `src/app/api/books/list-books/route.ts`)
- Current-user API → Database connection: connects (evidence: `src/app/api/users/me/route.ts`)
- Book model → User model: references author (evidence: `src/models/book.models.ts`)
