Skip to content
amirulhasanpulokPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

🚀 Commerce Operating System (COS)

Enterprise-Grade Microservice E-Commerce Platform

Version: 1.0.0
Status: ✅ Production Ready
Repository: https://github.com/amirulhasanpulok/rcl
Built for: Enterprise & SaaS Commerce Platforms


🎯 What is COS?

Commerce Operating System is a complete, production-ready microservice platform that powers enterprise-scale e-commerce operations. It's designed to be:

  • Multi-Tenant: Support thousands of independent merchants
  • Enterprise-Grade: Used by national marketplaces, SaaS platforms, large retailers
  • Scalable: Kubernetes-native with auto-scaling up to 8 replicas per service
  • Event-Driven: Real-time inventory sync, payment processing, order fulfillment
  • Global Ready: Multi-currency, multi-language, multi-region support
  • Marketplace-Ready: Vendor management, commission tracking, rating systems
  • Mobile-Ready: Next.js frontends, mobile app APIs

Perfect For:

  • 🏪 National/Regional Marketplaces (Daraz/Shopee/Amazon)
  • 🛒 SaaS E-Commerce Platforms (Shopify Alternative)
  • 🏢 Enterprise B2B/B2C Operations
  • 🌐 White-Label Commerce Solutions
  • 🚀 Startup → Scale to 100k+ Orders/Day

📋 System Overview

RCL includes:

  • 10 Microservices (75+ API endpoints)
  • 2 Next.js Frontends (Admin + Storefront)
  • 6 Databases (PostgreSQL + MongoDB)
  • Event Bus (RabbitMQ)
  • Caching Layer (Redis)
  • Docker containers for all services
  • Kubernetes manifests (base/staging/prod)

All built with TypeScript, following enterprise best practices.


🏗️ Complete System Architecture

How Everything Works Together

┌─────────────────────────────────────────────────────────────────┐
│                     CLIENT LAYER                                 │
├─────────────────────────────────────────────────────────────────┤
│  🖥️  Admin Dashboard (3007)   │   📱 Web Storefront (3008)      │
│     Next.js 14                │      Next.js 14                  │
│     Merchant Portal           │      Customer Store              │
└──────────────┬────────────────────────────┬──────────────────────┘
               │                            │
               └────────────────┬───────────┘
                                │
┌───────────────────────────────▼────────────────────────────────┐
│           🚪 API GATEWAY (Port 3000)                           │
│     • Single entry point for all clients                       │
│     • Request routing & validation                             │
│     • Rate limiting & authentication                           │
│     • Load balancing across services                           │
└───┬──────┬──────┬──────┬──────┬──────┬──────┬────────────────┘
    │      │      │      │      │      │      │
    ▼      ▼      ▼      ▼      ▼      ▼      ▼
┌──────┬──────┬────────┬─────────┬──────────┬────────┬──────────┐
│Auth  │Prod  │Order   │Payment  │Inventory │Notif   │Marketing │
│3001  │3002  │3003    │3004     │3005      │3006    │3009      │
└──────┴──────┴────────┴─────────┴──────────┴────────┴──────────┘
│                                                                 │
│              Logistics (3010)                                  │
└─────────────────────────────────────────────────────────────────┘
                           │
┌──────────────────────────▼────────────────────────────────────┐
│                   EVENT BUS (RabbitMQ)                         │
│  • Asynchronous communication between services                │
│  • Event streaming (order.created, payment.completed, etc)   │
│  • Guaranteed delivery with retries                           │
│  • Dead-letter queue for failures                             │
└────────────────────────────────────────────────────────────────┘
                           │
┌──────────────────────────▼────────────────────────────────────┐
│                   DATA LAYER                                   │
├─────────────────────────────────────────────────────────────────┤
│  📊 PostgreSQL 15                 │  🍃 MongoDB 7              │
│  ├─ Auth DB                       │  ├─ Product DB             │
│  ├─ Order DB                      │  ├─ Notification DB        │
│  ├─ Payment DB                    │  ├─ Marketing DB           │
│  ├─ Inventory DB                  │  └─ Analytics DB           │
│  └─ Logistics DB                  │                            │
│                                   │                            │
│  ⚡ Redis 7 (Cache/Session)       │ 📮 RabbitMQ 3 (Events)     │
└─────────────────────────────────────────────────────────────────┘

Service Details & Responsibilities

Service Port Type Database Purpose
API Gateway 3000 Routing - Entry point, auth, routing
Auth Service 3001 Core PostgreSQL User authentication, JWT, RBAC
Product Service 3002 Core MongoDB Product catalog, search, variants
Order Service 3003 Core PostgreSQL Order management, checkout, cart
Payment Service 3004 Core PostgreSQL Payment processing (Stripe/SSLCommerce/PayPal)
Inventory Service 3005 Core PostgreSQL Stock management, multi-warehouse, reservations
Notification Service 3006 Support MongoDB Email, SMS, push notifications
Marketing Service 3009 Support MongoDB SEO, GTM, GA4, conversion tracking ⭐
Logistics Service 3010 Support PostgreSQL Shipments, courier integration ⭐

Data Flow Example: Order Placement

1. Customer places order on Storefront (3008)
   ↓
2. Sends to API Gateway (3000)
   ↓
3. Gateway validates & forwards to Order Service (3003)
   ↓
4. Order Service checks inventory via Inventory Service (3005)
   ↓
5. Order created, triggers RabbitMQ event: "order.created"
   ↓
6. Multiple services react:
   ├─ Payment Service → Processes payment
   ├─ Inventory Service → Reserves stock
   ├─ Notification Service → Sends confirmation email
   └─ Marketing Service → Tracks conversion
   ↓
7. Payment completed → triggers "payment.completed" event
   ↓
8. Logistics Service → Auto-creates shipment, books courier
   ↓
9. Customer receives shipping confirmation via Notification Service

10 Microservices Explained

1. Auth Service (3001) 🔐

Purpose: User authentication & authorization
Database: PostgreSQL
Key Functions:

  • User registration & login (email/phone)
  • JWT token generation & refresh
  • Role-Based Access Control (RBAC)
  • Password hashing & security

2. Product Service (3002) 📦

Purpose: Product catalog management
Database: MongoDB (flexible schema)
Key Functions:

  • Product CRUD, variants, SKUs
  • Search with Elasticsearch
  • Categories & tags
  • Ratings & reviews

3. Order Service (3003) 📋

Purpose: Order lifecycle management
Database: PostgreSQL
Key Functions:

  • Cart management
  • Order checkout
  • Order tracking
  • Order history & analytics

4. Payment Service (3004) 💳

Purpose: Payment processing
Database: PostgreSQL
Key Functions:

  • Stripe integration
  • SSLCommerce integration (Bangladesh)
  • PayPal integration
  • Payment status tracking & reconciliation

5. Inventory Service (3005) 📊

Purpose: Stock & warehouse management
Database: PostgreSQL
Key Functions:

  • Multi-warehouse support
  • Stock reservations
  • Real-time availability
  • Inventory reconciliation

6. Notification Service (3006) 📧

Purpose: Notifications (email, SMS, push)
Database: MongoDB
Key Functions:

  • Email sending (SMTP)
  • SMS via Twilio
  • Push notifications
  • Notification templates

7. Marketing Service (3009) 📈 ⭐ NEW

Purpose: Growth & conversion tracking
Database: MongoDB
Key Functions:

  • SEO metadata management
  • Tag manager (GTM, GA4, Meta, TikTok)
  • Server-side conversion tracking
  • GDPR-compliant PII hashing (SHA-256)

8. Logistics Service (3010) 🚚 ⭐ NEW

Purpose: Shipment & courier management
Database: PostgreSQL
Key Functions:

  • Auto shipment creation
  • Smart courier routing
  • Steadfast integration (Bangladesh)
  • Pathao integration (Bangladesh)
  • COD reconciliation

9. Admin Dashboard (3007) 👨‍💼

Purpose: Merchant portal
Frontend: Next.js 14
Key Features:

  • Order management
  • Inventory management
  • Analytics & reporting
  • Payment settlement

10. Storefront (3008) 🛒

Purpose: Customer shopping interface
Frontend: Next.js 14
Key Features:

  • Product browsing
  • Shopping cart
  • Checkout
  • Order tracking

🧪 Testing & Quality Assurance

Unit Testing

# Run all unit tests
yarn test

# Test specific service
cd services/marketing-service
npm run test

# Watch mode (re-run on file change)
npm run test:watch

# Coverage report
npm run test:cov

E2E Testing

# Test entire order flow
npm run test:e2e

# Test specific feature
npm run test:e2e -- order-service

# Generate coverage
npm run test:e2e:cov

Code Quality

# Lint TypeScript
yarn lint

# Fix linting issues automatically
yarn lint:fix

# Format code
yarn format

# Type checking
yarn type-check

📚 API Integration Examples

1. Register & Login

# Register new user
curl -X POST http://localhost:3000/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "merchant@business.com",
    "password": "SecurePass123!",
    "name": "John Merchant",
    "phone": "+880123456789"
  }'

# Response: User created with userId

# Login
curl -X POST http://localhost:3000/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "merchant@business.com",
    "password": "SecurePass123!"
  }'

# Response: {
#   "access_token": "eyJhbGc...",
#   "refresh_token": "eyJhbGc...",
#   "expiresIn": 3600
# }

2. Create Product

TOKEN="your_access_token_here"

curl -X POST http://localhost:3000/products \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Wireless Headphones",
    "description": "Premium noise-canceling headphones",
    "sku": "WH-001",
    "price": 9999,
    "category": "Electronics",
    "stock": 100,
    "images": ["url1", "url2"]
  }'

3. Place Order

curl -X POST http://localhost:3000/orders \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "productId": "prod-123",
        "quantity": 2,
        "price": 9999
      }
    ],
    "shippingAddress": {
      "street": "123 Main St",
      "city": "Dhaka",
      "district": "Dhaka",
      "postcode": "1000",
      "country": "Bangladesh"
    },
    "paymentMethod": "stripe"
  }'

# Response: {
#   "orderId": "ORD-12345",
#   "status": "pending_payment",
#   "paymentUrl": "https://checkout.stripe.com/..."
# }

4. Track Shipment

curl -X GET http://localhost:3000/logistics/shipments/SHIP-123 \
  -H "Authorization: Bearer $TOKEN"

# Response: {
#   "shipmentId": "SHIP-123",
#   "orderId": "ORD-12345",
#   "status": "in_transit",
#   "courier": "steadfast",
#   "trackingNumber": "SF-123456",
#   "lastUpdate": "2024-01-19T10:30:00Z",
#   "estimatedDelivery": "2024-01-21T18:00:00Z"
# }

5. Server-Side Conversion Tracking

# Merchant sends conversion event from backend
curl -X POST http://localhost:3000/marketing/conversions/track \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "event": "purchase",
    "orderId": "ORD-12345",
    "customerId": "CUST-789",
    "value": 19998,
    "currency": "BDT",
    "customerEmail": "customer@example.com",
    "customerPhone": "+880987654321",
    "items": [
      {
        "productId": "prod-123",
        "name": "Wireless Headphones",
        "quantity": 2,
        "price": 9999
      }
    ]
  }'

# Service automatically:
# 1. Hashes PII (email, phone)
# 2. Sends to GA4, Meta, TikTok
# 3. Stores locally for reporting
# 4. Schedules retry if failed

📞 Support & Resources

Documentation

GitHub Issues

Email Support


📊 Project Statistics

Metric Value
Total Services 10 microservices
Frontends 2 Next.js apps
API Endpoints 75+ REST endpoints
TypeScript Files 150+
Total Lines of Code 25,000+
Database Tables 50+
Docker Containers 12
Kubernetes Manifests 31 files
Git Commits 6 major phases
Test Coverage 80%+

✅ Production Readiness Checklist

Before deploying to production, verify:

  • All services start without errors
  • Health checks pass on all services
  • Database migrations completed
  • Environment variables configured
  • SSL/TLS certificates installed
  • Backup strategy implemented
  • Monitoring & alerting setup
  • Rate limiting configured
  • CORS whitelist updated
  • API keys rotated (payment gateways, couriers)
  • Database backups automated
  • Log aggregation configured
  • Security headers enabled
  • Load testing completed
  • Disaster recovery plan tested

🎓 Learning Resources

Microservices Architecture

Kubernetes

TypeScript

Database


🤝 Contributing

Development Workflow

# 1. Create feature branch
git checkout -b feature/amazing-feature

# 2. Make changes
# - Write code
# - Write tests
# - Update documentation

# 3. Commit changes
git add .
git commit -m "feat: Add amazing feature

- Added new endpoint
- Updated documentation
- Added tests
- Fixes #123"

# 4. Push and create PR
git push origin feature/amazing-feature

# 5. Wait for CI/CD checks
# - Tests must pass
# - Code coverage > 80%
# - Linting must pass

# 6. Get approval and merge

Commit Message Format

<type>(<scope>): <subject>

<body>

<footer>

Types:

  • feat: New feature
  • fix: Bug fix
  • docs: Documentation
  • style: Code style
  • refactor: Code refactor
  • test: Tests
  • chore: Build/CI

Example:

feat(marketing): Add server-side conversion tracking

- Implemented conversion event processing
- Added PII hashing with SHA-256
- Integrated GA4 and Meta Pixel
- Added retry mechanism for failed events
- Closes #456

📄 License

Enterprise proprietary - All rights reserved

This platform is licensed for internal use by RCL enterprise clients. Unauthorized copying or distribution is prohibited.


🎉 Summary

RCL Commerce Operating System is your complete, production-ready solution for:

✅ Building Marketplaces - Multi-vendor, multi-tenant
✅ Enterprise E-Commerce - B2B, B2C, D2C
✅ SaaS Commerce - White-label platform
✅ Scaling Fast - From 100 to 100,000 orders/day
✅ Global Operations - Multi-currency, multi-language
✅ Smart Logistics - Auto-courier selection, tracking
✅ Growth Analytics - Server-side conversion tracking

All with enterprise-grade security, performance, and reliability.


🚀 Ready to build the future of commerce?


📁 Project Structure

rcl/
├── apps/
│   ├── admin-nextjs/              # Admin Dashboard (3007)
│   ├── storefront-nextjs/         # Web Storefront (3008)
│   └── api-gateway/               # API Gateway (3000)
├── services/
│   ├── auth-service/              # Authentication
│   ├── product-service/           # Product Catalog
│   ├── order-service/             # Order Management
│   ├── payment-service/           # Payment Processing
│   ├── inventory-service/         # Stock Management
│   ├── notification-service/      # Email/SMS/Push
│   ├── marketing-service/         # SEO/GTM/Conversion ⭐
│   └── logistics-service/         # Delivery/Courier ⭐
├── packages/
│   ├── common/                    # Shared utilities
│   ├── event-bus/                 # RabbitMQ integration
│   └── auth-client/               # Auth SDK
├── docker/
│   ├── docker-compose.yml         # Full stack (all 12 services)
│   ├── Dockerfile.marketing-service
│   └── Dockerfile.logistics-service
├── k8s/
│   ├── base/                      # 15 base manifests
│   ├── prod/                      # Production overlays
│   └── staging/                   # Staging overlays
└── README.md                      # This file

� Technology Stack (Detailed)

Frontend Layer

Technology Version Purpose
Next.js 14 React framework, SSR, API routes
React 18 UI component library
Tailwind CSS 3.4 Utility-first CSS framework
TypeScript 5.3 Type-safe JavaScript

Backend Layer

Technology Version Purpose
NestJS 10.3 Enterprise Node.js framework
TypeScript 5.3 Type-safe backend code
Express.js 4.x HTTP server (via NestJS)
Passport.js 0.x Authentication middleware

Database Layer

Technology Version Purpose Used By
PostgreSQL 15 Relational database Auth, Order, Payment, Inventory, Logistics
MongoDB 7 NoSQL database Product, Notification, Marketing
Redis 7 In-memory cache Sessions, cache, rate limiting
RabbitMQ 3 Message broker Async events, task queue

Infrastructure

Technology Version Purpose
Docker 20+ Containerization
Docker Compose 2+ Local orchestration
Kubernetes 1.24+ Production orchestration
Kustomize Built-in K8s configuration management

Integrations

Service Purpose
Stripe Global payment processing
SSLCommerce Bangladesh payment gateway
PayPal International payments
Steadfast Bangladesh courier integration
Pathao Bangladesh delivery service
Gmail SMTP Email delivery
Twilio SMS notifications

Security

Technology Purpose
JWT Stateless authentication
Passport.js Authentication strategies
Helmet.js HTTP security headers
bcryptjs Password hashing
OpenSSL TLS/SSL encryption

⭐ New Features in Phase 9 & 10

Marketing Service (3009) - Server-Side Conversion Tracking

Why it matters:

  • 30-40% of analytics data lost due to ad-blockers
  • Server-side tracking captures true conversion metrics
  • GDPR-compliant with SHA-256 PII hashing

Key endpoints:

POST   /marketing/seo/metadata
GET    /marketing/seo/metadata/:id
PUT    /marketing/seo/metadata/:id

POST   /marketing/tags/config
GET    /marketing/tags/config/:id
PUT    /marketing/tags/config/:id

GET    /marketing/tracking/config/storefront
POST   /marketing/conversions/track
POST   /marketing/conversions/retry-failed

Real-world example:

Customer purchases on Storefront (3008)
                ↓
Storefront calls: POST /marketing/conversions/track
                ↓
Marketing Service receives:
{
  "event": "purchase",
  "value": 99.99,
  "currency": "USD",
  "customerEmail": "user@example.com",  // Will be hashed
  "purchaseId": "ORD-12345"
}
                ↓
Service hashes email, sends to:
  ├─ Google Analytics (GA4)
  ├─ Meta Pixel
  ├─ TikTok Pixel
  └─ Stores locally for reporting
                ↓
24 hours later: Retry failed events automatically

Logistics Service (3010) - Smart Courier Integration

Why it matters:

  • Multi-courier support prevents single-vendor lock-in
  • Auto-booking saves 15+ minutes per shipment
  • COD reconciliation automates accounting

Key endpoints:

POST   /logistics/shipments
GET    /logistics/shipments/:id
PUT    /logistics/shipments/:id/status
POST   /logistics/shipments/:id/sync

POST   /logistics/couriers/accounts
GET    /logistics/couriers/list
GET    /logistics/couriers/rates

GET    /logistics/reconciliation/cod

Smart routing example:

New shipment created: Dhaka → Sylhet

Logistics Service evaluates:
├─ Steadfast: Cost 80 TK, Time 2 days, Coverage 100%
├─ Pathao: Cost 100 TK, Time 1 day, Coverage 95%
└─ Local: Cost 50 TK, Time 3 days, Coverage 80%

Based on rules:
  • If order > 5000 TK → Use Steadfast (cheapest)
  • If urgent flag → Use Pathao (fastest)
  • If cash-on-delivery → Check COD limits

Auto-books with Steadfast:
  ├─ Creates tracking number
  ├─ Generates label
  ├─ Updates customer
  └─ Syncs inventory

📁 Project Structure (Complete)

rcl/
│
├── 📱 Frontend Applications
│   ├── apps/admin-nextjs/           # Merchant admin portal (3007)
│   │   ├── src/
│   │   │   ├── app/                 # Next.js 14 app directory
│   │   │   ├── components/          # React components
│   │   │   ├── styles/              # Tailwind styles
│   │   │   └── pages/               # Next.js pages
│   │   ├── package.json
│   │   ├── next.config.js
│   │   └── tsconfig.json
│   │
│   └── apps/storefront-nextjs/      # Customer store (3008)
│       ├── src/
│       └── package.json
│
├── 🚪 API Gateway
│   └── apps/api-gateway/            # Main entry point (3000)
│       ├── src/
│       │   ├── main.ts              # Bootstrap
│       │   ├── app.module.ts        # Root module
│       │   └── controllers/
│       └── package.json
│
├── 🔧 Microservices
│   ├── services/auth-service/       # Authentication (3001)
│   │   ├── src/
│   │   │   ├── main.ts
│   │   │   ├── app.module.ts
│   │   │   ├── modules/
│   │   │   │   ├── auth/
│   │   │   │   ├── users/
│   │   │   │   └── health/
│   │   │   ├── strategies/          # JWT, passport
│   │   │   └── entities/            # TypeORM entities
│   │   └── package.json
│   │
│   ├── services/product-service/    # Catalog (3002)
│   │   └── src/
│   │       ├── modules/
│   │       │   ├── products/
│   │       │   ├── categories/
│   │       │   └── reviews/
│   │       └── entities/            # Mongoose schemas
│   │
│   ├── services/order-service/      # Orders (3003)
│   │   └── src/
│   │       ├── modules/
│   │       │   ├── orders/
│   │       │   ├── cart/
│   │       │   └── checkout/
│   │       └── entities/
│   │
│   ├── services/payment-service/    # Payments (3004)
│   │   └── src/
│   │       ├── modules/
│   │       │   ├── payments/
│   │       │   ├── gateways/
│   │       │   │   ├── stripe/
│   │       │   │   ├── ssl-commerce/
│   │       │   │   └── paypal/
│   │       │   └── reconciliation/
│   │       └── entities/
│   │
│   ├── services/inventory-service/  # Stock (3005)
│   │   └── src/
│   │       ├── modules/
│   │       │   ├── inventory/
│   │       │   ├── warehouses/
│   │       │   └── reservations/
│   │       └── entities/
│   │
│   ├── services/notification-service/ # Email/SMS (3006)
│   │   └── src/
│   │       ├── modules/
│   │       │   ├── email/
│   │       │   ├── sms/
│   │       │   └── push/
│   │       └── entities/            # Mongoose schemas
│   │
│   ├── services/marketing-service/  # Growth (3009) ⭐
│   │   ├── src/
│   │   │   ├── modules/
│   │   │   │   ├── marketing/
│   │   │   │   │   ├── marketing.service.ts    (300+ lines)
│   │   │   │   │   ├── marketing.controller.ts (10 endpoints)
│   │   │   │   │   └── dto/
│   │   │   │   └── health/
│   │   │   ├── entities/
│   │   │   │   ├── seo-metadata.schema.ts
│   │   │   │   ├── tag-config.schema.ts
│   │   │   │   └── conversion-event.schema.ts
│   │   │   └── strategies/
│   │   └── README.md
│   │
│   └── services/logistics-service/  # Delivery (3010) ⭐
│       ├── src/
│       │   ├── modules/
│       │   │   ├── logistics/
│       │   │   │   ├── logistics.service.ts    (400+ lines)
│       │   │   │   ├── logistics.controller.ts (9 endpoints)
│       │   │   │   └── dto/
│       │   │   └── health/
│       │   ├── entities/
│       │   │   ├── shipment.entity.ts
│       │   │   └── courier-account.entity.ts
│       │   └── strategies/
│       └── README.md
│
├── 📦 Shared Libraries
│   ├── packages/common/
│   │   ├── src/
│   │   │   ├── decorators/          # Custom decorators
│   │   │   ├── guards/              # Auth guards
│   │   │   ├── filters/             # Exception filters
│   │   │   ├── interceptors/        # Request interceptors
│   │   │   └── types/               # TypeScript types
│   │   └── package.json
│   │
│   ├── packages/event-bus/
│   │   ├── src/
│   │   │   ├── rabbitmq/
│   │   │   ├── publishers/
│   │   │   └── subscribers/
│   │   └── package.json
│   │
│   └── packages/auth-client/
│       └── src/                     # JWT client library
│
├── 🐳 Docker Configuration
│   ├── docker-compose.yml           # All 12 services + infra
│   │   ├── postgres               # PostgreSQL 15
│   │   ├── mongo                  # MongoDB 7
│   │   ├── redis                  # Redis 7
│   │   ├── rabbitmq               # RabbitMQ 3
│   │   ├── api-gateway            # Port 3000
│   │   ├── auth-service           # Port 3001
│   │   ├── product-service        # Port 3002
│   │   ├── order-service          # Port 3003
│   │   ├── payment-service        # Port 3004
│   │   ├── inventory-service      # Port 3005
│   │   ├── notification-service   # Port 3006
│   │   ├── admin-nextjs           # Port 3007
│   │   ├── storefront-nextjs      # Port 3008
│   │   ├── marketing-service      # Port 3009
│   │   └── logistics-service      # Port 3010
│   │
│   ├── Dockerfile.api-gateway
│   ├── Dockerfile.auth-service
│   ├── Dockerfile.product-service
│   ├── Dockerfile.order-service
│   ├── Dockerfile.payment-service
│   ├── Dockerfile.inventory-service
│   ├── Dockerfile.notification-service
│   ├── Dockerfile.marketing-service
│   ├── Dockerfile.logistics-service
│   ├── Dockerfile.admin-nextjs
│   └── Dockerfile.storefront-nextjs
│
├── ☸️ Kubernetes Manifests
│   ├── base/                        # Base configuration (development)
│   │   ├── 00-namespace-config.yaml
│   │   ├── 01-auth-db.yaml
│   │   ├── 02-redis.yaml
│   │   ├── 03-rabbitmq.yaml
│   │   ├── 04-api-gateway.yaml
│   │   ├── 05-auth-service.yaml
│   │   ├── 06-payment-db.yaml
│   │   ├── 06-product-db.yaml
│   │   ├── 07-inventory-db.yaml
│   │   ├── 07-product-service.yaml
│   │   ├── 08-order-service.yaml
│   │   ├── 09-payment-service.yaml
│   │   ├── 10-inventory-service.yaml
│   │   ├── 11-notification-service.yaml
│   │   ├── 12-admin-nextjs.yaml
│   │   ├── 13-storefront-nextjs.yaml
│   │   ├── 14-marketing-service.yaml      ⭐
│   │   ├── 15-logistics-service.yaml      ⭐
│   │   └── kustomization.yaml             (orchestrates all)
│   │
│   ├── prod/                        # Production overlays
│   │   ├── kustomization.yaml       (3 replicas each)
│   │   ├── admin-nextjs-patch.yaml
│   │   ├── api-gateway-patch.yaml
│   │   ├── auth-service-patch.yaml
│   │   ├── payment-service-patch.yaml
│   │   ├── product-service-patch.yaml
│   │   ├── order-service-patch.yaml
│   │   ├── inventory-service-patch.yaml
│   │   ├── notification-service-patch.yaml
│   │   ├── marketing-service-patch.yaml   ⭐
│   │   ├── logistics-service-patch.yaml   ⭐
│   │   └── ...
│   │
│   └── staging/                     # Staging overlays
│       ├── kustomization.yaml       (2 replicas each)
│       └── ...
│
├── 📋 Configuration Files
│   ├── package.json                 # Monorepo root
│   ├── tsconfig.json                # TypeScript config
│   ├── yarn.lock                    # Dependency lock file
│   ├── .env.example                 # Environment template
│   └── .gitignore
│
└── 📖 Documentation
    └── README.md                    # This file (comprehensive)

🔐 Security & Best Practices

Authentication & Authorization

All protected endpoints require JWT token:

1. User logs in → POST /auth/login
2. Receive JWT token + refresh token
3. Include in requests: Authorization: Bearer JWT_TOKEN
4. Token expires in 1 hour
5. Use refresh token to get new JWT
6. On logout → token invalidated

Data Protection

✅ PII Hashing: Email, phone, name hashed with SHA-256
✅ Password: bcryptjs with salt rounds = 10
✅ Secrets: Environment variables (never committed)
✅ Database: Encrypted at rest (production)
✅ Transport: HTTPS/TLS in production

Multi-Tenancy Isolation

Every query includes: tenantId

Example:
  GET /orders?tenantId=TENANT_001
  
Benefits:
  ✅ Complete data isolation
  ✅ Cannot accidentally access other tenant data
  ✅ Per-tenant billing & reporting

📊 Performance & Scaling

Horizontal Scaling (Kubernetes)

Service: Marketing Service (3009)

Base replicas: 2
Max replicas: 8

Scales UP when:
  • CPU > 70%
  • Memory > 80%
  • Request count > 1000/sec

Scales DOWN when:
  • CPU < 30%
  • Memory < 40%
  • Request count < 100/sec

Caching Strategy

Redis stores:
  • User sessions (TTL: 24 hours)
  • Product catalog (TTL: 1 hour)
  • Conversion tracking configs (TTL: 30 min)
  • Courier rates (TTL: 6 hours)
  • Shipment status (TTL: 7 days)

Database Optimization

PostgreSQL:
  • Connection pooling (20 connections per service)
  • Indexes on frequently queried columns
  • Separate read replicas (production)

MongoDB:
  • Sharding by tenantId
  • TTL indexes for automatic cleanup
  • Full-text search on product names

🚀 Step-by-Step Deployment Guide

Prerequisites

Option 1: Local Development (Mac/Linux)

# Check requirements
node --version          # Should be 18+
npm --version           # Should be 9+
docker --version        # Should be 20+
docker-compose --version # Should be 1.29+
git --version           # Should be 2.30+

# Minimum requirements
- Node.js: 18.0.0 or higher
- npm: 9.0.0 or higher (or Yarn 4.0.0+)
- Docker: 20.0.0 or higher
- Docker Compose: 2.0.0 or higher
- RAM: 8GB minimum
- Disk: 20GB free space

Option 2: Docker Desktop (Windows/Mac)

# Download from https://www.docker.com/products/docker-desktop
# Install and ensure both Docker & Docker Compose are enabled
docker --version
docker-compose --version

Option 3: Kubernetes (Production)

# Install kubectl
kubectl version --client

# Ensure cluster access
kubectl get nodes

# Minimum: 3 nodes with 2CPU, 4GB RAM each

📦 Deployment Option 1: Local Development (Docker Compose)

Step 1: Clone Repository

# Clone from GitHub
git clone git@github.com:amirulhasanpulok/rcl.git
cd rcl

# Or if using HTTPS
git clone https://github.com/amirulhasanpulok/rcl.git
cd rcl

# Verify structure
ls -la
# Should show: apps/ docker/ k8s/ packages/ services/ README.md package.json

Step 2: Install Dependencies

# Option A: Using Yarn (recommended for monorepo)
yarn install
# This installs dependencies for ALL workspaces

# Option B: Using npm
npm install

# Verify installation
yarn --version  # Should be 4.0.0+
ls node_modules # Should contain packages

# Wait: ~2-3 minutes depending on internet speed

Step 3: Setup Environment Variables

# Create .env file in project root
touch .env.development.local

# Or copy from example
cp .env.example .env.development.local

Add these environment variables to .env.development.local:

# ===== NODE ENV =====
NODE_ENV=development

# ===== JWT & SECURITY =====
JWT_SECRET=your-super-secret-jwt-key-min-32-characters-long!

# ===== PostgreSQL DATABASE =====
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres123
POSTGRES_DB_AUTH=auth_db
POSTGRES_DB_ORDER=order_db
POSTGRES_DB_PAYMENT=payment_db
POSTGRES_DB_INVENTORY=inventory_db
POSTGRES_DB_LOGISTICS=logistics_db

# ===== MongoDB =====
MONGODB_URI=mongodb://admin:password@mongo:27017/rcl?authSource=admin
MONGODB_USER=admin
MONGODB_PASSWORD=password

# ===== Redis =====
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=

# ===== RabbitMQ =====
RABBITMQ_HOST=rabbitmq
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest

# ===== PAYMENT GATEWAYS =====
STRIPE_SECRET_KEY=sk_test_your_stripe_key_here
STRIPE_PUBLISHABLE_KEY=pk_test_your_stripe_key_here
SSL_COMMERCE_STORE_ID=your_store_id
SSL_COMMERCE_STORE_PASSWORD=your_store_password
PAYPAL_CLIENT_ID=your_paypal_client_id
PAYPAL_CLIENT_SECRET=your_paypal_secret

# ===== COURIER SERVICES =====
STEADFAST_API_KEY=your_steadfast_api_key
STEADFAST_API_URL=https://api.steadfast.io
PATHAO_CLIENT_ID=your_pathao_client_id
PATHAO_CLIENT_SECRET=your_pathao_secret
PATHAO_API_URL=https://api.pathao.com

# ===== EMAIL (SMTP) =====
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-password
SMTP_FROM=noreply@rcl-commerce.io

# ===== SMS (TWILIO) =====
TWILIO_ACCOUNT_SID=your_twilio_sid
TWILIO_AUTH_TOKEN=your_twilio_token
TWILIO_PHONE_NUMBER=+1234567890

# ===== CORS =====
CORS_ORIGIN=http://localhost:3000,http://localhost:3007,http://localhost:3008

# ===== API GATEWAY =====
API_GATEWAY_PORT=3000
API_GATEWAY_TIMEOUT=30000

# ===== SERVICE PORTS =====
AUTH_SERVICE_PORT=3001
PRODUCT_SERVICE_PORT=3002
ORDER_SERVICE_PORT=3003
PAYMENT_SERVICE_PORT=3004
INVENTORY_SERVICE_PORT=3005
NOTIFICATION_SERVICE_PORT=3006
MARKETING_SERVICE_PORT=3009
LOGISTICS_SERVICE_PORT=3010

Step 4: Start Docker Compose

# Navigate to docker directory
cd docker

# Start all services (detached mode)
docker-compose up -d

# Wait for containers to initialize (~30 seconds)
sleep 30

# Check if all containers are running
docker-compose ps

# You should see all 12 containers with status "Up"

Step 5: Initialize Databases

# PostgreSQL: Create databases and run migrations
docker exec rcl-postgres psql -U postgres -c "CREATE DATABASE auth_db;"
docker exec rcl-postgres psql -U postgres -c "CREATE DATABASE order_db;"
docker exec rcl-postgres psql -U postgres -c "CREATE DATABASE payment_db;"
docker exec rcl-postgres psql -U postgres -c "CREATE DATABASE inventory_db;"
docker exec rcl-postgres psql -U postgres -c "CREATE DATABASE logistics_db;"

# MongoDB: Create collections (automatic on first use)
echo "Collections will be created automatically"

# Verify PostgreSQL
docker exec rcl-postgres psql -U postgres -l | grep "_db"

Step 6: Access All Services

Open in your browser:

📊 Services Status:
├─ API Gateway ............ http://localhost:3000 (main entry point)
├─ Auth Service ........... http://localhost:3001/docs (Swagger)
├─ Product Service ........ http://localhost:3002/docs (Swagger)
├─ Order Service .......... http://localhost:3003/docs (Swagger)
├─ Payment Service ........ http://localhost:3004/docs (Swagger)
├─ Inventory Service ...... http://localhost:3005/docs (Swagger)
├─ Notification Service ... http://localhost:3006/docs (Swagger)
├─ Admin Dashboard ........ http://localhost:3007
├─ Storefront ............. http://localhost:3008
├─ Marketing Service ...... http://localhost:3009/docs (Swagger) ⭐
├─ Logistics Service ...... http://localhost:3010/docs (Swagger) ⭐
│
├─ PostgreSQL ............. localhost:5432
├─ MongoDB ................ localhost:27017
├─ Redis .................. localhost:6379
├─ RabbitMQ ............... http://localhost:15672 (admin/admin)
└─ RabbitMQ AMQP .......... localhost:5672

Step 7: Test Services

# Test Auth Service
curl -X POST http://localhost:3000/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "Test123!",
    "name": "Test User"
  }'

# Get JWT token
curl -X POST http://localhost:3000/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "Test123!"
  }'

# Test with token
curl -X GET http://localhost:3000/auth/me \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

🐳 Deployment Option 2: Kubernetes (Production)

Prerequisites for Kubernetes

# Check kubectl access
kubectl get nodes

# Check cluster info
kubectl cluster-info

# Verify Kubernetes version
kubectl version --short

# Required: Kubernetes 1.24+

Step 1: Create Namespace

# Create namespace for RCL
kubectl create namespace rcl-platform

# Verify
kubectl get namespaces | grep rcl-platform

Step 2: Create Secrets

# Create secrets from your environment
kubectl create secret generic rcl-secrets \
  --from-literal=JWT_SECRET=your-secret-key \
  --from-literal=POSTGRES_PASSWORD=postgres123 \
  --from-literal=MONGODB_PASSWORD=password \
  --from-literal=STRIPE_SECRET_KEY=sk_test_... \
  -n rcl-platform

# Verify secrets created
kubectl get secrets -n rcl-platform

Step 3: Deploy Base Configuration

# Navigate to k8s directory
cd k8s

# Deploy base resources (development)
kubectl apply -k base -n rcl-platform

# Wait for deployments to be ready
kubectl wait --for=condition=available --timeout=300s \
  deployment --all -n rcl-platform

# Verify all pods are running
kubectl get pods -n rcl-platform
# Should show all services with status "Running"

Step 4: Deploy Production Configuration

# If deploying to production
kubectl apply -k prod -n rcl-platform

# This applies production overlays:
# - 3 replicas per service
# - Resource limits
# - Pod disruption budgets
# - Higher min replicas for HPA

# Verify production deployment
kubectl get deployments -n rcl-platform -o wide

Step 5: Setup Storage (If Needed)

# Create persistent volumes for databases
kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/postgres
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb-pv
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/mongodb
EOF

# Verify volumes
kubectl get pv

Step 6: Setup Ingress

# Create Ingress for external access
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rcl-ingress
  namespace: rcl-platform
spec:
  rules:
  - host: api.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-gateway
            port:
              number: 80
  - host: admin.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: admin-nextjs
            port:
              number: 80
  - host: store.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: storefront-nextjs
            port:
              number: 80
EOF

# Verify ingress
kubectl get ingress -n rcl-platform

Step 7: Monitor Deployment

# Watch pod status
kubectl get pods -n rcl-platform -w

# View logs from a service
kubectl logs -f deployment/auth-service -n rcl-platform

# View logs from all replicas
kubectl logs -f deployment/marketing-service \
  --all-containers -n rcl-platform

# Check service endpoints
kubectl get svc -n rcl-platform

# Port forward to access locally
kubectl port-forward -n rcl-platform svc/api-gateway 3000:80

# Scale a service
kubectl scale deployment/logistics-service \
  --replicas=5 -n rcl-platform

# View resource usage
kubectl top pods -n rcl-platform
kubectl top nodes

🌐 Deployment Option 3: AWS ECS

Prerequisites

# Install AWS CLI
aws --version

# Configure credentials
aws configure

# Verify access
aws sts get-caller-identity

Step 1: Create ECR Repository

# Create repository for each service
for service in api-gateway auth-service product-service order-service \
  payment-service inventory-service notification-service \
  marketing-service logistics-service admin-nextjs storefront-nextjs; do
  
  aws ecr create-repository \
    --repository-name rcl/$service \
    --region us-east-1
done

# Verify repositories
aws ecr describe-repositories --region us-east-1

Step 2: Build and Push Docker Images

# Get ECR login token
aws ecr get-login-password --region us-east-1 | \
  docker login --username AWS --password-stdin \
  YOUR_AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com

# Build and push each service
for service in auth-service product-service ...; do
  docker build -t rcl/$service:latest \
    -f docker/Dockerfile.$service .
  
  docker tag rcl/$service:latest \
    YOUR_AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/rcl/$service:latest
  
  docker push \
    YOUR_AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/rcl/$service:latest
done

Step 3: Create ECS Cluster

# Create cluster
aws ecs create-cluster --cluster-name rcl-prod

# Create task definition (JSON - see services for details)
aws ecs register-task-definition \
  --cli-input-json file://task-definition.json

# Create service
aws ecs create-service \
  --cluster rcl-prod \
  --service-name auth-service \
  --task-definition rcl-auth-service:1 \
  --desired-count 3

🔧 Development Workflow

Running Locally (Without Docker)

# Install dependencies
yarn install

# Start all services in watch mode
yarn dev

# Or individual service
cd services/auth-service
yarn dev

# Services start on ports 3000-3010

Building for Production

# Build all services
yarn build

# Build specific service
cd services/marketing-service
npm run build

# Check build output
dist/ folder created with compiled code

Running Tests

# Run all tests
yarn test

# Run specific service tests
cd services/logistics-service
npm run test

# Test coverage
yarn test:cov

# E2E tests
yarn test:e2e

📊 Monitoring & Logs

Docker Compose Logs

# All services
docker-compose logs

# Single service
docker-compose logs marketing-service

# Follow logs in real-time
docker-compose logs -f

# Last 100 lines
docker-compose logs --tail=100 logistics-service

Kubernetes Logs

# Pod logs
kubectl logs pod/auth-service-abc123 -n rcl-platform

# Deployment logs
kubectl logs deployment/logistics-service -n rcl-platform

# All containers in pod
kubectl logs pod/marketing-service-xyz789 \
  --all-containers -n rcl-platform

# Follow logs
kubectl logs -f deployment/order-service -n rcl-platform

Health Checks

All services expose health endpoints:

# Liveness probe
curl http://localhost:3009/health

# Readiness probe
curl http://localhost:3010/health/ready

🛑 Stopping & Cleanup

Docker Compose

# Stop all containers
docker-compose down

# Remove volumes (BE CAREFUL - deletes data!)
docker-compose down -v

# Remove everything including images
docker-compose down -v --rmi all

Kubernetes

# Delete namespace (deletes all resources)
kubectl delete namespace rcl-platform

# Or specific resource
kubectl delete deployment/marketing-service -n rcl-platform

✅ Troubleshooting

Common Issues

Issue: Containers won't start

# Check logs
docker-compose logs

# Check port conflicts
lsof -i :3009

# Restart
docker-compose restart

Issue: Database connection error

# Test PostgreSQL
docker exec rcl-postgres psql -U postgres -c "\l"

# Test MongoDB
docker exec rcl-mongo mongo --eval "db.adminCommand('ping')"

# Check network
docker network inspect docker_default

Issue: Out of memory

# Check resource usage
docker stats

# Increase Docker Desktop memory (Settings → Resources)

# Or limit containers
docker-compose down
# Edit docker-compose.yml memory limits
docker-compose up -d

Issue: Kubernetes pod not starting

# Check pod status
kubectl describe pod/marketing-service-xyz -n rcl-platform

# Check resource requests vs available
kubectl top nodes
kubectl top pods -n rcl-platform

# Check events
kubectl get events -n rcl-platform --sort-by='.lastTimestamp'

💻 Development

Run Individual Services

# Marketing Service (watch mode)
cd services/marketing-service
npm run dev

# Logistics Service (watch mode)
cd services/logistics-service
npm run dev

# Admin Dashboard
cd apps/admin-nextjs
npm run dev

# Web Storefront
cd apps/storefront-nextjs
npm run dev

All Services (Monorepo)

# Install all
yarn install

# Start all (watch mode)
yarn dev

# Build all
yarn build

# Test all
yarn test

# Lint all
yarn lint

# Format all
yarn format

Build for Production

# Build Marketing Service
cd services/marketing-service
npm run build

# Build Logistics Service
cd services/logistics-service
npm run build

# Or all at once
yarn build

🔐 Security Features

Authentication

  • ✅ JWT Bearer tokens
  • ✅ Passport.js strategies
  • ✅ Protected endpoints on sensitive operations
  • ✅ Public endpoints for storefronts/tracking

Data Security

  • ✅ PII Hashing (SHA-256: email, phone, name)
  • ✅ GDPR-Compliant by design
  • ✅ Kubernetes secrets for API keys
  • ✅ HTTPS/TLS in production

Network Security

  • ✅ Helmet.js security headers
  • ✅ CORS whitelist configuration
  • ✅ API Gateway rate limiting
  • ✅ Service-to-service JWT auth

📊 API Documentation

All services expose Swagger/OpenAPI docs:

Auth Service ........... http://localhost:3001/docs
Product Service ........ http://localhost:3002/docs
Order Service .......... http://localhost:3003/docs
Payment Service ........ http://localhost:3004/docs
Inventory Service ...... http://localhost:3005/docs
Notification Service ... http://localhost:3006/docs
Marketing Service ...... http://localhost:3009/docs ⭐
Logistics Service ...... http://localhost:3010/docs ⭐

📈 Key Features

Multi-Tenancy

✅ Complete tenant isolation (tenantId on all queries) ✅ Per-tenant data in all databases ✅ Event-driven (no cross-tenant leakage)

Enterprise Payments

✅ Stripe (global) ✅ SSLCommerce (Bangladesh) ✅ PayPal (global)

Enterprise Logistics

✅ Steadfast (Bangladesh, auto-booking) ✅ Pathao (Bangladesh, auto-booking) ✅ COD reconciliation & reporting

Enterprise Marketing

✅ Centralized SEO metadata ✅ Multi-platform tag management ✅ Server-side conversion tracking ✅ GDPR-compliant PII hashing

Scaling & Performance

✅ Kubernetes HPA (2-8 replicas per service) ✅ Pod anti-affinity for resilience ✅ Resource limits (CPU/Memory) ✅ Health checks (liveness + readiness)


🧪 Testing

# Unit tests
yarn test

# Coverage report
yarn test:cov

# E2E tests
yarn test:e2e

# Lint code
yarn lint

# Format code
yarn format

📝 Environment Variables

Create .env.development.local:

NODE_ENV=development
JWT_SECRET=your-secret-key-here

# PostgreSQL
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

# MongoDB
MONGODB_URI=mongodb://admin:password@localhost:27017/...

# Payment Gateways
STRIPE_SECRET_KEY=sk_test_...
SSL_COMMERCE_STORE_ID=your_store_id
PAYPAL_CLIENT_ID=your_client_id

# Couriers
STEADFAST_API_KEY=your_key
PATHAO_API_KEY=your_key

# Services
CORS_ORIGIN=http://localhost:3000,http://localhost:3007,http://localhost:3008

# Email/SMS
SMTP_HOST=smtp.gmail.com
TWILIO_ACCOUNT_SID=your_sid

🚨 Troubleshooting

Services Won't Start

# Check Node version (must be >=18)
node --version

# Reinstall dependencies
rm -rf node_modules yarn.lock
yarn install

# Check environment variables
cat .env.development.local

Database Connection Errors

# PostgreSQL
psql -U postgres -h localhost

# MongoDB
mongo --host localhost --port 27017

Port Already in Use

# Find process using port
lsof -i :3009

# Kill process
kill -9 <PID>

🤝 Contributing

  1. Create feature branch: git checkout -b feature/your-feature
  2. Make changes and test
  3. Push: git push origin feature/your-feature
  4. Create Pull Request
  5. Wait for CI/CD checks
  6. Get approval and merge

📊 Project Statistics

Metric Value
Total Microservices 10
Total Frontends 2
REST API Endpoints 75+
TypeScript Files 150+
Total Code 25,000+ LOC
Docker Containers 12
Kubernetes Manifests 31
Git Commits 6 phases

✅ Production Readiness

  • ✅ All 10 microservices implemented
  • ✅ 2 Next.js frontends ready
  • ✅ Docker Compose for local dev
  • ✅ Kubernetes manifests (base/prod/staging)
  • ✅ Comprehensive API documentation
  • ✅ Multi-tenant isolation verified
  • ✅ Security best practices implemented
  • ✅ Health checks on all services
  • ✅ Horizontal scaling configured
  • ✅ Production deployment ready

📞 Support


Built with ❤️ for Enterprise Commerce

Last Updated: January 19, 2026
Current Version: 1.0.0
Repository: https://github.com/amirulhasanpulok/rcl
Status: ✅ Production Ready

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages