# thk2004/glassesshopexpressapp architecture

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

- Interactive diagram: https://gitdiagram.com/thk2004/glassesshopexpressapp
- Repository: https://github.com/thk2004/glassesshopexpressapp

## Overview

This is an Express storefront for browsing eyewear, managing accounts, and submitting reviews and orders. The main workflow runs from a visitor’s request through mounted routes and controllers; catalog requests use product services to filter or retrieve data before rendering product pages. Account routes support registration, login, profiles, and Google sign-in, while catalog endpoints handle reviews, orders, and stock updates. The app connects to MongoDB for persistence and calls ZaloPay for payment initiation. Relationships are limited to calls and wiring shown in excerpts or the source index; unsampled behavior is not inferred.

Main entry points: [`app.js`](https://github.com/thk2004/glassesshopexpressapp/blob/main/app.js) (Express app), [`component/user/userController.js`](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userController.js) (Account handlers), [`component/product/productController.js`](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productController.js) (Catalog handlers), [`component/product/productService.js`](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productService.js) (Catalog services)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_app["Express app<br/>[app.js]"]
  node_home_routes["Home routes<br/>[homeRoute.js]"]
  node_home_controller["Home pages<br/>[homeController.js]"]
  node_home_views["Home views<br/>[index.hbs]"]
end

subgraph group_catalog["Catalog and orders"]
  node_product_routes["Catalog routes<br/>[productRoute.js]"]
  node_product_controller["Catalog handlers"]
  node_product_service["Catalog services<br/>[productService.js]"]
  node_glasses_view["Eyewear listing<br/>[glasses.hbs]"]
  node_product_view["Product detail<br/>[product.hbs]"]
end

subgraph group_accounts["Accounts and identity"]
  node_user_routes["Account routes<br/>[userRoute.js]"]
  node_user_controller["Account handlers<br/>[userController.js]"]
  node_user_service["Account services<br/>[userService.js]"]
  node_auth_middleware["Authentication guard<br/>[auth.js]"]
  node_passport["Passport strategies<br/>[index.js]"]
  node_account_views["Account pages<br/>[register.hbs]"]
end

subgraph group_data["Persistence and payments"]
  node_review_model[("Review records<br/>[reviewModel.js]")]
  node_order_model[("Order records<br/>[orderModel.js]")]
  node_product_model[("Product records<br/>[productModel.js]")]
  node_user_model[("User records<br/>[userModel.js]")]
  node_mongo[("MongoDB")]
  node_zalopay["ZaloPay API"]
end

node_visitor(("Visitor"))

node_visitor -->|"sends request"| node_app
node_app -->|"mounts at root"| node_home_routes
node_app -->|"mounts at /glasses"| node_product_routes
node_app -->|"mounts at /user"| node_user_routes
node_app -->|"configures"| node_passport
node_app -->|"connects to"| node_mongo
node_home_routes -->|"dispatches to"| node_home_controller
node_home_controller -->|"renders"| node_home_views
node_product_routes -->|"dispatches to"| node_product_controller
node_product_controller -->|"calls"| node_product_service
node_product_controller -->|"renders"| node_glasses_view
node_product_controller -->|"renders"| node_product_view
node_product_service -->|"queries and updates"| node_product_model
node_product_service -->|"reads and writes"| node_review_model
node_product_service -->|"saves orders"| node_order_model
node_user_routes -->|"dispatches to"| node_user_controller
node_user_routes -->|"protects routes"| node_auth_middleware
node_user_controller -->|"calls"| node_user_service
node_user_controller -->|"queries profile"| node_user_model
node_user_controller -->|"authenticates with"| node_passport
node_user_controller -->|"renders"| node_account_views
node_user_controller -->|"initiates payment"| node_zalopay
node_user_service -->|"reads and writes"| node_user_model
node_passport -->|"looks up users"| node_user_model
node_passport -->|"creates Google users"| node_user_service

click node_app "https://github.com/thk2004/glassesshopexpressapp/blob/main/app.js"
click node_home_routes "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/home/homeRoute.js"
click node_home_controller "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/home/homeController.js"
click node_home_views "https://github.com/thk2004/glassesshopexpressapp/blob/main/views/index.hbs"
click node_product_routes "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productRoute.js"
click node_product_controller "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productController.js"
click node_product_service "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productService.js"
click node_glasses_view "https://github.com/thk2004/glassesshopexpressapp/blob/main/views/glasses/glasses.hbs"
click node_product_view "https://github.com/thk2004/glassesshopexpressapp/blob/main/views/products/product.hbs"
click node_review_model "https://github.com/thk2004/glassesshopexpressapp/blob/main/models/reviewModel.js"
click node_order_model "https://github.com/thk2004/glassesshopexpressapp/blob/main/models/orderModel.js"
click node_product_model "https://github.com/thk2004/glassesshopexpressapp/blob/main/models/productModel.js"
click node_user_routes "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userRoute.js"
click node_user_controller "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userController.js"
click node_user_service "https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userService.js"
click node_auth_middleware "https://github.com/thk2004/glassesshopexpressapp/blob/main/middleware/auth.js"
click node_passport "https://github.com/thk2004/glassesshopexpressapp/blob/main/config/passport/index.js"
click node_user_model "https://github.com/thk2004/glassesshopexpressapp/blob/main/models/userModel.js"
click node_account_views "https://github.com/thk2004/glassesshopexpressapp/blob/main/views/register/register.hbs"

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_app,node_home_routes,node_home_controller,node_home_views toneBlue
class node_product_routes,node_product_controller,node_product_service,node_glasses_view,node_product_view toneAmber
class node_user_routes,node_user_controller,node_user_service,node_auth_middleware,node_passport,node_account_views toneMint
class node_review_model,node_order_model,node_product_model,node_user_model,node_mongo,node_zalopay toneRose
class node_visitor toneIndigo
```

## Components

### Web application

- [Express app](https://github.com/thk2004/glassesshopexpressapp/blob/main/app.js): `app.js`
- [Home routes](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/home/homeRoute.js): `component/home/homeRoute.js`
- [Home pages](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/home/homeController.js): `component/home/homeController.js`
- [Home views](https://github.com/thk2004/glassesshopexpressapp/blob/main/views/index.hbs): `views/index.hbs`

### Catalog and orders

- [Catalog routes](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productRoute.js): `component/product/productRoute.js`
- [Catalog handlers](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productController.js): `component/product/productController.js`
- [Catalog services](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/product/productService.js): `component/product/productService.js`
- [Eyewear listing](https://github.com/thk2004/glassesshopexpressapp/blob/main/views/glasses/glasses.hbs): `views/glasses/glasses.hbs`
- [Product detail](https://github.com/thk2004/glassesshopexpressapp/blob/main/views/products/product.hbs): `views/products/product.hbs`

### Accounts and identity

- [Account routes](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userRoute.js): `component/user/userRoute.js`
- [Account handlers](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userController.js): `component/user/userController.js`
- [Account services](https://github.com/thk2004/glassesshopexpressapp/blob/main/component/user/userService.js): `component/user/userService.js`
- [Authentication guard](https://github.com/thk2004/glassesshopexpressapp/blob/main/middleware/auth.js): `middleware/auth.js`
- [Passport strategies](https://github.com/thk2004/glassesshopexpressapp/blob/main/config/passport/index.js): `config/passport/index.js`
- [Account pages](https://github.com/thk2004/glassesshopexpressapp/blob/main/views/register/register.hbs): `views/register/register.hbs`

### Persistence and payments

- [Review records](https://github.com/thk2004/glassesshopexpressapp/blob/main/models/reviewModel.js): `models/reviewModel.js`
- [Order records](https://github.com/thk2004/glassesshopexpressapp/blob/main/models/orderModel.js): `models/orderModel.js`
- [Product records](https://github.com/thk2004/glassesshopexpressapp/blob/main/models/productModel.js): `models/productModel.js`
- [User records](https://github.com/thk2004/glassesshopexpressapp/blob/main/models/userModel.js): `models/userModel.js`
- **MongoDB**
- **ZaloPay API**

### Other components

- **Visitor**

## Connections

- Visitor → Express app: sends request
- Express app → Home routes: mounts at root (evidence: `app.js`)
- Express app → Catalog routes: mounts at /glasses (evidence: `app.js`)
- Express app → Account routes: mounts at /user (evidence: `app.js`)
- Express app → Passport strategies: configures (evidence: `app.js`)
- Express app → MongoDB: connects to (evidence: `app.js`)
- Home routes → Home pages: dispatches to (evidence: `component/home/homeRoute.js`)
- Home pages → Home views: renders (evidence: `component/home/homeController.js`)
- Catalog routes → Catalog handlers: dispatches to (evidence: `component/product/productRoute.js`)
- Catalog handlers → Catalog services: calls (evidence: `component/product/productController.js`)
- Catalog handlers → Eyewear listing: renders (evidence: `component/product/productController.js`)
- Catalog handlers → Product detail: renders (evidence: `component/product/productController.js`)
- Catalog services → Product records: queries and updates (evidence: `component/product/productService.js`)
- Catalog services → Review records: reads and writes (evidence: `component/product/productService.js`)
- Catalog services → Order records: saves orders (evidence: `component/product/productService.js`)
- Account routes → Account handlers: dispatches to (evidence: `component/user/userRoute.js`)
- Account routes → Authentication guard: protects routes (evidence: `component/user/userRoute.js`)
- Account handlers → Account services: calls (evidence: `component/user/userController.js`)
- Account handlers → User records: queries profile (evidence: `component/user/userController.js`)
- Account handlers → Passport strategies: authenticates with (evidence: `component/user/userController.js`)
- Account handlers → Account pages: renders (evidence: `component/user/userController.js`)
- Account handlers → ZaloPay API: initiates payment (evidence: `component/user/userController.js`)
- Account services → User records: reads and writes (evidence: `component/user/userService.js`)
- Passport strategies → User records: looks up users (evidence: `config/passport/index.js`)
- Passport strategies → Account services: creates Google users (evidence: `config/passport/index.js`)
