RE_Documents/RE_Workflow_Complete_Project_Setup.md

85 KiB

RE Workflow Management System - Complete Project Setup Guide

Non-Templatized Workflow System

Version: 1.0
Date: October 16, 2025
Technology Stack: Node.js 22 LTS + TypeScript 5.7 + React.js 19 (TSX) + PostgreSQL 16


Table of Contents

  1. System Architecture Overview
  2. Technology Matrix
  3. Project Folder Structure
  4. Backend Architecture
  5. Frontend Architecture
  6. Database Schema Design
  7. API Endpoints Structure
  8. Authentication & Security
  9. Configuration Management
  10. Deployment Architecture
  11. Development Setup Instructions

1. System Architecture Overview

High-Level Architecture

┌─────────────────────────────────────────────────────────────┐
│                     CLIENT LAYER                             │
│  React.js SPA (Single Page Application)                     │
│  - Material-UI / Ant Design Components                      │
│  - Redux Toolkit for State Management                       │
│  - React Router for Navigation                              │
└─────────────────────────────────────────────────────────────┘
                            ↕ HTTPS
┌─────────────────────────────────────────────────────────────┐
│                   API GATEWAY LAYER                          │
│  - SSO Authentication Bridge                                 │
│  - JWT Token Validation                                      │
│  - Rate Limiting & Request Throttling                        │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│               APPLICATION LAYER (Node.js)                    │
│  - Express.js REST API Server                               │
│  - Business Logic & Controllers                             │
│  - Service Layer (Workflow, Notification, Document)         │
│  - AI Integration (Conclusion Generation)                   │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│                   DATA LAYER (PostgreSQL)                    │
│  - Relational Database                                       │
│  - Stored Procedures & Functions                            │
│  - Triggers for Activity Logging                            │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│                   STORAGE LAYER                              │
│  - Cloud Storage (GCP Cloud Storage)                        │
│  - Document Repository                                       │
│  - Backup & Recovery System                                 │
└─────────────────────────────────────────────────────────────┘

2. Technology Matrix

Component Technology Version Purpose
Backend Runtime Node.js 22.x LTS Server-side JavaScript runtime
Backend Language TypeScript 5.7.x Type-safe backend development
Backend Framework Express.js 4.21.x RESTful API framework
Frontend Library React.js 19.0.x UI component library
Frontend Language TypeScript (TSX) 5.7.x Type-safe frontend development
UI Framework Material-UI (MUI) 6.3.x Component design system
State Management Redux Toolkit 2.5.x Application state management
Database PostgreSQL 16.x Primary relational database
ORM Sequelize + TypeScript 6.37.x Database ORM with TypeScript support
Authentication Passport.js 0.7.x SSO integration middleware
Validation Zod 3.24.x TypeScript-first schema validation
File Upload Multer 1.4.x Multipart file handling
Logging Winston 3.17.x Application logging
API Documentation Swagger/OpenAPI 3.1 API documentation
Testing (Backend) Jest + Supertest + ts-jest 29.x Unit & integration testing
Testing (Frontend) Jest + React Testing Library 16.x Component testing
Process Manager PM2 5.4.x Production process management
Build Tool Vite + ts-loader 6.x Module bundler with TypeScript
Code Quality ESLint + Prettier + TypeScript ESLint 9.x/3.x Code linting & formatting

3. Project Folder Structure

Repository Structure (Separate Repositories Approach)

This project uses separate repositories for frontend and backend, enabling:

  • Independent deployment pipelines
  • Better team ownership (Frontend team vs Backend team)
  • Technology-specific CI/CD workflows
  • Isolated version control and release cycles
  • Cleaner dependency management

Repository 1: Backend Repository (re-workflow-backend)

re-workflow-backend/
│
├── src/                              # Source code
│   ├── app.ts
│   ├── server.ts
│   ├── types/
│   ├── config/
│   ├── controllers/
│   ├── services/
│   ├── models/
│   ├── routes/
│   ├── middlewares/
│   ├── validators/
│   ├── utils/
│   ├── jobs/
│   └── seeders/
│
├── dist/                             # Compiled JavaScript output
│
├── tests/                            # Test suites
│   ├── unit/
│   ├── integration/
│   └── setup.ts
│
├── database/                         # Database Scripts & Migrations
│   ├── migrations/
│   ├── seeders/
│   ├── schema/
│   │   └── schema.sql
│   └── README.md
│
├── logs/                             # Application logs
│   ├── error.log
│   ├── combined.log
│   └── access.log
│
├── uploads/                          # Temporary upload directory
│   └── .gitkeep
│
├── docs/                             # API Documentation
│   ├── swagger/
│   └── postman/
│
├── scripts/                          # Deployment & Utility Scripts
│   ├── deploy.sh
│   ├── backup.sh
│   ├── setup.sh
│   └── seed-db.sh
│
├── .env.example                      # Environment variables template
├── .env.development
├── .env.production
├── .eslintrc.json
├── .prettierrc
├── .gitignore
├── .dockerignore
├── Dockerfile
├── docker-compose.yml                # For local development with DB
├── jest.config.js
├── tsconfig.json                     # TypeScript configuration
├── nodemon.json
├── package.json
├── package-lock.json
└── README.md

Repository 2: Frontend Repository (re-workflow-frontend)

re-workflow-frontend/
│
├── public/                           # Static assets
│   ├── index.html
│   ├── favicon.ico
│   ├── robots.txt
│   ├── manifest.json
│   └── assets/
│
├── src/                              # Source code
│   ├── index.tsx
│   ├── App.tsx
│   ├── App.css
│   ├── react-app-env.d.ts
│   ├── types/
│   ├── assets/
│   ├── components/
│   ├── pages/
│   ├── redux/
│   ├── services/
│   ├── hooks/
│   ├── utils/
│   ├── routes/
│   └── config/
│
├── dist/                             # Build output (Vite)
│
├── tests/                            # Test files
│   ├── components/
│   ├── pages/
│   ├── redux/
│   ├── services/
│   └── setup.ts
│
├── docs/                             # Component documentation
│   └── storybook/
│
├── nginx/                            # Nginx configuration for production
│   └── default.conf
│
├── .env.example                      # Environment variables template
├── .env.development
├── .env.production
├── .eslintrc.json
├── .prettierrc
├── .gitignore
├── .dockerignore
├── Dockerfile
├── vite.config.ts                    # Vite configuration
├── tsconfig.json                     # TypeScript configuration
├── package.json
├── package-lock.json
└── README.md

Shared Types Management

Since repositories are separate, shared TypeScript types (like Priority, WorkflowStatus, etc.) can be managed in two ways:

  • Maintain separate type definitions in each repository
  • Ensures complete independence and no cross-repository dependencies
  • Slight duplication but maximum flexibility

Option 2: Shared NPM Package

  • Create a private NPM package @re-workflow/types
  • Publish to private npm registry (GitHub Packages, npm private, Artifactory)
  • Import in both repositories: npm install @re-workflow/types
  • Example structure:
    @re-workflow/types/
    ├── src/
    │   ├── index.ts
    │   ├── user.types.ts
    │   ├── workflow.types.ts
    │   ├── approval.types.ts
    │   └── common.types.ts
    ├── package.json
    └── tsconfig.json
    

4. Backend Architecture

Complete Backend Folder Structure

backend/
│
├── src/
│   ├── app.ts                        # Express app initialization
│   ├── server.ts                     # Server entry point
│   │
│   ├── types/                        # TypeScript type definitions
│   │   ├── index.ts                  # Main types export
│   │   ├── express.d.ts              # Express type extensions
│   │   ├── user.types.ts             # User related types
│   │   ├── workflow.types.ts         # Workflow related types
│   │   ├── approval.types.ts         # Approval related types
│   │   ├── document.types.ts         # Document related types
│   │   ├── notification.types.ts     # Notification types
│   │   └── common.types.ts           # Common/shared types
│   │
│   ├── config/                       # Configuration files
│   │   ├── database.ts               # Database configuration
│   │   ├── jwt.ts                    # JWT configuration
│   │   ├── sso.ts                    # SSO Bridge configuration
│   │   ├── storage.ts                # Cloud storage config
│   │   ├── email.ts                  # Email service config
│   │   └── constants.ts              # Application constants
│   │
│   ├── controllers/                  # Request handlers
│   │   ├── auth.controller.ts
│   │   ├── workflow.controller.ts
│   │   ├── approval.controller.ts
│   │   ├── document.controller.ts
│   │   ├── notification.controller.ts
│   │   ├── workNote.controller.ts
│   │   ├── participant.controller.ts
│   │   ├── dashboard.controller.ts
│   │   └── user.controller.ts
│   │
│   ├── services/                     # Business logic layer
│   │   ├── auth.service.ts
│   │   ├── workflow.service.ts
│   │   ├── approval.service.ts
│   │   ├── tat.service.ts            # TAT calculation & monitoring
│   │   ├── notification.service.ts
│   │   ├── document.service.ts
│   │   ├── workNote.service.ts
│   │   ├── participant.service.ts
│   │   ├── activity.service.ts
│   │   ├── ai.service.ts             # AI conclusion generation
│   │   ├── email.service.ts
│   │   └── storage.service.ts        # Cloud storage operations
│   │
│   ├── models/                       # Sequelize models (ORM)
│   │   ├── index.ts                  # Model loader
│   │   ├── User.ts
│   │   ├── WorkflowRequest.ts
│   │   ├── ApprovalLevel.ts
│   │   ├── Approver.ts
│   │   ├── Participant.ts
│   │   ├── Spectator.ts
│   │   ├── Document.ts
│   │   ├── WorkNote.ts
│   │   ├── Activity.ts
│   │   ├── Notification.ts
│   │   ├── TATTracking.ts
│   │   └── ConclusionRemark.ts
│   │
│   ├── routes/                       # API route definitions
│   │   ├── index.ts                  # Route aggregator
│   │   ├── auth.routes.ts
│   │   ├── workflow.routes.ts
│   │   ├── approval.routes.ts
│   │   ├── document.routes.ts
│   │   ├── notification.routes.ts
│   │   ├── workNote.routes.ts
│   │   ├── participant.routes.ts
│   │   ├── dashboard.routes.ts
│   │   └── user.routes.ts
│   │
│   ├── middlewares/                  # Express middlewares
│   │   ├── auth.middleware.ts        # JWT verification
│   │   ├── sso.middleware.ts         # SSO validation
│   │   ├── validate.middleware.ts    # Request validation
│   │   ├── upload.middleware.ts      # File upload handling
│   │   ├── rateLimiter.middleware.ts # Rate limiting
│   │   ├── errorHandler.middleware.ts
│   │   ├── logger.middleware.ts
│   │   └── cors.middleware.ts
│   │
│   ├── validators/                   # Request validation schemas (Zod)
│   │   ├── auth.validator.ts
│   │   ├── workflow.validator.ts
│   │   ├── approval.validator.ts
│   │   ├── document.validator.ts
│   │   ├── workNote.validator.ts
│   │   └── participant.validator.ts
│   │
│   ├── utils/                        # Utility functions
│   │   ├── logger.ts                 # Winston logger setup
│   │   ├── responseHandler.ts        # Standardized API responses
│   │   ├── errorHandler.ts           # Custom error classes
│   │   ├── dateCalculator.ts         # TAT & date calculations
│   │   ├── fileValidator.ts          # File type & size validation
│   │   ├── emailTemplate.ts          # Email templates
│   │   └── helpers.ts                # General helper functions
│   │
│   ├── jobs/                         # Background jobs & schedulers
│   │   ├── tatMonitor.job.ts         # TAT monitoring cron job
│   │   ├── reminderSender.job.ts     # Automated reminder system
│   │   ├── dataCleanup.job.ts        # Old data cleanup
│   │   └── reportGenerator.job.ts    # Periodic reports
│   │
│   └── seeders/                      # Database seed data
│       ├── admin.seeder.ts
│       └── testData.seeder.ts
│
├── dist/                             # Compiled JavaScript output
│
├── tests/                            # Test suites
│   ├── unit/
│   │   ├── services/
│   │   ├── controllers/
│   │   └── utils/
│   ├── integration/
│   │   ├── api/
│   │   └── database/
│   └── setup.js
│
├── logs/                             # Application logs
│   ├── error.log
│   ├── combined.log
│   └── access.log
│
├── uploads/                          # Temporary upload directory
│   └── .gitkeep
│
├── .env.example                      # Environment variables template
├── .env.development
├── .env.production
├── .eslintrc.json
├── .prettierrc
├── jest.config.js
├── tsconfig.json                     # TypeScript configuration
├── nodemon.json
├── package.json
└── README.md

Key Backend Files Content Examples

backend/tsconfig.json

{
  "compilerOptions": {
    "target": "ES2021",
    "module": "commonjs",
    "lib": ["ES2021"],
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "moduleResolution": "node",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "types": ["node", "jest"],
    "typeRoots": ["./node_modules/@types", "./src/types"],
    "baseUrl": "./src",
    "paths": {
      "@/*": ["./*"],
      "@controllers/*": ["controllers/*"],
      "@services/*": ["services/*"],
      "@models/*": ["models/*"],
      "@middlewares/*": ["middlewares/*"],
      "@utils/*": ["utils/*"],
      "@types/*": ["types/*"],
      "@config/*": ["config/*"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist", "tests"]
}

backend/src/app.ts

import express, { Application, Request, Response } from 'express';
import helmet from 'helmet';
import cors from 'cors';
import morgan from 'morgan';
import routes from './routes';
import errorHandler from './middlewares/errorHandler.middleware';
import logger from './utils/logger';

const app: Application = express();

// Security middleware
app.use(helmet());
app.use(cors());

// Body parsing middleware
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));

// Logging middleware
app.use(morgan('combined', { stream: logger.stream }));

// API routes
app.use('/api/v1', routes);

// Health check endpoint
app.get('/health', (req: Request, res: Response) => {
  res.status(200).json({ status: 'OK', timestamp: new Date() });
});

// Error handling middleware (must be last)
app.use(errorHandler);

export default app;

backend/src/server.ts

import app from './app';
import { sequelize } from './models';
import logger from './utils/logger';

const PORT: number = parseInt(process.env.PORT || '5000', 10);

// Database connection and server start
const startServer = async (): Promise<void> => {
  try {
    // Test database connection
    await sequelize.authenticate();
    logger.info('Database connection established successfully');

    // Sync models (in development only)
    if (process.env.NODE_ENV === 'development') {
      await sequelize.sync({ alter: true });
      logger.info('Database models synchronized');
    }

    // Start server
    app.listen(PORT, () => {
      logger.info(`Server running on port ${PORT}`);
      logger.info(`Environment: ${process.env.NODE_ENV}`);
    });
  } catch (error) {
    logger.error('Unable to start server:', error);
    process.exit(1);
  }
};

// Graceful shutdown
process.on('SIGTERM', async () => {
  logger.info('SIGTERM signal received: closing HTTP server');
  await sequelize.close();
  process.exit(0);
});

startServer();

backend/src/types/express.d.ts

import { JwtPayload } from 'jsonwebtoken';

declare global {
  namespace Express {
    interface Request {
      user?: {
        userId: string;
        email: string;
        employeeId: string;
        role?: string;
      };
      file?: Express.Multer.File;
      files?: Express.Multer.File[];
    }
  }
}

backend/src/types/common.types.ts

export enum Priority {
  STANDARD = 'STANDARD',
  EXPRESS = 'EXPRESS'
}

export enum WorkflowStatus {
  DRAFT = 'DRAFT',
  PENDING = 'PENDING',
  IN_PROGRESS = 'IN_PROGRESS',
  APPROVED = 'APPROVED',
  REJECTED = 'REJECTED',
  CLOSED = 'CLOSED'
}

export enum ApprovalStatus {
  PENDING = 'PENDING',
  IN_PROGRESS = 'IN_PROGRESS',
  APPROVED = 'APPROVED',
  REJECTED = 'REJECTED',
  SKIPPED = 'SKIPPED'
}

export enum ParticipantType {
  SPECTATOR = 'SPECTATOR',
  INITIATOR = 'INITIATOR',
  APPROVER = 'APPROVER',
  CONSULTATION = 'CONSULTATION'
}

export enum TATStatus {
  ON_TRACK = 'ON_TRACK',
  APPROACHING = 'APPROACHING',
  BREACHED = 'BREACHED'
}

export interface ApiResponse<T = any> {
  success: boolean;
  message: string;
  data?: T;
  error?: string;
  timestamp: Date;
}

export interface PaginationParams {
  page: number;
  limit: number;
  sortBy?: string;
  sortOrder?: 'ASC' | 'DESC';
}

export interface PaginatedResponse<T> {
  data: T[];
  pagination: {
    page: number;
    limit: number;
    total: number;
    totalPages: number;
  };
}

5. Frontend Architecture

Complete Frontend Folder Structure

frontend/
│
├── public/
│   ├── index.html
│   ├── favicon.ico
│   ├── robots.txt
│   └── manifest.json
│
├── src/
│   ├── index.tsx                     # Application entry point
│   ├── App.tsx                       # Root component
│   ├── App.css
│   ├── react-app-env.d.ts            # React TypeScript declarations
│   │
│   ├── types/                        # TypeScript type definitions
│   │   ├── index.ts                  # Main types export
│   │   ├── user.types.ts             # User types
│   │   ├── workflow.types.ts         # Workflow types
│   │   ├── approval.types.ts         # Approval types
│   │   ├── document.types.ts         # Document types
│   │   ├── notification.types.ts     # Notification types
│   │   ├── common.types.ts           # Common types
│   │   └── api.types.ts              # API response types
│   │
│   ├── assets/                       # Static assets
│   │   ├── images/
│   │   ├── icons/
│   │   ├── fonts/
│   │   └── styles/
│   │       ├── global.css
│   │       ├── variables.css
│   │       └── theme.ts
│   │
│   ├── components/                   # Reusable components
│   │   ├── common/                   # Generic components
│   │   │   ├── Button/
│   │   │   │   ├── Button.tsx
│   │   │   │   ├── Button.module.css
│   │   │   │   ├── Button.types.ts
│   │   │   │   └── Button.test.tsx
│   │   │   ├── Input/
│   │   │   ├── Dropdown/
│   │   │   ├── Modal/
│   │   │   ├── Card/
│   │   │   ├── Table/
│   │   │   ├── Tabs/
│   │   │   ├── Pagination/
│   │   │   ├── Loader/
│   │   │   ├── Notification/
│   │   │   └── ErrorBoundary/
│   │   │
│   │   ├── layout/                   # Layout components
│   │   │   ├── Header/
│   │   │   │   ├── Header.tsx
│   │   │   │   ├── Header.module.css
│   │   │   │   └── Header.types.ts
│   │   │   ├── Sidebar/
│   │   │   ├── Footer/
│   │   │   ├── Navigation/
│   │   │   └── PageLayout/
│   │   │
│   │   ├── workflow/                 # Workflow-specific components
│   │   │   ├── TemplateSelector/
│   │   │   ├── BasicInformation/
│   │   │   ├── ApprovalWorkflow/
│   │   │   │   ├── ApprovalWorkflow.tsx
│   │   │   │   ├── ApproverLevel.tsx
│   │   │   │   ├── TATCalculator.tsx
│   │   │   │   ├── ApprovalSummary.tsx
│   │   │   │   └── types.ts
│   │   │   ├── ParticipantAccess/
│   │   │   │   ├── ParticipantAccess.tsx
│   │   │   │   ├── SpectatorList.tsx
│   │   │   │   ├── UserTagging.tsx
│   │   │   │   └── types.ts
│   │   │   ├── DocumentUpload/
│   │   │   │   ├── DocumentUpload.tsx
│   │   │   │   ├── FilePreview.tsx
│   │   │   │   ├── GoogleDocsLink.tsx
│   │   │   │   └── types.ts
│   │   │   ├── ReviewSubmit/
│   │   │   └── WizardStepper/
│   │   │
│   │   ├── request/                  # Request management components
│   │   │   ├── RequestCard/
│   │   │   ├── RequestList/
│   │   │   ├── RequestDetail/
│   │   │   │   ├── RequestOverview.tsx
│   │   │   │   ├── WorkflowTab.tsx
│   │   │   │   ├── DocumentTab.tsx
│   │   │   │   ├── ActivityTab.tsx
│   │   │   │   ├── TATProgressBar.tsx
│   │   │   │   └── types.ts
│   │   │   ├── StatusBadge/
│   │   │   └── PriorityIndicator/
│   │   │
│   │   ├── approval/                 # Approval action components
│   │   │   ├── ApprovalModal/
│   │   │   ├── RejectionModal/
│   │   │   ├── ApprovalHistory/
│   │   │   └── ConclusionRemark/
│   │   │
│   │   ├── workNote/                 # Work notes / chat components
│   │   │   ├── WorkNoteChat/
│   │   │   ├── MessageItem/
│   │   │   ├── MessageComposer/
│   │   │   ├── FileAttachment/
│   │   │   └── UserMention/
│   │   │
│   │   ├── notification/             # Notification components
│   │   │   ├── NotificationBell/
│   │   │   ├── NotificationList/
│   │   │   ├── NotificationItem/
│   │   │   └── NotificationSettings/
│   │   │
│   │   └── dashboard/                # Dashboard components
│   │       ├── DashboardCard/
│   │       ├── StatisticsWidget/
│   │       ├── RecentRequests/
│   │       └── QuickActions/
│   │
│   ├── pages/                        # Page components (routes)
│   │   ├── Auth/
│   │   │   ├── Login.tsx
│   │   │   └── SSOCallback.tsx
│   │   ├── Dashboard/
│   │   │   └── Dashboard.tsx
│   │   ├── CreateRequest/
│   │   │   └── CreateRequest.tsx
│   │   ├── MyRequests/
│   │   │   └── MyRequests.tsx
│   │   ├── OpenRequests/
│   │   │   └── OpenRequests.tsx
│   │   ├── ClosedRequests/
│   │   │   └── ClosedRequests.tsx
│   │   ├── RequestDetail/
│   │   │   └── RequestDetail.tsx
│   │   ├── NotFound/
│   │   │   └── NotFound.tsx
│   │   └── Unauthorized/
│   │       └── Unauthorized.tsx
│   │
│   ├── redux/                        # Redux state management
│   │   ├── store.ts                  # Redux store configuration
│   │   ├── hooks.ts                  # Typed Redux hooks
│   │   ├── slices/
│   │   │   ├── authSlice.ts
│   │   │   ├── workflowSlice.ts
│   │   │   ├── approvalSlice.ts
│   │   │   ├── notificationSlice.ts
│   │   │   ├── documentSlice.ts
│   │   │   ├── workNoteSlice.ts
│   │   │   ├── participantSlice.ts
│   │   │   └── uiSlice.ts
│   │   └── middleware/
│   │       └── apiMiddleware.ts
│   │
│   ├── services/                     # API service layer
│   │   ├── api.ts                    # Axios instance configuration
│   │   ├── auth.service.ts
│   │   ├── workflow.service.ts
│   │   ├── approval.service.ts
│   │   ├── document.service.ts
│   │   ├── notification.service.ts
│   │   ├── workNote.service.ts
│   │   ├── participant.service.ts
│   │   ├── dashboard.service.ts
│   │   └── user.service.ts
│   │
│   ├── hooks/                        # Custom React hooks
│   │   ├── useAuth.ts
│   │   ├── useWorkflow.ts
│   │   ├── useNotification.ts
│   │   ├── useDebounce.ts
│   │   ├── useInfiniteScroll.ts
│   │   ├── useLocalStorage.ts
│   │   └── useWebSocket.ts
│   │
│   ├── utils/                        # Utility functions
│   │   ├── constants.ts
│   │   ├── validators.ts
│   │   ├── formatters.ts
│   │   ├── dateUtils.ts
│   │   ├── fileUtils.ts
│   │   ├── errorHandler.ts
│   │   └── helpers.ts
│   │
│   ├── routes/                       # React Router configuration
│   │   ├── AppRoutes.tsx
│   │   ├── PrivateRoute.tsx
│   │   └── PublicRoute.tsx
│   │
│   └── config/                       # Frontend configuration
│       ├── api.config.ts
│       ├── theme.config.ts
│       └── constants.config.ts
│
├── tests/                            # Test files
│   ├── components/
│   ├── pages/
│   ├── redux/
│   ├── services/
│   └── setup.js
│
├── .env.example
├── .env.development
├── .env.production
├── .eslintrc.json
├── .prettierrc
├── jest.config.js
├── tsconfig.json                     # TypeScript configuration
├── package.json
└── README.md

Key Frontend Files Content Examples

frontend/tsconfig.json

{
  "compilerOptions": {
    "target": "ES2020",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "jsx": "react-jsx",
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "allowJs": true,
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "allowSyntheticDefaultImports": true,
    "isolatedModules": true,
    "noEmit": true,
    "baseUrl": "./src",
    "paths": {
      "@/*": ["./*"],
      "@components/*": ["components/*"],
      "@pages/*": ["pages/*"],
      "@services/*": ["services/*"],
      "@redux/*": ["redux/*"],
      "@hooks/*": ["hooks/*"],
      "@utils/*": ["utils/*"],
      "@types/*": ["types/*"],
      "@config/*": ["config/*"],
      "@assets/*": ["assets/*"]
    }
  },
  "include": ["src"],
  "exclude": ["node_modules", "build", "dist"]
}

frontend/src/types/common.types.ts

export enum Priority {
  STANDARD = 'STANDARD',
  EXPRESS = 'EXPRESS'
}

export enum WorkflowStatus {
  DRAFT = 'DRAFT',
  PENDING = 'PENDING',
  IN_PROGRESS = 'IN_PROGRESS',
  APPROVED = 'APPROVED',
  REJECTED = 'REJECTED',
  CLOSED = 'CLOSED'
}

export interface ApiResponse<T = any> {
  success: boolean;
  message: string;
  data?: T;
  error?: string;
  timestamp: string;
}

export interface PaginatedResponse<T> {
  data: T[];
  pagination: {
    page: number;
    limit: number;
    total: number;
    totalPages: number;
  };
}

frontend/src/redux/hooks.ts

import { useDispatch, useSelector } from 'react-redux';
import type { TypedUseSelectorHook } from 'react-redux';
import type { RootState, AppDispatch } from './store';

// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch: () => AppDispatch = useDispatch;
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;

frontend/src/redux/store.ts

import { configureStore } from '@reduxjs/toolkit';
import authReducer from './slices/authSlice';
import workflowReducer from './slices/workflowSlice';
import approvalReducer from './slices/approvalSlice';
import notificationReducer from './slices/notificationSlice';
import documentReducer from './slices/documentSlice';
import workNoteReducer from './slices/workNoteSlice';
import participantReducer from './slices/participantSlice';
import uiReducer from './slices/uiSlice';

export const store = configureStore({
  reducer: {
    auth: authReducer,
    workflow: workflowReducer,
    approval: approvalReducer,
    notification: notificationReducer,
    document: documentReducer,
    workNote: workNoteReducer,
    participant: participantReducer,
    ui: uiReducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        ignoredActions: ['persist/PERSIST'],
      },
    }),
});

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

6. Database Schema Design

Complete PostgreSQL Database Schema

-- ============================================
-- RE WORKFLOW MANAGEMENT SYSTEM DATABASE SCHEMA
-- PostgreSQL 16.x
-- ============================================

-- Extension for UUID generation
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- ============================================
-- TABLE: users
-- Stores user information from SSO
-- ============================================
CREATE TABLE users (
    user_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    employee_id VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    display_name VARCHAR(255),
    department VARCHAR(100),
    designation VARCHAR(100),
    phone VARCHAR(20),
    profile_picture_url VARCHAR(500),
    is_active BOOLEAN DEFAULT TRUE,
    last_login TIMESTAMP WITH TIME ZONE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_employee_id ON users(employee_id);
CREATE INDEX idx_users_active ON users(is_active);

-- ============================================
-- TABLE: workflow_requests
-- Main table for workflow requests
-- ============================================
CREATE TABLE workflow_requests (
    request_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_number VARCHAR(50) UNIQUE NOT NULL, -- REQ-2025-00001
    initiator_id UUID NOT NULL REFERENCES users(user_id),
    template_type VARCHAR(50) DEFAULT 'CUSTOM', -- CUSTOM, TEMPLATE (future)
    title VARCHAR(500) NOT NULL,
    description TEXT NOT NULL,
    priority VARCHAR(20) NOT NULL CHECK (priority IN ('STANDARD', 'EXPRESS')),
    status VARCHAR(50) NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'PENDING', 'IN_PROGRESS', 'APPROVED', 'REJECTED', 'CLOSED')),
    current_level INTEGER DEFAULT 1,
    total_levels INTEGER NOT NULL,
    total_tat_hours DECIMAL(10,2) NOT NULL, -- Total TAT in hours
    tat_start_date TIMESTAMP WITH TIME ZONE,
    tat_end_date TIMESTAMP WITH TIME ZONE,
    submission_date TIMESTAMP WITH TIME ZONE,
    closure_date TIMESTAMP WITH TIME ZONE,
    conclusion_remark TEXT,
    is_draft BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_workflow_requests_initiator ON workflow_requests(initiator_id);
CREATE INDEX idx_workflow_requests_status ON workflow_requests(status);
CREATE INDEX idx_workflow_requests_priority ON workflow_requests(priority);
CREATE INDEX idx_workflow_requests_number ON workflow_requests(request_number);
CREATE INDEX idx_workflow_requests_submission_date ON workflow_requests(submission_date);

-- ============================================
-- TABLE: approval_levels
-- Defines approval hierarchy levels
-- ============================================
CREATE TABLE approval_levels (
    level_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    level_number INTEGER NOT NULL,
    level_name VARCHAR(255),
    approver_id UUID NOT NULL REFERENCES users(user_id),
    tat_hours DECIMAL(10,2) NOT NULL, -- TAT for this level in hours
    tat_days INTEGER, -- TAT in days (calculated)
    status VARCHAR(50) DEFAULT 'PENDING' CHECK (status IN ('PENDING', 'IN_PROGRESS', 'APPROVED', 'REJECTED', 'SKIPPED')),
    level_start_time TIMESTAMP WITH TIME ZONE,
    level_end_time TIMESTAMP WITH TIME ZONE,
    action_date TIMESTAMP WITH TIME ZONE,
    comments TEXT,
    is_final_approver BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(request_id, level_number)
);

CREATE INDEX idx_approval_levels_request ON approval_levels(request_id);
CREATE INDEX idx_approval_levels_approver ON approval_levels(approver_id);
CREATE INDEX idx_approval_levels_status ON approval_levels(status);
CREATE INDEX idx_approval_levels_level_number ON approval_levels(request_id, level_number);

-- ============================================
-- TABLE: participants
-- Stores spectators and other participants
-- ============================================
CREATE TABLE participants (
    participant_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    user_id UUID NOT NULL REFERENCES users(user_id),
    participant_type VARCHAR(50) NOT NULL CHECK (participant_type IN ('SPECTATOR', 'INITIATOR', 'APPROVER', 'CONSULTATION')),
    can_comment BOOLEAN DEFAULT TRUE,
    can_view_documents BOOLEAN DEFAULT TRUE,
    added_by UUID REFERENCES users(user_id),
    added_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(request_id, user_id, participant_type)
);

CREATE INDEX idx_participants_request ON participants(request_id);
CREATE INDEX idx_participants_user ON participants(user_id);
CREATE INDEX idx_participants_type ON participants(participant_type);

-- ============================================
-- TABLE: documents
-- Stores document metadata
-- ============================================
CREATE TABLE documents (
    document_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    uploaded_by UUID NOT NULL REFERENCES users(user_id),
    file_name VARCHAR(500) NOT NULL,
    file_type VARCHAR(100) NOT NULL,
    file_size BIGINT NOT NULL, -- in bytes
    file_path VARCHAR(1000) NOT NULL, -- Cloud storage path
    storage_url VARCHAR(1000), -- Public accessible URL
    mime_type VARCHAR(100),
    is_google_doc BOOLEAN DEFAULT FALSE,
    google_doc_url VARCHAR(1000),
    is_deleted BOOLEAN DEFAULT FALSE,
    version INTEGER DEFAULT 1,
    uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_documents_request ON documents(request_id);
CREATE INDEX idx_documents_uploaded_by ON documents(uploaded_by);
CREATE INDEX idx_documents_deleted ON documents(is_deleted);

-- ============================================
-- TABLE: work_notes
-- Chat/communication within workflow
-- ============================================
CREATE TABLE work_notes (
    note_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    user_id UUID NOT NULL REFERENCES users(user_id),
    message TEXT NOT NULL,
    is_priority BOOLEAN DEFAULT FALSE,
    has_attachment BOOLEAN DEFAULT FALSE,
    mentioned_users UUID[], -- Array of user IDs mentioned
    reactions JSONB, -- Store reactions as JSON {emoji: [user_ids]}
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_work_notes_request ON work_notes(request_id);
CREATE INDEX idx_work_notes_user ON work_notes(user_id);
CREATE INDEX idx_work_notes_created ON work_notes(created_at DESC);

-- ============================================
-- TABLE: work_note_attachments
-- Attachments in work notes
-- ============================================
CREATE TABLE work_note_attachments (
    attachment_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    note_id UUID NOT NULL REFERENCES work_notes(note_id) ON DELETE CASCADE,
    file_name VARCHAR(500) NOT NULL,
    file_type VARCHAR(100) NOT NULL,
    file_size BIGINT NOT NULL,
    file_path VARCHAR(1000) NOT NULL,
    storage_url VARCHAR(1000),
    uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_work_note_attachments_note ON work_note_attachments(note_id);

-- ============================================
-- TABLE: activities
-- Activity log for all actions
-- ============================================
CREATE TABLE activities (
    activity_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    user_id UUID REFERENCES users(user_id), -- NULL for system events
    activity_type VARCHAR(100) NOT NULL, -- CREATED, APPROVED, REJECTED, COMMENT_ADDED, etc.
    activity_description TEXT NOT NULL,
    metadata JSONB, -- Additional data as JSON
    is_system_event BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_activities_request ON activities(request_id);
CREATE INDEX idx_activities_user ON activities(user_id);
CREATE INDEX idx_activities_type ON activities(activity_type);
CREATE INDEX idx_activities_created ON activities(created_at DESC);

-- ============================================
-- TABLE: notifications
-- User notifications
-- ============================================
CREATE TABLE notifications (
    notification_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users(user_id),
    request_id UUID REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    notification_type VARCHAR(100) NOT NULL, -- APPROVAL_REQUEST, COMMENT_MENTION, TAT_WARNING, etc.
    title VARCHAR(500) NOT NULL,
    message TEXT NOT NULL,
    is_read BOOLEAN DEFAULT FALSE,
    priority VARCHAR(20) DEFAULT 'NORMAL' CHECK (priority IN ('LOW', 'NORMAL', 'HIGH', 'URGENT')),
    action_url VARCHAR(500),
    metadata JSONB,
    read_at TIMESTAMP WITH TIME ZONE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_notifications_user ON notifications(user_id);
CREATE INDEX idx_notifications_request ON notifications(request_id);
CREATE INDEX idx_notifications_read ON notifications(is_read);
CREATE INDEX idx_notifications_created ON notifications(created_at DESC);

-- ============================================
-- TABLE: tat_tracking
-- TAT monitoring and alerts
-- ============================================
CREATE TABLE tat_tracking (
    tracking_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    level_id UUID REFERENCES approval_levels(level_id) ON DELETE CASCADE,
    tat_status VARCHAR(50) NOT NULL CHECK (tat_status IN ('ON_TRACK', 'APPROACHING', 'BREACHED')),
    percentage_used DECIMAL(5,2), -- Percentage of TAT used
    remaining_hours DECIMAL(10,2),
    alert_sent BOOLEAN DEFAULT FALSE,
    alert_sent_at TIMESTAMP WITH TIME ZONE,
    checked_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_tat_tracking_request ON tat_tracking(request_id);
CREATE INDEX idx_tat_tracking_level ON tat_tracking(level_id);
CREATE INDEX idx_tat_tracking_status ON tat_tracking(tat_status);

-- ============================================
-- TABLE: conclusion_remarks
-- AI-generated and edited conclusions
-- ============================================
CREATE TABLE conclusion_remarks (
    conclusion_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    request_id UUID UNIQUE NOT NULL REFERENCES workflow_requests(request_id) ON DELETE CASCADE,
    ai_generated_remark TEXT,
    final_remark TEXT NOT NULL,
    edited_by UUID REFERENCES users(user_id),
    is_edited BOOLEAN DEFAULT FALSE,
    generated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    finalized_at TIMESTAMP WITH TIME ZONE
);

CREATE INDEX idx_conclusion_remarks_request ON conclusion_remarks(request_id);

-- ============================================
-- TABLE: audit_logs
-- System audit trail
-- ============================================
CREATE TABLE audit_logs (
    audit_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID REFERENCES users(user_id),
    action VARCHAR(255) NOT NULL,
    entity_type VARCHAR(100) NOT NULL, -- REQUEST, DOCUMENT, USER, etc.
    entity_id UUID NOT NULL,
    old_values JSONB,
    new_values JSONB,
    ip_address VARCHAR(50),
    user_agent TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_audit_logs_user ON audit_logs(user_id);
CREATE INDEX idx_audit_logs_entity ON audit_logs(entity_type, entity_id);
CREATE INDEX idx_audit_logs_created ON audit_logs(created_at DESC);

-- ============================================
-- TABLE: system_settings
-- Application configuration
-- ============================================
CREATE TABLE system_settings (
    setting_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    setting_key VARCHAR(255) UNIQUE NOT NULL,
    setting_value TEXT NOT NULL,
    setting_type VARCHAR(50) NOT NULL, -- STRING, NUMBER, BOOLEAN, JSON
    description TEXT,
    is_editable BOOLEAN DEFAULT TRUE,
    updated_by UUID REFERENCES users(user_id),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- ============================================
-- FUNCTIONS AND TRIGGERS
-- ============================================

-- Function to update updated_at timestamp
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$$ language 'plpgsql';

-- Apply trigger to relevant tables
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

CREATE TRIGGER update_workflow_requests_updated_at BEFORE UPDATE ON workflow_requests
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

CREATE TRIGGER update_approval_levels_updated_at BEFORE UPDATE ON approval_levels
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

-- Function to auto-generate request number
CREATE OR REPLACE FUNCTION generate_request_number()
RETURNS TRIGGER AS $$
DECLARE
    year_part VARCHAR(4);
    sequence_num INTEGER;
    new_number VARCHAR(50);
BEGIN
    year_part := TO_CHAR(CURRENT_DATE, 'YYYY');
    
    SELECT COALESCE(MAX(CAST(SUBSTRING(request_number FROM 10) AS INTEGER)), 0) + 1
    INTO sequence_num
    FROM workflow_requests
    WHERE request_number LIKE 'REQ-' || year_part || '-%';
    
    new_number := 'REQ-' || year_part || '-' || LPAD(sequence_num::TEXT, 5, '0');
    NEW.request_number := new_number;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER generate_request_number_trigger
    BEFORE INSERT ON workflow_requests
    FOR EACH ROW
    WHEN (NEW.request_number IS NULL)
    EXECUTE FUNCTION generate_request_number();

-- Function to log activities automatically
CREATE OR REPLACE FUNCTION log_activity()
RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP = 'INSERT' THEN
        INSERT INTO activities (request_id, user_id, activity_type, activity_description, is_system_event)
        VALUES (NEW.request_id, NEW.initiator_id, 'REQUEST_CREATED', 'Workflow request created', TRUE);
    ELSIF TG_OP = 'UPDATE' THEN
        IF OLD.status != NEW.status THEN
            INSERT INTO activities (request_id, activity_type, activity_description, is_system_event, metadata)
            VALUES (NEW.request_id, 'STATUS_CHANGED', 'Request status changed from ' || OLD.status || ' to ' || NEW.status, TRUE,
                    jsonb_build_object('old_status', OLD.status, 'new_status', NEW.status));
        END IF;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER log_workflow_activity
    AFTER INSERT OR UPDATE ON workflow_requests
    FOR EACH ROW
    EXECUTE FUNCTION log_activity();

-- ============================================
-- VIEWS FOR REPORTING
-- ============================================

-- View: Active requests with current approver
CREATE VIEW vw_active_requests AS
SELECT 
    wr.request_id,
    wr.request_number,
    wr.title,
    wr.priority,
    wr.status,
    wr.current_level,
    wr.total_levels,
    u_initiator.display_name as initiator_name,
    u_initiator.department,
    al.approver_id as current_approver_id,
    u_approver.display_name as current_approver_name,
    wr.submission_date,
    wr.total_tat_hours,
    EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - al.level_start_time))/3600 as elapsed_hours,
    al.tat_hours - EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - al.level_start_time))/3600 as remaining_hours
FROM workflow_requests wr
LEFT JOIN users u_initiator ON wr.initiator_id = u_initiator.user_id
LEFT JOIN approval_levels al ON wr.request_id = al.request_id AND al.level_number = wr.current_level
LEFT JOIN users u_approver ON al.approver_id = u_approver.user_id
WHERE wr.status IN ('PENDING', 'IN_PROGRESS');

-- View: User notification summary
CREATE VIEW vw_user_notifications AS
SELECT 
    n.user_id,
    COUNT(*) as total_notifications,
    COUNT(*) FILTER (WHERE NOT n.is_read) as unread_count,
    COUNT(*) FILTER (WHERE n.priority = 'HIGH' OR n.priority = 'URGENT') as high_priority_count
FROM notifications n
GROUP BY n.user_id;

-- ============================================
-- INITIAL DATA SEEDING
-- ============================================

-- Insert default system settings
INSERT INTO system_settings (setting_key, setting_value, setting_type, description) VALUES
('TAT_REMINDER_THRESHOLD_1', '50', 'NUMBER', 'First TAT reminder at 50% usage'),
('TAT_REMINDER_THRESHOLD_2', '80', 'NUMBER', 'Second TAT reminder at 80% usage'),
('TAT_BREACH_THRESHOLD', '100', 'NUMBER', 'TAT breach alert at 100% usage'),
('MAX_FILE_SIZE_MB', '10', 'NUMBER', 'Maximum file upload size in MB'),
('MAX_APPROVAL_LEVELS', '10', 'NUMBER', 'Maximum number of approval levels'),
('NOTIFICATION_CLEANUP_DAYS', '90', 'NUMBER', 'Clean up read notifications after N days'),
('ENABLE_EMAIL_NOTIFICATIONS', 'true', 'BOOLEAN', 'Enable email notifications');

-- ============================================
-- INDEXES FOR PERFORMANCE OPTIMIZATION
-- ============================================

-- Additional composite indexes
CREATE INDEX idx_workflow_requests_status_priority ON workflow_requests(status, priority);
CREATE INDEX idx_approval_levels_request_level ON approval_levels(request_id, level_number);
CREATE INDEX idx_notifications_user_read ON notifications(user_id, is_read);
CREATE INDEX idx_activities_request_created ON activities(request_id, created_at DESC);

-- Full-text search indexes
CREATE INDEX idx_workflow_requests_title_search ON workflow_requests USING gin(to_tsvector('english', title));
CREATE INDEX idx_workflow_requests_description_search ON workflow_requests USING gin(to_tsvector('english', description));

-- ============================================
-- DATABASE COMMENTS
-- ============================================

COMMENT ON TABLE workflow_requests IS 'Main table storing all workflow requests';
COMMENT ON TABLE approval_levels IS 'Hierarchical approval levels for each request';
COMMENT ON TABLE participants IS 'Spectators and other non-approver participants';
COMMENT ON TABLE documents IS 'Document metadata and storage references';
COMMENT ON TABLE work_notes IS 'Internal communication and notes';
COMMENT ON TABLE activities IS 'Audit trail of all request activities';
COMMENT ON TABLE notifications IS 'User notifications and alerts';
COMMENT ON TABLE tat_tracking IS 'TAT monitoring and threshold alerts';

7. API Endpoints Structure

Complete REST API Specification

Base URL: http://api.re-workflow.com/api/v1

7.1 Authentication APIs

POST   /auth/login                    # SSO login initiation
POST   /auth/callback                 # SSO callback handler
POST   /auth/logout                   # User logout
GET    /auth/me                       # Get current user details
POST   /auth/refresh                  # Refresh JWT token

7.2 Workflow Management APIs

GET    /workflows                     # Get all workflows (with filters)
POST   /workflows                     # Create new workflow request
GET    /workflows/:id                 # Get workflow details
PUT    /workflows/:id                 # Update workflow (draft only)
DELETE /workflows/:id                 # Delete workflow (draft only)
PATCH  /workflows/:id/submit          # Submit workflow for approval
PATCH  /workflows/:id/close           # Close workflow with conclusion

# Filtered lists
GET    /workflows/my-requests         # Initiator's requests
GET    /workflows/open                # Open/pending requests
GET    /workflows/closed              # Closed requests
GET    /workflows/assigned-to-me     # Requests assigned to current user

7.3 Approval APIs

GET    /workflows/:id/approvals       # Get approval hierarchy
POST   /workflows/:id/approvals       # Add new approver to workflow
PATCH  /workflows/:id/approvals/:levelId/approve    # Approve request
PATCH  /workflows/:id/approvals/:levelId/reject     # Reject request
GET    /workflows/:id/approvals/current              # Get current level info

7.4 Participant APIs

GET    /workflows/:id/participants    # Get all participants
POST   /workflows/:id/participants    # Add participant (spectator)
DELETE /workflows/:id/participants/:participantId    # Remove participant
GET    /workflows/:id/spectators      # Get spectators only

7.5 Document APIs

GET    /workflows/:id/documents       # Get all documents
POST   /workflows/:id/documents       # Upload document
GET    /documents/:documentId         # Get document details
GET    /documents/:documentId/download # Download document
DELETE /documents/:documentId         # Delete document
GET    /documents/:documentId/preview # Preview document (PDF/images)

7.6 Work Notes APIs

GET    /workflows/:id/work-notes      # Get all work notes
POST   /workflows/:id/work-notes      # Add work note
PUT    /work-notes/:noteId            # Update work note
DELETE /work-notes/:noteId            # Delete work note
POST   /work-notes/:noteId/reactions  # Add reaction to note
POST   /work-notes/:noteId/attachments # Add attachment to note

7.7 Activity Log APIs

GET    /workflows/:id/activities      # Get activity timeline
GET    /workflows/:id/activities/:type # Filter by activity type

7.8 Notification APIs

GET    /notifications                 # Get user notifications
GET    /notifications/unread          # Get unread notifications
PATCH  /notifications/:id/read        # Mark as read
PATCH  /notifications/mark-all-read   # Mark all as read
DELETE /notifications/:id             # Delete notification

7.9 TAT Tracking APIs

GET    /workflows/:id/tat             # Get TAT status
GET    /tat/breached                  # Get breached TAT requests
GET    /tat/approaching               # Get approaching deadline requests

7.10 Dashboard APIs

GET    /dashboard/stats               # Get dashboard statistics
GET    /dashboard/recent              # Get recent activities
GET    /dashboard/pending-actions     # Get pending actions count

7.11 User Management APIs

GET    /users                         # Get all active users (for tagging)
GET    /users/search                  # Search users by name/email
GET    /users/:id                     # Get user details
GET    /users/:id/requests            # Get user's requests

7.12 Conclusion APIs

POST   /workflows/:id/conclusion/generate   # Generate AI conclusion
PUT    /workflows/:id/conclusion            # Update conclusion
GET    /workflows/:id/conclusion            # Get conclusion

8. Authentication & Security

8.1 SSO Integration Architecture

// backend/src/config/sso.ts
export interface SSOConfig {
  ssoProvider: string;
  authorizationURL: string;
  tokenURL: string;
  userInfoURL: string;
  clientID: string;
  clientSecret: string;
  callbackURL: string;
  scope: string[];
  sessionSecret: string;
  jwtSecret: string;
  jwtExpiry: string;
  refreshTokenExpiry: string;
}

const ssoConfig: SSOConfig = {
  ssoProvider: 'RE_SSO_BRIDGE',
  authorizationURL: process.env.SSO_AUTHORIZATION_URL || '',
  tokenURL: process.env.SSO_TOKEN_URL || '',
  userInfoURL: process.env.SSO_USERINFO_URL || '',
  clientID: process.env.SSO_CLIENT_ID || '',
  clientSecret: process.env.SSO_CLIENT_SECRET || '',
  callbackURL: process.env.SSO_CALLBACK_URL || '',
  scope: ['openid', 'profile', 'email'],
  sessionSecret: process.env.SESSION_SECRET || '',
  jwtSecret: process.env.JWT_SECRET || '',
  jwtExpiry: '24h',
  refreshTokenExpiry: '7d'
};

export default ssoConfig;

8.2 Security Measures

Security Layer Implementation
Transport Security HTTPS/TLS 1.3
Authentication SSO + JWT tokens
Authorization Role-based access control (RBAC)
Password Encryption bcrypt (cost factor 12)
Token Storage HTTP-only cookies + Local storage
CSRF Protection CSRF tokens on state-changing operations
XSS Protection Input sanitization + Content Security Policy
SQL Injection Parameterized queries (Sequelize ORM)
Rate Limiting Express rate limiter (100 req/15min)
File Upload Security Type validation, size limits, virus scanning
Audit Logging All actions logged with user context
Data Encryption At-rest (database) and in-transit (TLS)

9. Configuration Management

9.1 Backend Environment Variables

# backend/.env.example

# Application
NODE_ENV=development
PORT=5000
API_VERSION=v1
BASE_URL=http://localhost:5000

# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME=re_workflow_db
DB_USER=workflow_user
DB_PASSWORD=secure_password
DB_SSL=false
DB_POOL_MIN=2
DB_POOL_MAX=10

# SSO Configuration
SSO_AUTHORIZATION_URL=https://sso.royalenfield.com/oauth/authorize
SSO_TOKEN_URL=https://sso.royalenfield.com/oauth/token
SSO_USERINFO_URL=https://sso.royalenfield.com/oauth/userinfo
SSO_CLIENT_ID=re_workflow_client
SSO_CLIENT_SECRET=your_sso_client_secret
SSO_CALLBACK_URL=http://localhost:5000/api/v1/auth/callback

# JWT Configuration
JWT_SECRET=your_jwt_secret_key_here_min_32_chars
JWT_EXPIRY=24h
REFRESH_TOKEN_SECRET=your_refresh_token_secret_here
REFRESH_TOKEN_EXPIRY=7d

# Session
SESSION_SECRET=your_session_secret_here_min_32_chars

# Cloud Storage (GCP)
GCP_PROJECT_ID=re-workflow-project
GCP_BUCKET_NAME=re-workflow-documents
GCP_KEY_FILE=./config/gcp-key.json

# Email Service (Optional)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=notifications@royalenfield.com
SMTP_PASSWORD=your_smtp_password
EMAIL_FROM=RE Workflow System <notifications@royalenfield.com>

# AI Service (for conclusion generation)
AI_API_KEY=your_ai_api_key
AI_MODEL=gpt-4
AI_MAX_TOKENS=500

# Logging
LOG_LEVEL=info
LOG_FILE_PATH=./logs

# CORS
CORS_ORIGIN=http://localhost:3000

# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100

# File Upload
MAX_FILE_SIZE_MB=10
ALLOWED_FILE_TYPES=pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif

# TAT Monitoring
TAT_CHECK_INTERVAL_MINUTES=30
TAT_REMINDER_THRESHOLD_1=50
TAT_REMINDER_THRESHOLD_2=80

9.2 Frontend Environment Variables

# frontend/.env.example

# Application
REACT_APP_ENV=development
REACT_APP_NAME=RE Workflow Management
REACT_APP_VERSION=1.0.0

# API Configuration
REACT_APP_API_BASE_URL=http://localhost:5000/api/v1
REACT_APP_API_TIMEOUT=30000

# SSO Configuration
REACT_APP_SSO_LOGIN_URL=http://localhost:5000/api/v1/auth/login
REACT_APP_SSO_LOGOUT_URL=http://localhost:5000/api/v1/auth/logout

# Feature Flags
REACT_APP_ENABLE_NOTIFICATIONS=true
REACT_APP_ENABLE_EMAIL_NOTIFICATIONS=false
REACT_APP_ENABLE_ANALYTICS=true

# File Upload
REACT_APP_MAX_FILE_SIZE_MB=10
REACT_APP_ALLOWED_FILE_TYPES=pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif

# Google Integration
REACT_APP_GOOGLE_API_KEY=your_google_api_key

# UI Configuration
REACT_APP_THEME_PRIMARY_COLOR=#1976d2
REACT_APP_ITEMS_PER_PAGE=20

10. Deployment Architecture

10.1 Infrastructure on GCP

Since we have separate repositories, each repo has its own Docker configuration. For local development, you can use docker-compose in the backend repository to run the full stack.


10.1.1 Backend Repository - Docker Compose (re-workflow-backend/docker-compose.yml)

This file runs the full stack for local development:

# re-workflow-backend/docker-compose.yml
# For local development - runs backend + database

version: '3.8'

services:
  # PostgreSQL Database
  postgres:
    image: postgres:16-alpine
    container_name: re_workflow_db
    environment:
      POSTGRES_USER: ${DB_USER:-workflow_user}
      POSTGRES_PASSWORD: ${DB_PASSWORD:-secure_password}
      POSTGRES_DB: ${DB_NAME:-re_workflow_db}
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./database/schema:/docker-entrypoint-initdb.d
    networks:
      - re_workflow_network
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-workflow_user}"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Backend API
  backend:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: re_workflow_backend
    environment:
      NODE_ENV: development
      DB_HOST: postgres
      DB_PORT: 5432
      DB_USER: ${DB_USER:-workflow_user}
      DB_PASSWORD: ${DB_PASSWORD:-secure_password}
      DB_NAME: ${DB_NAME:-re_workflow_db}
      PORT: 5000
    ports:
      - "5000:5000"
    depends_on:
      postgres:
        condition: service_healthy
    volumes:
      - ./logs:/app/logs
      - ./uploads:/app/uploads
    networks:
      - re_workflow_network
    restart: unless-stopped

volumes:
  postgres_data:

networks:
  re_workflow_network:
    driver: bridge

10.1.2 Production Docker Compose (Optional - For coordinated deployment)

If you need to deploy both services together using docker-compose, create this in a separate deployment repository or infrastructure folder:

# infrastructure/docker-compose.prod.yml
# For production deployment with separate repositories

version: '3.8'

services:
  # PostgreSQL Database
  postgres:
    image: postgres:16-alpine
    container_name: re_workflow_db
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - re_workflow_network
    restart: unless-stopped

  # Backend API (from separate repo/registry)
  backend:
    image: gcr.io/re-project/re-workflow-backend:latest
    container_name: re_workflow_backend
    environment:
      NODE_ENV: production
      DB_HOST: postgres
    ports:
      - "5000:5000"
    depends_on:
      - postgres
    volumes:
      - backend_logs:/app/logs
      - backend_uploads:/app/uploads
    networks:
      - re_workflow_network
    restart: unless-stopped

  # Frontend (from separate repo/registry)
  frontend:
    image: gcr.io/re-project/re-workflow-frontend:latest
    container_name: re_workflow_frontend
    environment:
      REACT_APP_API_BASE_URL: http://backend:5000/api/v1
    ports:
      - "3000:80"
    depends_on:
      - backend
    networks:
      - re_workflow_network
    restart: unless-stopped

  # Nginx Reverse Proxy
  nginx:
    image: nginx:alpine
    container_name: re_workflow_nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - backend
      - frontend
    networks:
      - re_workflow_network
    restart: unless-stopped

volumes:
  postgres_data:
  backend_logs:
  backend_uploads:

networks:
  re_workflow_network:
    driver: bridge

10.2 Backend Repository Dockerfile (re-workflow-backend/Dockerfile)

# re-workflow-backend/Dockerfile

FROM node:22-alpine AS builder

WORKDIR /app

# Copy package files
COPY package*.json ./
COPY tsconfig.json ./

# Install all dependencies (including devDependencies for build)
RUN npm ci

# Copy source code
COPY src ./src

# Build TypeScript to JavaScript
RUN npm run build

# =====================================
# Production Image
# =====================================
FROM node:22-alpine

WORKDIR /app

# Install PM2 globally
RUN npm install -g pm2

# Copy package files
COPY package*.json ./

# Install only production dependencies
RUN npm ci --only=production

# Copy compiled JavaScript from builder
COPY --from=builder /app/dist ./dist

# Create logs and uploads directories
RUN mkdir -p logs uploads

# Expose port
EXPOSE 5000

# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
  CMD node -e "require('http').get('http://localhost:5000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"

# Start with PM2
CMD ["pm2-runtime", "start", "dist/server.js", "--name", "re-workflow-api"]

10.3 Frontend Repository Dockerfile (re-workflow-frontend/Dockerfile)

# re-workflow-frontend/Dockerfile

FROM node:22-alpine AS builder

WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci

# Copy source code
COPY . .

# Build application with Vite
RUN npm run build

# =====================================
# Production Image with Nginx
# =====================================
FROM nginx:alpine

# Copy custom nginx config
COPY nginx/default.conf /etc/nginx/conf.d/default.conf

# Copy built files from builder (Vite outputs to 'dist' by default)
COPY --from=builder /app/dist /usr/share/nginx/html

# Expose port
EXPOSE 80

# Health check
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1

CMD ["nginx", "-g", "daemon off;"]

10.4 CI/CD Pipeline Strategy (Separate Repositories)

Backend CI/CD (GitHub Actions / GitLab CI)

# .github/workflows/backend-deploy.yml

name: Backend CI/CD

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test-and-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          
      - name: Install dependencies
        run: npm ci
        
      - name: Run linter
        run: npm run lint
        
      - name: Run tests
        run: npm test
        
      - name: Build TypeScript
        run: npm run build
        
      - name: Build Docker image
        run: docker build -t gcr.io/re-project/re-workflow-backend:${{ github.sha }} .
        
      - name: Push to GCR
        run: docker push gcr.io/re-project/re-workflow-backend:${{ github.sha }}

Frontend CI/CD (GitHub Actions / GitLab CI)

# .github/workflows/frontend-deploy.yml

name: Frontend CI/CD

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test-and-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          
      - name: Install dependencies
        run: npm ci
        
      - name: Run linter
        run: npm run lint
        
      - name: Run tests
        run: npm test
        
      - name: Build application
        run: npm run build
        
      - name: Build Docker image
        run: docker build -t gcr.io/re-project/re-workflow-frontend:${{ github.sha }} .
        
      - name: Push to GCR
        run: docker push gcr.io/re-project/re-workflow-frontend:${{ github.sha }}

11. Development Setup Instructions

11.1 Prerequisites

  • Node.js: v22.x LTS
  • PostgreSQL: v16.x
  • npm: v10.x or higher
  • TypeScript: v5.7.x (installed globally or as dev dependency)
  • Git: Latest version
  • Docker & Docker Compose (Optional, for containerized setup)
  • GCP Account (for cloud storage in production)

11.2 Local Development Setup (Separate Repositories)

Since we have two separate repositories, you'll need to clone and set up both:


BACKEND SETUP

Step 1: Clone Backend Repository

git clone https://github.com/royalenfield/re-workflow-backend.git
cd re-workflow-backend

Step 2: Setup Database

# Install PostgreSQL (if not installed)
# For Ubuntu/Debian:
# sudo apt-get install postgresql-16

# For macOS:
# brew install postgresql@16

# Create database
createdb re_workflow_db

# Or using psql:
psql -U postgres
CREATE DATABASE re_workflow_db;
\q

# Run schema
psql -U postgres -d re_workflow_db -f database/schema/schema.sql

Step 3: Configure Backend Environment

# Copy environment file
cp .env.example .env

# Edit .env with your configurations
nano .env  # or use your preferred editor

# Required variables:
# - Database credentials
# - JWT secrets
# - SSO configuration
# - GCP storage keys

Step 4: Install Dependencies & Run Backend

# Install dependencies
npm install

# Run TypeScript type checking
npm run type-check

# Run migrations (if using Sequelize CLI)
npx sequelize-cli db:migrate

# Seed data (optional)
npx sequelize-cli db:seed:all

# Start development server (with hot reload)
npm run dev

# Backend will run on: http://localhost:5000
# API Documentation: http://localhost:5000/api-docs

FRONTEND SETUP

Step 1: Clone Frontend Repository

# In a new terminal window/tab
git clone https://github.com/royalenfield/re-workflow-frontend.git
cd re-workflow-frontend

Step 2: Configure Frontend Environment

# Copy environment file
cp .env.example .env

# Edit .env with backend API URL
nano .env

# Set REACT_APP_API_BASE_URL=http://localhost:5000/api/v1

Step 3: Install Dependencies & Run Frontend

# Install dependencies
npm install

# Run TypeScript type checking
npm run type-check

# Start development server (Vite with hot reload)
npm run dev

# Frontend will run on: http://localhost:3000

Step 4: Access Application


11.3 Docker Setup (Alternative - Backend Repository)

The backend repository includes a docker-compose.yml that runs both database and backend:

# From backend repository root
cd re-workflow-backend

# Copy environment file
cp .env.example .env

# Edit .env if needed
nano .env

# Build and start services (backend + PostgreSQL)
docker-compose up --build -d

# Check logs
docker-compose logs -f

# Access backend: http://localhost:5000

# Stop services
docker-compose down

# Stop and remove volumes (clean state)
docker-compose down -v

For frontend Docker setup:

# From frontend repository root
cd re-workflow-frontend

# Copy environment file
cp .env.example .env

# Build Docker image
docker build -t re-workflow-frontend .

# Run frontend container
docker run -d -p 3000:80 --name frontend re-workflow-frontend

# Access frontend: http://localhost:3000

# Stop container
docker stop frontend
docker rm frontend

11.4 Running Tests (Separate Repositories)

Backend Tests

# From backend repository
cd re-workflow-backend

npm test                  # Run all tests (Jest + ts-jest)
npm run test:unit         # Unit tests only
npm run test:integration  # Integration tests only
npm run test:watch        # Watch mode for development
npm run test:coverage     # With coverage report

# Coverage report will be in: coverage/
# View HTML report: open coverage/lcov-report/index.html

Frontend Tests

# From frontend repository
cd re-workflow-frontend

npm test                  # Run all tests (Vitest)
npm run test:ui           # Interactive UI mode (Vitest)
npm run test:coverage     # With coverage report

# Coverage report will be in: coverage/

11.5 Code Quality Checks (Separate Repositories)

Backend Code Quality

# From backend repository
cd re-workflow-backend

npm run lint              # ESLint check (TypeScript rules)
npm run lint:fix          # Auto-fix issues
npm run format            # Prettier formatting
npm run type-check        # TypeScript type checking only (no compilation)

# Run all quality checks together
npm run lint && npm run type-check && npm test

Frontend Code Quality

# From frontend repository
cd re-workflow-frontend

npm run lint              # ESLint check (React + TypeScript rules)
npm run lint:fix          # Auto-fix issues
npm run format            # Prettier formatting
npm run type-check        # TypeScript type checking only (no build)

# Run all quality checks together
npm run lint && npm run type-check && npm test

11.6 Git Workflow (Separate Repositories)

Each repository should follow standard Git workflow:

# Feature branch workflow
git checkout -b feature/your-feature-name
git add .
git commit -m "feat: add your feature description"
git push origin feature/your-feature-name

# Create Pull Request on GitHub/GitLab
# After approval and merge:
git checkout main
git pull origin main

Branch Strategy:

  • main - Production-ready code
  • develop - Integration branch for features
  • feature/* - New features
  • bugfix/* - Bug fixes
  • hotfix/* - Production hotfixes
  • release/* - Release preparation

Commit Message Convention (Conventional Commits):

  • feat: - New feature
  • fix: - Bug fix
  • docs: - Documentation changes
  • style: - Code style changes (formatting)
  • refactor: - Code refactoring
  • test: - Test additions or changes
  • chore: - Build process or tool changes

12. Additional Documentation Files

Package.json Files

backend/package.json

{
  "name": "re-workflow-backend",
  "version": "1.0.0",
  "description": "Royal Enfield Workflow Management System - Backend API (TypeScript)",
  "main": "dist/server.js",
  "scripts": {
    "start": "node dist/server.js",
    "dev": "nodemon --exec ts-node src/server.ts",
    "build": "tsc",
    "build:watch": "tsc --watch",
    "start:prod": "NODE_ENV=production node dist/server.js",
    "test": "jest --coverage",
    "test:unit": "jest --testPathPattern=tests/unit",
    "test:integration": "jest --testPathPattern=tests/integration",
    "test:watch": "jest --watch",
    "lint": "eslint src/**/*.ts",
    "lint:fix": "eslint src/**/*.ts --fix",
    "format": "prettier --write \"src/**/*.ts\"",
    "type-check": "tsc --noEmit",
    "db:migrate": "sequelize-cli db:migrate",
    "db:migrate:undo": "sequelize-cli db:migrate:undo",
    "db:seed": "sequelize-cli db:seed:all",
    "clean": "rm -rf dist"
  },
  "dependencies": {
    "express": "^4.21.2",
    "pg": "^8.13.1",
    "pg-hstore": "^2.3.4",
    "sequelize": "^6.37.5",
    "bcryptjs": "^2.4.3",
    "jsonwebtoken": "^9.0.2",
    "passport": "^0.7.0",
    "passport-jwt": "^4.0.1",
    "zod": "^3.24.1",
    "multer": "^1.4.5-lts.1",
    "winston": "^3.17.0",
    "cors": "^2.8.5",
    "helmet": "^8.0.0",
    "dotenv": "^16.4.7",
    "express-rate-limit": "^7.5.0",
    "morgan": "^1.10.0",
    "@google-cloud/storage": "^7.14.0",
    "axios": "^1.7.9",
    "node-cron": "^3.0.3"
  },
  "devDependencies": {
    "@types/express": "^5.0.0",
    "@types/node": "^22.10.5",
    "@types/bcryptjs": "^2.4.6",
    "@types/jsonwebtoken": "^9.0.7",
    "@types/passport": "^1.0.16",
    "@types/passport-jwt": "^4.0.1",
    "@types/multer": "^1.4.12",
    "@types/cors": "^2.8.17",
    "@types/morgan": "^1.9.9",
    "@types/jest": "^29.5.14",
    "@types/supertest": "^6.0.2",
    "typescript": "^5.7.2",
    "ts-node": "^10.9.2",
    "ts-node-dev": "^2.0.0",
    "nodemon": "^3.1.9",
    "jest": "^29.7.0",
    "ts-jest": "^29.2.5",
    "supertest": "^7.0.0",
    "eslint": "^9.17.0",
    "@typescript-eslint/eslint-plugin": "^8.19.1",
    "@typescript-eslint/parser": "^8.19.1",
    "prettier": "^3.4.2",
    "sequelize-cli": "^6.6.2",
    "sequelize-typescript": "^2.1.7"
  },
  "engines": {
    "node": ">=22.0.0",
    "npm": ">=10.0.0"
  }
}

frontend/package.json

{
  "name": "re-workflow-frontend",
  "version": "1.0.0",
  "description": "Royal Enfield Workflow Management System - Frontend (TypeScript)",
  "private": true,
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0",
    "react-router-dom": "^7.1.1",
    "@reduxjs/toolkit": "^2.5.0",
    "react-redux": "^9.2.0",
    "@mui/material": "^6.3.0",
    "@mui/icons-material": "^6.3.0",
    "@emotion/react": "^11.14.0",
    "@emotion/styled": "^11.14.0",
    "axios": "^1.7.9",
    "formik": "^2.4.6",
    "yup": "^1.6.3",
    "zod": "^3.24.1",
    "react-dropzone": "^14.3.5",
    "date-fns": "^4.1.0",
    "recharts": "^2.15.0",
    "react-toastify": "^11.0.2"
  },
  "devDependencies": {
    "@types/react": "^19.0.6",
    "@types/react-dom": "^19.0.2",
    "@types/node": "^22.10.5",
    "typescript": "^5.7.2",
    "vite": "^6.0.7",
    "@vitejs/plugin-react": "^4.3.4",
    "@testing-library/react": "^16.1.0",
    "@testing-library/jest-dom": "^6.6.3",
    "@testing-library/user-event": "^14.5.2",
    "eslint": "^9.17.0",
    "@typescript-eslint/eslint-plugin": "^8.19.1",
    "@typescript-eslint/parser": "^8.19.1",
    "prettier": "^3.4.2",
    "vitest": "^2.1.8"
  },
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview",
    "test": "vitest",
    "test:ui": "vitest --ui",
    "test:coverage": "vitest --coverage",
    "lint": "eslint src/**/*.{ts,tsx}",
    "lint:fix": "eslint src/**/*.{ts,tsx} --fix",
    "format": "prettier --write \"src/**/*.{ts,tsx,css}\"",
    "type-check": "tsc --noEmit"
  },
  "eslintConfig": {
    "extends": ["react-app", "react-app/jest"]
  },
  "browserslist": {
    "production": [">0.2%", "not dead", "not op_mini all"],
    "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"]
  },
  "engines": {
    "node": ">=22.0.0",
    "npm": ">=10.0.0"
  }
}

Summary

This comprehensive project setup guide provides:

Complete Architecture - System layers, components, and interactions
Separate Repository Structure - Independent backend and frontend repositories for better scalability
TypeScript Integration - Full TypeScript support for backend (Node.js + TS) and frontend (React + TSX)
Independent Deployment - Separate CI/CD pipelines for frontend and backend
Folder Structure - Detailed backend and frontend organization with TypeScript conventions
Type Safety - Comprehensive type definitions, interfaces, and enums for all entities
Database Schema - Full PostgreSQL schema with tables, indexes, triggers, views
API Specification - RESTful endpoints for all features with TypeScript types
Security Implementation - SSO, JWT, encryption, audit trails
Configuration Management - Environment variables and settings with type safety
Deployment Architecture - Docker, docker-compose, GCP deployment with TS compilation
Development Setup - Step-by-step installation and configuration for separate repositories
Testing Strategy - Unit, integration, and E2E testing with ts-jest (backend) and Vitest (frontend)
Code Quality - ESLint with TypeScript parser, Prettier, and best practices
Git Workflow - Branch strategy and commit conventions for both repositories

TypeScript Benefits:

🎯 Type Safety - Catch errors at compile time, not runtime
🎯 Better IDE Support - Enhanced autocomplete, refactoring, and navigation
🎯 Self-Documenting Code - Types serve as inline documentation
🎯 Reduced Bugs - Strong typing prevents common JavaScript errors
🎯 Improved Maintainability - Easier refactoring and code understanding
🎯 Enterprise-Ready - Industry standard for large-scale applications

TypeScript Configuration Highlights:

  • Backend: Strict mode enabled with comprehensive type checking (TypeScript 5.7)
  • Frontend: React 19 + TypeScript with path aliases for clean imports
  • Validation: Zod 3.24 for runtime type validation (TypeScript-first)
  • ORM: Sequelize 6.37 with TypeScript support for type-safe database operations
  • Redux: Fully typed Redux Toolkit 2.5 slices and hooks
  • Build Process: Vite 6.0 for lightning-fast frontend builds and hot-reload
  • Testing: Vitest 2.1 for frontend, ts-jest 29.2 for backend

Latest Package Updates (December 2024):

🔥 React 19.0 - Latest stable version with improved performance and new features
Vite 6.0 - Ultra-fast build tool replacing webpack/CRA for better DX
🎯 TypeScript 5.7 - Latest TypeScript with improved type inference
🚀 Node.js 22 LTS - Latest LTS release with enhanced performance
🗄️ PostgreSQL 16 - Latest stable database with improved query performance
📦 Redux Toolkit 2.5 - Simplified state management with RTK Query
🎨 Material-UI 6.3 - Latest MUI with improved theming and components
🔒 Helmet 8.0 - Latest security middleware
ESLint 9 - Latest linting with flat config support

Separate Repository Benefits:

🚀 Independent Deployment - Deploy frontend and backend separately without affecting each other
👥 Team Ownership - Clear boundaries between frontend and backend teams
🔄 CI/CD Flexibility - Technology-specific pipelines and build processes
📦 Version Control - Independent versioning and release cycles
🛠️ Technology Freedom - Easier to upgrade or change technologies independently
🔒 Security - Better access control and permissions management
Scalability - Scale frontend and backend independently based on load

Next Steps:

  1. Repository Setup:

    • Create re-workflow-backend repository on GitHub/GitLab
    • Create re-workflow-frontend repository on GitHub/GitLab
    • Set up branch protection rules for both repositories
  2. Development Environment:

    • Install Node.js 22 LTS + TypeScript 5.7
    • Install PostgreSQL 16
    • Configure development tools (VS Code, ESLint, Prettier)
  3. Backend Repository Initialization:

    • Clone backend repository
    • Initialize package.json with latest dependencies
    • Set up folder structure as per document
    • Configure TypeScript (tsconfig.json)
    • Set up database schema and migrations
    • Configure SSO integration
  4. Frontend Repository Initialization:

    • Clone frontend repository
    • Initialize package.json with React 19 + Vite 6
    • Set up folder structure as per document
    • Configure TypeScript (tsconfig.json)
    • Set up Redux Toolkit and Material-UI
  5. CI/CD Pipeline Setup:

    • Configure GitHub Actions or GitLab CI for backend
    • Configure GitHub Actions or GitLab CI for frontend
    • Set up Docker build and push to GCR
    • Configure automated testing in pipelines
  6. Development Phase:

    • Backend API development with TypeScript 5.7
    • Frontend components with React 19 + TSX
    • Integration testing between frontend and backend
    • Implement security measures (SSO, JWT, RBAC)
  7. Cloud Infrastructure:

    • Set up GCP project
    • Configure Cloud SQL (PostgreSQL 16)
    • Set up Cloud Storage for documents
    • Configure Cloud Run or Kubernetes for deployment
  8. Testing & QA:

    • Unit tests (backend: Jest, frontend: Vitest)
    • Integration tests
    • End-to-end tests
    • Security testing
    • Load testing
  9. Deployment:

    • Deploy backend to QA environment
    • Deploy frontend to QA environment
    • User acceptance testing
    • Production deployment with monitoring
  10. Monitoring & Maintenance:

    • Set up application monitoring (Cloud Monitoring)
    • Configure log aggregation
    • Set up alerts and notifications
    • Regular security updates

Document Version: 1.2 (Separate Repositories - Latest Packages - December 2024)
Last Updated: October 16, 2025
Prepared By: .NET Expert Team
Architecture: Separate Repositories (Microservices Ready)
Technology Stack: Node.js 22 LTS + TypeScript 5.7 + React 19 (TSX) + PostgreSQL 16
Repository Structure: re-workflow-backend + re-workflow-frontend (Independent)
Status: Ready for Implementation - All Packages Updated to Latest Stable Versions