Skip to content

System Architecture Overview

Complete technical documentation of MessWala's system design and architecture.


๐Ÿ—๏ธ System Architecture

MessWala is a three-tier architecture:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           FRONTEND (React + Vite)               โ”‚
โ”‚        Deployed on Vercel (Static)              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚              API GATEWAY (CORS)                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚         BACKEND (Node.js + Express)             โ”‚
โ”‚        Deployed on Render (Server)              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚          DATABASE (MongoDB Atlas)               โ”‚
โ”‚      Cloud-hosted MongoDB Cluster               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ Component Overview

Frontend Layer

Technology: React 18 + Vite + Tailwind CSS

Responsibilities: - User interface rendering - Form handling and validation - State management (React Context) - Client-side authentication (JWT storage) - API communication

Key Components:

src/
โ”œโ”€ pages/         # Route pages
โ”œโ”€ components/    # Reusable UI components
โ”œโ”€ services/      # API integration
โ”œโ”€ context/       # Global state (Auth, Config)
โ””โ”€ App.jsx        # Root component

Build Optimization: - Code splitting by route - Lazy-loaded components - Vendor chunk separation - CSS-in-JS with Tailwind mini - Gzipped size: ~12KB entry point

Backend Layer

Technology: Node.js + Express.js

Responsibilities: - Request routing and handling - Business logic processing - Database operations - Authentication/Authorization - API response formatting

Structure:

backend/
โ”œโ”€ src/
โ”‚  โ”œโ”€ controllers/    # Request handlers
โ”‚  โ”œโ”€ models/         # Database schemas
โ”‚  โ”œโ”€ routes/         # Route definitions
โ”‚  โ”œโ”€ middleware/     # Auth, validation
โ”‚  โ””โ”€ utils/          # Helper functions
โ””โ”€ server.js          # Entry point

Database Layer

Technology: MongoDB Atlas

Responsibilities: - Data persistence - Document storage - Indexing for performance - Backup and recovery

Collections:

messwaladb/
โ”œโ”€ users           # User accounts
โ”œโ”€ expenses        # Expense records
โ”œโ”€ meals           # Menu items
โ”œโ”€ attendance      # Attendance records
โ”œโ”€ feedback        # Meal feedback
โ””โ”€ messconfig      # Mess configuration


๐Ÿ—„๏ธ Database Schema

Users Collection

{
  _id: ObjectId,
  email: String (unique),
  password: String (hashed),
  fullName: String,
  collegeId: String,
  room: String,
  phone: String,
  role: String // "admin", "manager", "student"
  status: String // "approved", "pending", "rejected"
  googleId: String, // If Google OAuth
  createdAt: Date,
  updatedAt: Date
}

Expenses Collection

{
  _id: ObjectId,
  category: String,
  amount: Number,
  description: String,
  date: Date,
  recordedBy: ObjectId (ref: Users),
  createdAt: Date,
  updatedAt: Date
}

Meals Collection

{
  _id: ObjectId,
  date: Date,
  mealType: String // "Breakfast", "Lunch", "Dinner"
  dishes: [String],
  notes: String,
  createdBy: ObjectId (ref: Users),
  createdAt: Date,
  updatedAt: Date
}

Attendance Collection

{
  _id: ObjectId,
  userId: ObjectId (ref: Users),
  date: Date,
  mealType: String,
  status: String // "present", "absent"
  markedAt: Date,
  createdAt: Date
}

Feedback Collection

{
  _id: ObjectId,
  userId: ObjectId (ref: Users),
  date: Date,
  mealType: String,
  rating: Number (1-5),
  comment: String,
  createdAt: Date,
  updatedAt: Date
}

MessConfig Collection โญ NEW

{
  _id: ObjectId,
  messName: String,
  description: String,
  email: String,
  phone: String,
  expenseCategories: [String],
  mealTimes: [
    {
      name: String,
      startTime: String, // "HH:MM"
      endTime: String    // "HH:MM"
    }
  ],
  createdBy: ObjectId (ref: Users),
  createdAt: Date,
  updatedAt: Date
}

๐Ÿ”„ Data Flow

Login Flow

User Input (Email/Password)
    โ†“
POST /auth/login
    โ†“
Validate email exists
    โ†“
Compare passwords (bcrypt)
    โ†“
Generate JWT token
    โ†“
Return token + user info
    โ†“
Frontend stores in localStorage
    โ†“
Use token in Authorization header

Expense Recording Flow

Manager Input (Expense form)
    โ†“
POST /expenses with JWT token
    โ†“
Verify user is Manager/Treasurer
    โ†“
Validate expense data
    โ†“
Insert into Expenses collection
    โ†“
Return created expense
    โ†“
Frontend updates list
    โ†“
Student sees in Analytics โ†’ Fair share recalculated

Attendance Marking Flow

Student marks attendance
    โ†“
POST /attendance with JWT
    โ†“
Verify user authenticated
    โ†“
Check/insert into Attendance
    โ†“
Calculate participation rate
    โ†“
Trigger fair share recalculation
    โ†“
Update Analytics cache (optional)

๐Ÿ”‘ Key Features

Configuration System (NEW in v2.0)

All system configuration stored in MessConfig:

// Frontend loads this on app start
const config = await fetch('/api/auth/admin/config');
// {
//   messName: "Krishna Bhawan",
//   expenseCategories: ["Vegetables", "Rice", ...],
//   mealTimes: [...]
// }

// Used throughout frontend
<select>
  {config.expenseCategories.map(cat => (
    <option key={cat}>{cat}</option>
  ))}
</select>

Benefits: - No hardcoded values - Admin can update without redeployment - Scales to multiple messes (future) - Zero data on fresh deploy

Authentication & Authorization

JWT Verification Middleware:

const authMiddleware = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];

  if (!token) {
    return res.status(401).json({ error: 'No token' });
  }

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded;
    next();
  } catch (err) {
    res.status(401).json({ error: 'Invalid token' });
  }
};

Role-Based Access Control:

const requireRole = (role) => {
  return (req, res, next) => {
    if (req.user.role !== role) {
      return res.status(403).json({ error: 'Forbidden' });
    }
    next();
  };
};

// Usage
router.post('/expenses', requireRole('manager'), createExpense);

Fair Share Calculation

Algorithm:

1. Get all expenses for the month
2. Get all active members (attended โ‰ฅ1 meal)
3. For each member:
   - Count meals attended (all types combined)
   - Share = (Total รท Active members) ร— (Member meals รท Total meals)
4. Display per member

Analytics Aggregation

Real-time calculation:

// On analytics page request:
1. Fetch all expenses for period
2. Fetch all attendance for period
3. Fetch all feedback for period
4. Aggregate:
   - Sum by category
   - Average ratings
   - Attendance percentages
5. Return summarized data


๐Ÿ” Security Architecture

Authentication Layer

  • โœ… JWT tokens (7-day expiry)
  • โœ… Password hashing (bcrypt, 10 rounds)
  • โœ… Google OAuth integration
  • โœ… HTTP-only secure cookies

API Security

  • โœ… CORS whitelist (only allowed origins)
  • โœ… Rate limiting (MongoDB-backed)
  • โœ… Input validation (all endpoints)
  • โœ… Helmet.js (CSP, HSTS, etc.)

Data Security

  • โœ… MongoDB encryption at rest
  • โœ… HTTPS in transit
  • โœ… No sensitive data in logs
  • โœ… Environment variables (no hardcoded secrets)

Authorization

  • โœ… Role-based access control (RBAC)
  • โœ… Resource-level checks (user can only edit own data)
  • โœ… Admin-only endpoints protected
  • โœ… Activity logging (optional)

๐Ÿ“Š Database Relationships

Users
  โ”œโ”€ has many Expenses (recordedBy)
  โ”œโ”€ has many Meals (createdBy)
  โ”œโ”€ has many Attendance records
  โ”œโ”€ has many Feedback
  โ””โ”€ has one MessConfig (createdBy - admin only)

Expenses
  โ””โ”€ belongs to User (recordedBy)

Meals
  โ”œโ”€ belongs to User (createdBy)
  โ””โ”€ has many Attendance records (implicit)

Attendance
  โ”œโ”€ belongs to User
  โ””โ”€ references Meals (implicit via date/mealType)

Feedback
  โ”œโ”€ belongs to User
  โ””โ”€ references Meals (implicit via date/mealType)

MessConfig
  โ””โ”€ belongs to Admin User (createdBy)

๐Ÿš€ Deployment Architecture

Frontend (Vercel)

GitHub Repository
    โ†“
Push to branch
    โ†“
Vercel detects change
    โ†“
Build: npm run build
    โ†“
Deploy to CDN
    โ†“
https://mess-walah.vercel.app (live)

Environment: - VITE_API_URL โ†’ Backend URL - VITE_GOOGLE_CLIENT_ID โ†’ Google OAuth config

Backend (Render)

GitHub Repository
    โ†“
Push to branch
    โ†“
Render detects change
    โ†“
Build: npm install
    โ†“
Start: node server.js
    โ†“
https://messwala-6jvj.onrender.com (live)

Environment: - MONGO_URI โ†’ Database connection - JWT_SECRET โ†’ Token signing key - NODE_ENV โ†’ Environment (production) - Other configs...

Database (MongoDB Atlas)

MongoDB Atlas Cluster
    โ†“
Network whitelist: 0.0.0.0/0
    โ†“
Database user with R/W access
    โ†“
Connection string: mongodb+srv://...
    โ†“
Hourly backups (Atlas)

๐Ÿ”„ Scaling Considerations

Horizontal Scaling

Future improvements: - Microservices for analytics - Message queue for async tasks - Cache layer (Redis) for frequent queries - Load balancer for multiple backend instances

Vertical Scaling

Current capacity: - Render free tier: ~5000 requests/hour - MongoDB free tier: 512MB storage - Suitable for: Single mess (10-100 members)

Upgrade path: - Paid Render plan: 100,000+ requests/hour - MongoDB paid: Unlimited storage - Suitable for: Multi-mess platform (1000+ members)


๐Ÿ› ๏ธ Development Workflow

Local Setup

# Backend
cd backend
npm install
npm run dev          # Starts on port 5000

# Frontend
cd frontend
npm install
npm run dev          # Starts on port 5173

# Database
# Use MongoDB Atlas (cloud) or local MongoDB
MONGO_URI=mongodb://localhost:27017/messwala

Code Deployment

Feature development on local
    โ†“
Push to feature branch
    โ†“
Create Pull Request
    โ†“
Review & test
    โ†“
Merge to main
    โ†“
CI/CD deploys automatically

๐Ÿ“ˆ Performance Metrics

Frontend

  • First Load: <2 seconds
  • Entry Point: 12 KB (gzipped)
  • Interactive: <3 seconds (LCP)

Backend

  • API Response: <100ms (average)
  • Database Query: <50ms (average)
  • p95 Response: <500ms

Database

  • Query Performance: Indexed collections
  • Backup: Daily snapshots
  • Uptime: 99.5% SLA (MongoDB Atlas)

๐Ÿ” Monitoring & Observability

Current: - Browser console logs - Server-side logging to stdout - Health endpoint: /api/health

Recommended future: - Sentry for error tracking - DataDog for metrics - ELK stack for log aggregation - NewRelic for APM


Last Updated: March 17, 2026
Version: 2.0