# nerain-prakas/flyrank_internship architecture

> Architecture diagram of the GitHub repository nerain-prakas/flyrank_internship, 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/nerain-prakas/flyrank_internship
- Repository: https://github.com/nerain-prakas/flyrank_internship

## Overview

This repository is a collection of backend internship exercises rather than one deployed application: task APIs progress from in-memory CRUD to database-backed CRUD, alongside a Supabase-auth API and a polite book scraper. The main API workflow is HTTP request → route dispatch → controller validation/business logic → task store → JSON response. Sampled source confirms these links; database internals and some route wiring are represented only where the tree and available excerpts support them.

Main entry points: [`W5 · A9 — The polite scraper/src/index.js`](https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/src/index.js) (Scraper runner), [`W2-A4 Auth and Login Protect/routes/auth.js`](https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/routes/auth.js) (Auth routes), [`Week 2 Backend Api/app.js`](https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/app.js) (Task API app), [`Week 2 Backend Api/routes/tasks.js`](https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/routes/tasks.js) (Task routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_memory["In-Memory CRUD"]
  node_mem_app["Task API app<br/>[app.js]"]
  node_mem_routes["Task routes<br/>[tasks.js]"]
  node_mem_controller["Task controller<br/>[taskController.js]"]
end

subgraph group_sqlite["Database CRUD"]
  node_db_app["Database API app<br/>[app.js]"]
  node_db_routes["Task routes<br/>[tasks.js]"]
  node_db_controller["Task controller<br/>[taskController.js]"]
  node_db_store["Task store<br/>[db.js]"]
  node_sqlite_file[("SQLite database<br/>[tasks.db]")]
  node_pg_app["Postgres API app<br/>[app.js]"]
  node_pg_routes["Task routes<br/>[tasks.js]"]
  node_pg_controller["Task controller<br/>[taskController.js]"]
  node_pg_store["Task store<br/>[db.js]"]
  node_pg_db[("Postgres database")]
end

subgraph group_auth["Authentication API"]
  node_auth_app["Auth API app<br/>[app.js]"]
  node_auth_routes["Auth routes<br/>[auth.js]"]
  node_auth_middleware["Token middleware<br/>[auth.js]"]
  node_auth_controller["Auth controller<br/>[authController.js]"]
end

subgraph group_scraper["Book Scraper"]
  node_scraper_entry["Scraper runner<br/>[index.js]"]
  node_scraper_parser["Catalogue parser<br/>[parser.js]"]
  node_scraper_cache[("HTML cache")]
  node_books_output["Book records<br/>[books.json]"]
  node_errors_output["Scrape errors<br/>[errors.json]"]
  node_report_output["Run report<br/>[run-report.json]"]
end

node_client(("API client"))
node_supabase{{"Supabase Auth"}}
node_book_site{{"Book catalogue"}}

node_client -->|"sends requests"| node_mem_app
node_mem_app -->|"mounts routes"| node_mem_routes
node_mem_routes -->|"dispatches"| node_mem_controller
node_client -->|"sends requests"| node_db_app
node_db_app -->|"mounts routes"| node_db_routes
node_db_routes -->|"dispatches"| node_db_controller
node_db_controller -->|"calls"| node_db_store
node_db_store -->|"reads/writes"| node_sqlite_file
node_client -->|"sends requests"| node_pg_app
node_pg_app -->|"mounts routes"| node_pg_routes
node_pg_routes -->|"dispatches"| node_pg_controller
node_pg_controller -->|"calls"| node_pg_store
node_pg_store -->|"queries"| node_pg_db
node_client -->|"sends requests"| node_auth_app
node_auth_app -->|"mounts routes"| node_auth_routes
node_auth_routes -->|"dispatches"| node_auth_controller
node_auth_routes -->|"protects routes"| node_auth_middleware
node_auth_controller -->|"authenticates"| node_supabase
node_auth_middleware -->|"validates token"| node_supabase
node_scraper_entry -->|"fetches pages"| node_book_site
node_scraper_entry -->|"reads/writes cache"| node_scraper_cache
node_scraper_entry -->|"parses HTML"| node_scraper_parser
node_scraper_entry -->|"writes records"| node_books_output
node_scraper_entry -->|"writes errors"| node_errors_output
node_scraper_entry -->|"writes report"| node_report_output

click node_mem_app "https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/app.js"
click node_mem_routes "https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/routes/tasks.js"
click node_mem_controller "https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/controllers/taskController.js"
click node_db_app "https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/app.js"
click node_db_routes "https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/routes/tasks.js"
click node_db_controller "https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/controllers/taskController.js"
click node_db_store "https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/db.js"
click node_sqlite_file "https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/tasks.db"
click node_pg_app "https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/app.js"
click node_pg_routes "https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/routes/tasks.js"
click node_pg_controller "https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/controllers/taskController.js"
click node_pg_store "https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/db.js"
click node_auth_app "https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/app.js"
click node_auth_routes "https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/routes/auth.js"
click node_auth_middleware "https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/middleware/auth.js"
click node_auth_controller "https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/controllers/authController.js"
click node_scraper_entry "https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/src/index.js"
click node_scraper_parser "https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/src/parser.js"
click node_books_output "https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/output/books.json"
click node_errors_output "https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/output/errors.json"
click node_report_output "https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/output/run-report.json"

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_mem_app,node_mem_routes,node_mem_controller,node_client toneBlue
class node_db_app,node_db_routes,node_db_controller,node_db_store,node_sqlite_file,node_pg_app,node_pg_routes,node_pg_controller,node_pg_store,node_pg_db toneAmber
class node_auth_app,node_auth_routes,node_auth_middleware,node_auth_controller toneMint
class node_scraper_entry,node_scraper_parser,node_scraper_cache,node_books_output,node_errors_output,node_report_output toneRose
class node_supabase,node_book_site toneIndigo
```

## Components

### In-Memory CRUD

- [Task API app](https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/app.js): `Week 2 Backend Api/app.js`
- [Task routes](https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/routes/tasks.js): `Week 2 Backend Api/routes/tasks.js`
- [Task controller](https://github.com/nerain-prakas/flyrank_internship/blob/main/Week%202%20Backend%20Api/controllers/taskController.js): `Week 2 Backend Api/controllers/taskController.js`

### Database CRUD

- [Database API app](https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/app.js): `Connecting your CRUD to the database/app.js`
- [Task routes](https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/routes/tasks.js): `Connecting your CRUD to the database/routes/tasks.js`
- [Task controller](https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/controllers/taskController.js): `Connecting your CRUD to the database/controllers/taskController.js`
- [Task store](https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/db.js): `Connecting your CRUD to the database/db.js`
- [SQLite database](https://github.com/nerain-prakas/flyrank_internship/blob/main/Connecting%20your%20CRUD%20to%20the%20database/tasks.db): `Connecting your CRUD to the database/tasks.db`
- [Postgres API app](https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/app.js): `W3-Postgres integration/app.js`
- [Task routes](https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/routes/tasks.js): `W3-Postgres integration/routes/tasks.js`
- [Task controller](https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/controllers/taskController.js): `W3-Postgres integration/controllers/taskController.js`
- [Task store](https://github.com/nerain-prakas/flyrank_internship/blob/main/W3-Postgres%20integration/db.js): `W3-Postgres integration/db.js`
- **Postgres database**

### Authentication API

- [Auth API app](https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/app.js): `W2-A4 Auth and Login Protect/app.js`
- [Auth routes](https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/routes/auth.js): `W2-A4 Auth and Login Protect/routes/auth.js`
- [Token middleware](https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/middleware/auth.js): `W2-A4 Auth and Login Protect/middleware/auth.js`
- [Auth controller](https://github.com/nerain-prakas/flyrank_internship/blob/main/W2-A4%20Auth%20and%20Login%20Protect/controllers/authController.js): `W2-A4 Auth and Login Protect/controllers/authController.js`

### Book Scraper

- [Scraper runner](https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/src/index.js): `W5 · A9 — The polite scraper/src/index.js`
- [Catalogue parser](https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/src/parser.js): `W5 · A9 — The polite scraper/src/parser.js`
- **HTML cache**
- [Book records](https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/output/books.json): `W5 · A9 — The polite scraper/output/books.json`
- [Scrape errors](https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/output/errors.json): `W5 · A9 — The polite scraper/output/errors.json`
- [Run report](https://github.com/nerain-prakas/flyrank_internship/blob/main/W5%20%C2%B7%20A9%20%E2%80%94%20The%20polite%20scraper/output/run-report.json): `W5 · A9 — The polite scraper/output/run-report.json`

### Other components

- **API client**
- **Supabase Auth**
- **Book catalogue**

## Connections

- API client → Task API app: sends requests
- Task API app → Task routes: mounts routes
- Task routes → Task controller: dispatches
- API client → Database API app: sends requests
- Database API app → Task routes: mounts routes
- Task routes → Task controller: dispatches
- Task controller → Task store: calls
- Task store → SQLite database: reads/writes
- API client → Postgres API app: sends requests
- Postgres API app → Task routes: mounts routes
- Task routes → Task controller: dispatches
- Task controller → Task store: calls
- Task store → Postgres database: queries
- API client → Auth API app: sends requests
- Auth API app → Auth routes: mounts routes
- Auth routes → Auth controller: dispatches
- Auth routes → Token middleware: protects routes
- Auth controller → Supabase Auth: authenticates
- Token middleware → Supabase Auth: validates token
- Scraper runner → Book catalogue: fetches pages
- Scraper runner → HTML cache: reads/writes cache
- Scraper runner → Catalogue parser: parses HTML
- Scraper runner → Book records: writes records
- Scraper runner → Scrape errors: writes errors
- Scraper runner → Run report: writes report
