# prathameshlonare/duokart architecture

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

- Interactive diagram: https://gitdiagram.com/prathameshlonare/duokart
- Repository: https://github.com/prathameshlonare/duokart

## Overview

DuoKart is a small-shop order and bill API deployed on AWS. A customer reaches the Flask API through the load balancer; the API serves product and health reads from MySQL, accepts validated orders into SQS with DynamoDB idempotency/status records, and generates presigned S3 upload URLs so file bytes bypass the app. A queue-triggered Lambda advances order status and sends separate owner and buyer notifications. The README documents the infrastructure and observability capabilities; worker internals are represented by the queue template because no worker source is present in the tree.

Main entry points: [`app/app.py`](https://github.com/prathameshlonare/duokart/blob/main/app/app.py) (Flask API), [`infra/05-queue.yaml`](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml) (Order Lambda), [`infra/02-compute.yaml`](https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml) (Private app instances), [`infra/03-data.yaml`](https://github.com/prathameshlonare/duokart/blob/main/infra/03-data.yaml) (RDS MySQL)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_edge["Network and access"]
  node_vpc["VPC and subnets<br/>[01-vpc.yaml]"]
  node_alb["Application load balancer<br/>[02-compute.yaml]"]
  node_asg["Private app instances<br/>[02-compute.yaml]"]
  node_bastion["Bastion and SSM<br/>[02-compute.yaml]"]
end

subgraph group_api["Shop API"]
  node_app["Flask API<br/>[app.py]"]
  node_rds[("RDS MySQL<br/>[03-data.yaml]")]
  node_schema["Commerce schema<br/>[schema.sql]"]
end

subgraph group_orders["Order processing"]
  node_sqs["Order queue<br/>[05-queue.yaml]"]
  node_dlq["Dead-letter queue<br/>[05-queue.yaml]"]
  node_worker["Order Lambda<br/>[05-queue.yaml]"]
  node_ddb[("Order status table<br/>[05-queue.yaml]")]
  node_snsowner["Owner notifications<br/>[05-queue.yaml]"]
  node_snsbuyer["Buyer notifications<br/>[05-queue.yaml]"]
end

subgraph group_files["Bill and photo storage"]
  node_s3[("Photos and bills<br/>[04-storage.yaml]")]
  node_trailbucket[("Trail archive<br/>[04-storage.yaml]")]
end

subgraph group_ops["Operations and visibility"]
  node_cloudwatch["Alarms and dashboard<br/>[06-observe.yaml]"]
  node_cloudtrail["CloudTrail<br/>[06-observe.yaml]"]
  node_budget["Cost budget<br/>[06-observe.yaml]"]
end

node_customer(("Shop user"))
node_mail(("Email recipients"))

node_customer -->|"HTTP requests"| node_alb
node_alb -->|"forwards traffic"| node_asg
node_asg -->|"runs API"| node_app
node_app -->|"queries products"| node_rds
node_app -->|"checks health"| node_rds
node_schema -.->|"defines and seeds"| node_rds
node_app -->|"sends order"| node_sqs
node_app -->|"checks and writes order"| node_ddb
node_sqs -->|"triggers"| node_worker
node_worker -->|"updates status"| node_ddb
node_worker -->|"sends received notice"| node_snsowner
node_worker -->|"sends packing notice"| node_snsbuyer
node_snsowner -->|"notifies owner"| node_mail
node_snsbuyer -->|"notifies buyer"| node_mail
node_sqs -->|"redrives failures"| node_dlq
node_app -->|"creates presigned URL"| node_s3
node_customer -->|"uploads directly"| node_s3
node_asg -.->|"emits monitored signals"| node_cloudwatch
node_cloudtrail -->|"stores trail"| node_trailbucket
node_bastion -.->|"admin access"| node_asg
node_budget -.->|"tracks spend"| node_cloudwatch

click node_vpc "https://github.com/prathameshlonare/duokart/blob/main/infra/01-vpc.yaml"
click node_alb "https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml"
click node_app "https://github.com/prathameshlonare/duokart/blob/main/app/app.py"
click node_asg "https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml"
click node_bastion "https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml"
click node_rds "https://github.com/prathameshlonare/duokart/blob/main/infra/03-data.yaml"
click node_schema "https://github.com/prathameshlonare/duokart/blob/main/infra/schema.sql"
click node_sqs "https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml"
click node_dlq "https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml"
click node_worker "https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml"
click node_ddb "https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml"
click node_snsowner "https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml"
click node_snsbuyer "https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml"
click node_s3 "https://github.com/prathameshlonare/duokart/blob/main/infra/04-storage.yaml"
click node_cloudwatch "https://github.com/prathameshlonare/duokart/blob/main/infra/06-observe.yaml"
click node_cloudtrail "https://github.com/prathameshlonare/duokart/blob/main/infra/06-observe.yaml"
click node_trailbucket "https://github.com/prathameshlonare/duokart/blob/main/infra/04-storage.yaml"
click node_budget "https://github.com/prathameshlonare/duokart/blob/main/infra/06-observe.yaml"

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_vpc,node_alb,node_asg,node_bastion,node_customer toneBlue
class node_app,node_rds,node_schema toneAmber
class node_sqs,node_dlq,node_worker,node_ddb,node_snsowner,node_snsbuyer toneMint
class node_s3,node_trailbucket toneRose
class node_cloudwatch,node_cloudtrail,node_budget,node_mail toneIndigo
```

## Components

### Network and access

- [VPC and subnets](https://github.com/prathameshlonare/duokart/blob/main/infra/01-vpc.yaml): `infra/01-vpc.yaml`
- [Application load balancer](https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml): `infra/02-compute.yaml`
- [Private app instances](https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml): `infra/02-compute.yaml`
- [Bastion and SSM](https://github.com/prathameshlonare/duokart/blob/main/infra/02-compute.yaml): `infra/02-compute.yaml`

### Shop API

- [Flask API](https://github.com/prathameshlonare/duokart/blob/main/app/app.py): `app/app.py`
- [RDS MySQL](https://github.com/prathameshlonare/duokart/blob/main/infra/03-data.yaml): `infra/03-data.yaml`
- [Commerce schema](https://github.com/prathameshlonare/duokart/blob/main/infra/schema.sql): `infra/schema.sql`

### Order processing

- [Order queue](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml): `infra/05-queue.yaml`
- [Dead-letter queue](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml): `infra/05-queue.yaml`
- [Order Lambda](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml): `infra/05-queue.yaml`
- [Order status table](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml): `infra/05-queue.yaml`
- [Owner notifications](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml): `infra/05-queue.yaml`
- [Buyer notifications](https://github.com/prathameshlonare/duokart/blob/main/infra/05-queue.yaml): `infra/05-queue.yaml`

### Bill and photo storage

- [Photos and bills](https://github.com/prathameshlonare/duokart/blob/main/infra/04-storage.yaml): `infra/04-storage.yaml`
- [Trail archive](https://github.com/prathameshlonare/duokart/blob/main/infra/04-storage.yaml): `infra/04-storage.yaml`

### Operations and visibility

- [Alarms and dashboard](https://github.com/prathameshlonare/duokart/blob/main/infra/06-observe.yaml): `infra/06-observe.yaml`
- [CloudTrail](https://github.com/prathameshlonare/duokart/blob/main/infra/06-observe.yaml): `infra/06-observe.yaml`
- [Cost budget](https://github.com/prathameshlonare/duokart/blob/main/infra/06-observe.yaml): `infra/06-observe.yaml`

### Other components

- **Shop user**
- **Email recipients**

## Connections

- Shop user → Application load balancer: HTTP requests
- Application load balancer → Private app instances: forwards traffic
- Private app instances → Flask API: runs API
- Flask API → RDS MySQL: queries products
- Flask API → RDS MySQL: checks health
- Commerce schema → RDS MySQL: defines and seeds
- Flask API → Order queue: sends order
- Flask API → Order status table: checks and writes order
- Order queue → Order Lambda: triggers
- Order Lambda → Order status table: updates status
- Order Lambda → Owner notifications: sends received notice
- Order Lambda → Buyer notifications: sends packing notice
- Owner notifications → Email recipients: notifies owner
- Buyer notifications → Email recipients: notifies buyer
- Order queue → Dead-letter queue: redrives failures
- Flask API → Photos and bills: creates presigned URL
- Shop user → Photos and bills: uploads directly
- Private app instances → Alarms and dashboard: emits monitored signals
- CloudTrail → Trail archive: stores trail
- Bastion and SSM → Private app instances: admin access
- Cost budget → Alarms and dashboard: tracks spend
