# Royal Enfield Workflow Management System - Backend A comprehensive backend API for the Royal Enfield Workflow Management System built with Node.js, TypeScript, Express.js, and PostgreSQL. ## Features - **Frontend SSO Integration**: Handles user authentication via frontend SSO - **JWT Authentication**: Secure token-based authentication with refresh tokens - **User Management**: Create and update users based on SSO data - **Workflow Management**: Complete workflow request lifecycle - **Approval System**: Multi-level approval workflow - **Document Management**: File upload and management - **Notification System**: Real-time notifications - **TAT Tracking**: Turnaround time monitoring - **Audit Logging**: Comprehensive activity tracking - **RESTful API**: Well-structured API endpoints ## Technology Stack - **Runtime**: Node.js 22 LTS - **Language**: TypeScript 5.7 - **Framework**: Express.js 4.21 - **Database**: PostgreSQL 16 - **ORM**: Sequelize 6.37 - **Authentication**: JWT + Frontend SSO - **Validation**: Zod - **Logging**: Winston - **Testing**: Jest + Supertest - **Process Manager**: PM2 ## Quick Start ### Prerequisites - Node.js 22.x LTS - PostgreSQL 16.x - npm 10.x or higher ### Installation 1. **Clone the repository** ```bash git clone cd re-workflow-backend ``` 2. **Install dependencies** ```bash npm install ``` 3. **Setup environment** **Option A: Automated Setup (Recommended - Unix/Linux/Mac)** ```bash chmod +x setup-env.sh ./setup-env.sh # Follow the interactive prompts # The script will generate secure secrets automatically ``` **Option B: Manual Setup (Windows or Custom Configuration)** ```bash cp env.example .env # Edit .env with your configuration # Generate JWT secrets manually: # openssl rand -base64 32 | tr -d "=+/" | cut -c1-32 ``` 4. **Setup database** ```bash # Create database createdb re_workflow_db # Run schema psql -U postgres -d re_workflow_db -f database/schema/schema.sql ``` 5. **Start development server** ```bash npm run dev ``` The API will be available at `http://localhost:5000` ### Docker Setup ```bash # Setup environment (use automated script or manual) # Option 1: Automated (if running on Unix/Linux/Mac host) chmod +x setup-env.sh ./setup-env.sh # Option 2: Manual cp env.example .env # Edit .env with your configuration # Start services docker-compose up --build -d # Check logs docker-compose logs -f ``` **Note:** Ensure your `.env` file is properly configured before starting Docker containers. ## API Endpoints ### Base URL All API endpoints are prefixed with `/api/v1` unless otherwise specified. ### Authentication & Authorization - `GET /health` - API health status (no auth required) - `GET /api/v1/config` - Get public system configuration (no auth required) ### Authentication Endpoints (`/api/v1/auth`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `POST` | `/token-exchange` | Token exchange for localhost development | No | | `POST` | `/sso-callback` | SSO callback from frontend | No | | `POST` | `/refresh` | Refresh access token | No | | `GET` | `/me` | Get current user profile | Yes | | `GET` | `/validate` | Validate authentication token | Yes | | `POST` | `/logout` | Logout user and clear cookies | Optional | ### Workflow Management (`/api/v1/workflows`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/` | List all workflows | Yes | | `GET` | `/my` | List workflows created by current user | Yes | | `GET` | `/open-for-me` | List workflows open for current user | Yes | | `GET` | `/closed-by-me` | List workflows closed by current user | Yes | | `POST` | `/` | Create new workflow | Yes | | `POST` | `/multipart` | Create workflow with file uploads | Yes | | `GET` | `/:id` | Get workflow by ID | Yes | | `GET` | `/:id/details` | Get detailed workflow information | Yes | | `PUT` | `/:id` | Update workflow | Yes | | `PUT` | `/:id/multipart` | Update workflow with file uploads | Yes | | `PATCH` | `/:id/submit` | Submit workflow for approval | Yes | ### Approval Management (`/api/v1/workflows`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/:id/approvals` | Get all approval levels for workflow | Yes | | `GET` | `/:id/approvals/current` | Get current approval level | Yes | | `PATCH` | `/:id/approvals/:levelId/approve` | Approve at specific level | Yes (Approver) | | `PATCH` | `/:id/approvals/:levelId/reject` | Reject at specific level | Yes (Approver) | | `POST` | `/:id/approvals/:levelId/skip` | Skip approver at level | Yes (Initiator/Approver) | | `POST` | `/:id/approvers/at-level` | Add approver at specific level | Yes (Initiator/Approver) | ### Participants Management (`/api/v1/workflows`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `POST` | `/:id/participants/approver` | Add approver to workflow | Yes | | `POST` | `/:id/participants/spectator` | Add spectator to workflow | Yes | ### Work Notes (`/api/v1/workflows`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/:id/work-notes` | Get all work notes for workflow | Yes | | `POST` | `/:id/work-notes` | Create work note with attachments | Yes | | `GET` | `/work-notes/attachments/:attachmentId/preview` | Preview work note attachment | Yes | | `GET` | `/work-notes/attachments/:attachmentId/download` | Download work note attachment | Yes | ### Document Management (`/api/v1/workflows` & `/api/v1/documents`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/workflows/documents/:documentId/preview` | Preview workflow document | Yes | | `GET` | `/workflows/documents/:documentId/download` | Download workflow document | Yes | | `POST` | `/documents` | Upload document (multipart/form-data) | Yes | ### Activities & Notifications (`/api/v1/workflows`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/:id/activity` | Get activity log for workflow | Yes | | `POST` | `/notifications/subscribe` | Subscribe to push notifications | Yes | | `POST` | `/notifications/test` | Send test push notification | Yes | ### User Management (`/api/v1/users`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/search?q=` | Search users by email or name | Yes | | `POST` | `/ensure` | Ensure user exists (create if not) | Yes | ### Dashboard & Analytics (`/api/v1/dashboard`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/kpis` | Get KPI summary (all KPI cards) | Yes | | `GET` | `/stats/requests` | Get detailed request statistics | Yes | | `GET` | `/stats/tat-efficiency` | Get TAT efficiency metrics | Yes | | `GET` | `/stats/approver-load` | Get approver load statistics | Yes | | `GET` | `/stats/engagement` | Get engagement & quality metrics | Yes | | `GET` | `/stats/ai-insights` | Get AI & closure insights | Yes | | `GET` | `/stats/ai-remark-utilization` | Get AI remark utilization with trends | Yes | | `GET` | `/stats/approver-performance` | Get approver performance metrics | Yes | | `GET` | `/stats/by-department` | Get department-wise summary | Yes | | `GET` | `/stats/priority-distribution` | Get priority distribution | Yes | | `GET` | `/activity/recent` | Get recent activity feed | Yes | | `GET` | `/requests/critical` | Get high priority/critical requests | Yes | | `GET` | `/deadlines/upcoming` | Get upcoming deadlines | Yes | | `GET` | `/reports/lifecycle` | Get Request Lifecycle Report | Yes | | `GET` | `/reports/activity-log` | Get enhanced User Activity Log Report | Yes | | `GET` | `/reports/workflow-aging` | Get Workflow Aging Report | Yes | ### Notifications (`/api/v1/notifications`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/?page=&limit=&unreadOnly=` | Get user's notifications (paginated) | Yes | | `GET` | `/unread-count` | Get unread notification count | Yes | | `PATCH` | `/:notificationId/read` | Mark notification as read | Yes | | `POST` | `/mark-all-read` | Mark all notifications as read | Yes | | `DELETE` | `/:notificationId` | Delete notification | Yes | ### TAT (Turnaround Time) Monitoring (`/api/v1/tat`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/alerts/request/:requestId` | Get all TAT alerts for a request | Yes | | `GET` | `/alerts/level/:levelId` | Get TAT alerts for a specific level | Yes | | `GET` | `/compliance/summary?startDate=&endDate=` | Get TAT compliance summary | Yes | | `GET` | `/breaches` | Get TAT breach report | Yes | | `GET` | `/performance/:approverId` | Get TAT performance for approver | Yes | ### AI & Conclusion Management (`/api/v1/conclusions` & `/api/v1/ai`) | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `POST` | `/conclusions/:requestId/generate` | Generate AI-powered conclusion remark | Yes (Initiator) | | `PUT` | `/conclusions/:requestId` | Update conclusion remark | Yes (Initiator) | | `POST` | `/conclusions/:requestId/finalize` | Finalize conclusion and close request | Yes (Initiator) | | `GET` | `/conclusions/:requestId` | Get conclusion for a request | Yes | | `GET` | `/ai/status` | Get AI service status | Yes (Admin) | | `POST` | `/ai/reinitialize` | Reinitialize AI service | Yes (Admin) | ### Admin Management (`/api/v1/admin`) **All admin routes require authentication and admin role.** #### Holiday Management | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/holidays?year=` | Get all holidays (optional year filter) | | `GET` | `/holidays/calendar/:year` | Get holiday calendar for specific year | | `POST` | `/holidays` | Create new holiday | | `PUT` | `/holidays/:holidayId` | Update holiday | | `DELETE` | `/holidays/:holidayId` | Delete (deactivate) holiday | | `POST` | `/holidays/bulk-import` | Bulk import holidays from CSV/JSON | #### Configuration Management | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/configurations?category=` | Get all admin configurations | | `PUT` | `/configurations/:configKey` | Update configuration value | | `POST` | `/configurations/:configKey/reset` | Reset configuration to default | #### User Role Management (RBAC) | Method | Endpoint | Description | |--------|----------|-------------| | `POST` | `/users/assign-role` | Assign role to user by email | | `PUT` | `/users/:userId/role` | Update user's role | | `GET` | `/users/by-role?role=` | Get users filtered by role | | `GET` | `/users/role-statistics` | Get count of users in each role | ### Debug Endpoints (`/api/v1/debug`) **Note:** Debug endpoints are for development/testing purposes. | Method | Endpoint | Description | Auth Required | |--------|----------|-------------|---------------| | `GET` | `/tat-jobs/:requestId` | Check scheduled TAT jobs for request | No | | `GET` | `/tat-jobs` | Check all queued TAT jobs | No | | `POST` | `/tat-calculate` | Calculate TAT times (debug) | No | | `GET` | `/queue-status` | Check queue and worker status | No | | `POST` | `/trigger-test-tat` | Manually trigger test TAT job | No | ## Environment Variables ### Quick Setup Options 1. **Automated Setup (Recommended)** ```bash chmod +x setup-env.sh ./setup-env.sh ``` The script will: - Guide you through all required configuration - Automatically generate secure JWT and session secrets - Provide VAPID key generation instructions for web push notifications - Create a properly formatted `.env` file 2. **Manual Setup** - Copy `env.example` to `.env` - Fill in all required values - Generate secrets using: ```bash openssl rand -base64 32 | tr -d "=+/" | cut -c1-32 ``` ### Required Environment Variables #### Application Configuration - `NODE_ENV` - Environment (development/production) - `PORT` - Server port (default: 5000) - `BASE_URL` - Backend deployed URL - `FRONTEND_URL` - Frontend URL for CORS #### Database Configuration - `DB_HOST` - PostgreSQL host (default: localhost) - `DB_PORT` - PostgreSQL port (default: 5432) - `DB_NAME` - Database name (default: re_workflow_db) - `DB_USER` - Database user - `DB_PASSWORD` - Database password #### Authentication & Security - `JWT_SECRET` - JWT signing secret (min 32 characters, auto-generated by setup script) - `JWT_EXPIRY` - JWT expiration time (default: 24h) - `REFRESH_TOKEN_SECRET` - Refresh token secret (auto-generated by setup script) - `REFRESH_TOKEN_EXPIRY` - Refresh token expiration (default: 7d) - `SESSION_SECRET` - Session secret (min 32 characters, auto-generated by setup script) #### SSO Configuration (Okta) - `OKTA_DOMAIN` - Okta domain URL - `OKTA_CLIENT_ID` - Okta application client ID - `OKTA_CLIENT_SECRET` - Okta application client secret - `OKTA_API_TOKEN` - Okta API token (optional, for user management) #### Web Push Notifications (VAPID) - `VAPID_PUBLIC_KEY` - VAPID public key for web push - `VAPID_PRIVATE_KEY` - VAPID private key for web push - `VAPID_CONTACT` - Contact email (format: mailto:admin@example.com) **To generate VAPID keys:** ```bash npx web-push generate-vapid-keys ``` The setup script provides detailed instructions, or run: ```bash ./setup-env.sh # Select option 2 for VAPID key generation instructions ``` #### Redis Configuration (TAT Queue) - `REDIS_URL` - Redis connection URL (default: redis://localhost:6379) #### Optional Services **Email Service (SMTP)** - `SMTP_HOST` - SMTP server host - `SMTP_PORT` - SMTP port (default: 587) - `SMTP_SECURE` - Use TLS (default: false) - `SMTP_USER` - SMTP username - `SMTP_PASSWORD` - SMTP password - `EMAIL_FROM` - Sender email address **Cloud Storage (GCP)** - `GCP_PROJECT_ID` - Google Cloud Project ID - `GCP_BUCKET_NAME` - GCS bucket name - `GCP_KEY_FILE` - Path to GCP service account key file **AI Service (Claude)** - `CLAUDE_MODEL` - Claude model name (default: claude-sonnet-4-20250514) ### Environment Variables Reference See `env.example` for the complete list with default values and descriptions. ## Development ### Prerequisites - Backend API server running - PostgreSQL database configured and accessible - Environment variables set up (use `./setup-env.sh` or manually) - Redis server (optional, for TAT queue) ### Available Scripts ```bash # Run in development mode npm run dev # Run tests npm test # Run linting npm run lint # Run type checking npm run type-check # Build for production npm run build ``` ### Setup Checklist - [ ] Node.js 22.x LTS installed - [ ] PostgreSQL 16.x installed and running - [ ] Environment variables configured (`.env` file created) - [ ] Database created: `createdb re_workflow_db` (or your DB_NAME) - [ ] Database schema applied (if applicable) - [ ] Redis installed and running (for TAT monitoring) - [ ] VAPID keys generated (for web push notifications) - [ ] Optional: SMTP configured (for email notifications) - [ ] Optional: GCP credentials configured (for cloud storage) ## Project Structure ``` src/ ├── app.ts # Express app configuration ├── server.ts # Server entry point ├── config/ # Configuration files ├── controllers/ # Request handlers ├── services/ # Business logic ├── models/ # Sequelize models ├── routes/ # API routes ├── middlewares/ # Express middlewares ├── validators/ # Request validation schemas ├── utils/ # Utility functions └── types/ # TypeScript type definitions ``` ## Database Schema The database schema includes all tables from the ERD: - `users` - User information - `workflow_requests` - Main workflow requests - `approval_levels` - Approval hierarchy - `participants` - Workflow participants - `documents` - Document metadata - `work_notes` - Communication within workflow - `activities` - Activity log - `notifications` - User notifications - `tat_tracking` - TAT monitoring - And more... ## Authentication Flow 1. Frontend handles SSO authentication (Okta/Auth0) 2. Frontend sends user data to `/api/v1/auth/sso-callback` 3. Backend creates/updates user record 4. Backend generates JWT access and refresh tokens 5. Frontend uses tokens for subsequent API calls 6. Tokens are automatically refreshed when expired ## Web Push Notifications The backend supports web push notifications via VAPID (Voluntary Application Server Identification). ### Setup Instructions 1. **Generate VAPID Keys:** ```bash npx web-push generate-vapid-keys ``` 2. **Add to Backend `.env`:** ``` VAPID_PUBLIC_KEY= VAPID_PRIVATE_KEY= VAPID_CONTACT=mailto:admin@royalenfield.com ``` 3. **Add to Frontend `.env`:** ``` VITE_PUBLIC_VAPID_KEY= ``` 4. **Important:** The VAPID public key must be the same in both backend and frontend `.env` files. The `setup-env.sh` script provides detailed VAPID key generation instructions (select option 2). ## Contributing 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Run tests and linting 5. Submit a pull request ## License This project is proprietary to Royal Enfield. ## Support For support and questions, please contact the development team.