👤 Solo Project20 Working Days

EASRMS — Employee Asset & Service Request Management System

A full-stack enterprise IT service request lifecycle management portal with role-based access, SLA tracking, escalation management, OAuth login, real-time notifications, and bulk import/export capabilities .

E

My Role

Solo developer — designed the database schema, wrote the full backend (Clean Architecture, CQRS with MediatR, EF Core + Dapper hybrid, FluentValidation, JWT auth, SignalR, Cloudinary, Resend, background workers), built the entire React frontend (Redux Toolkit, RTK Query, MUI v5, React Hook Form, Recharts), migrated the database from SQL Server to PostgreSQL, handled production deployment across Render, Vercel, and Neon, and resolved cross-origin auth issues between the two domains.

Duration

20 Working Days

Project Type

Solo Project

About the Project

EASRMS is an internal enterprise portal built with .NET 10 Web API (Clean Architecture + CQRS) and React 18 + TypeScript. It supports a complete request lifecycle — from creation by employees, through manager approval, admin assignment, support resolution, and final closure — with a full audit trail at every step. The system handles 4 roles, 8 request statuses, SLA breach detection, real-time SignalR notifications, Cloudinary file uploads, Google/GitHub OAuth, OTP-based password flows, and bulk CSV imports. Deployed to production on Render + Vercel + Neon PostgreSQL with a custom domain.

The Problem

Enterprise IT teams lack a structured, trackable system for managing employee asset and service requests. Requests get lost in email threads, there is no visibility into SLA compliance, no clear ownership once a request is raised, and managers have no audit trail of what was approved, rejected, or escalated and why.

The Solution

Built a role-based request management platform where employees raise requests, managers approve or reject them, admins assign them to support staff, and support users resolve them. Every status transition is recorded in a history table. SLA hours are configured per category; due dates are auto-calculated on request creation and breach status is tracked event-driven. Admins can escalate breached requests with a mandatory reason, and all escalations are stored in a dedicated history table.

Outcome & Results

A fully deployed, production-ready enterprise application with a custom domain live at easrms.sadiklaliwala.me. Covers the full SRS plus a mid-project Change Request (CR-001: SLA & Escalation). Extra features delivered beyond scope include SignalR real-time notifications, background email retry worker, Excel/PDF export, Cloudinary uploads, Google/GitHub OAuth, OTP password flow, bulk CSV imports, and a CI pipeline via GitHub Actions.

Challenges Faced

Cross-origin cookie blocking: Chrome blocks HttpOnly cookies as third-party cookies when backend (Render) and frontend (Vercel) are on different root domains, even with SameSite=None; Secure. Solved by migrating auth to localStorage Bearer tokens with Authorization headers. PostgreSQL migration: COUNT returns long not int in PostgreSQL, breaking Dapper typed mappings. Dynamic Dapper results produce casing-inconsistent columns. Solved with typed private result classes and explicit casts throughout. RTK Query cache after logout: Stale cached data from the previous session persisted after logout. Solved by dispatching api.util.resetApiState() alongside clearCredentials(), and disabling refetchOnFocus and refetchOnReconnect globally. SignalR cross-origin auth: SignalR hub connections do not send Authorization headers by default. Solved using accessTokenFactory to inject the Bearer token from the Redux store on every hub connection. CR-001 mid-project change request: SLA tracking and escalation were introduced on Day 8 with an impact analysis required before coding. Required modifying 21 existing files and creating 13 new backend files and 12 new frontend files without breaking existing functionality.

What I'd Do Differently

Elasticsearch integration for full-text search on requests and audit history, with SQL as source of truth and Elasticsearch as the search layer. SMS notifications via Twilio or a similar provider, the only undelivered out-of-scope SRS item. Azure AD OAuth as a third provider — setup was attempted but Microsoft 365 Developer Program provisioning had issues. Automated end-to-end tests with Playwright covering the full request lifecycle across all roles. Multi-tenant support to allow the system to serve multiple organisations from a single deployment.