A flagship Enterprise-Grade HR platform showcasing 5+ years of Senior Full-Stack Engineering.
SmartHR Enterprise is a production-grade, Multi-Tenant SaaS Human Resource management system demonstrating advanced architectural patterns that separate Senior Engineers from mid-level developers:
| Feature | Technology | Complexity |
|---|---|---|
| Multi-Tenancy | EF Core Global Query Filters | π΄ Expert |
| Real-time Sync | ASP.NET Core SignalR | π΄ Expert |
| Background Jobs | Hangfire + PostgreSQL | π Advanced |
| JWT Authentication | Role-Based Access Control | π Advanced |
| Cloud Database | Neon PostgreSQL | π‘ Intermediate |
| Enterprise Frontend | Angular 17 + RxJS Subjects | π Advanced |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND (Angular 17) β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β AuthService β βSignalRServiceβ β Dashboard β β
β β (JWT/Tenant)β β (WebSocket) β β Component β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β HTTP / WebSocket
βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ
β BACKEND (ASP.NET Core 9) β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β JWT Auth β β SignalR Hub β β Hangfire β β
β β + RBAC β β /attendance β β Workers β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β EF Core + Multi-Tenant DbContext β β
β β Global Query Filter β TenantId Isolation β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ
β Neon PostgreSQL (Cloud) β
β Tables: Tenants | Users | Employees | AttendanceRecords β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Every database query automatically scopes data to the current tenant using EF Core Global Query Filters β data leakage between organizations is impossible at the ORM layer.
// SmartHRDbContext.cs β Multi-Tenant Global Query Filters
modelBuilder.Entity<Employee>().HasQueryFilter(e => e.TenantId == CurrentTenantId);
modelBuilder.Entity<AttendanceRecord>().HasQueryFilter(e => e.TenantId == CurrentTenantId);When an employee checks in, ALL connected manager dashboards update instantly via WebSockets β no page refresh, no polling.
// AttendanceHub.cs β Broadcasting real-time events
public async Task CheckInPulse(int employeeId, string time)
{
await Clients.All.SendAsync("ReceiveCheckIn", employeeId, time);
}// Angular SignalR subscription
this.signalR.attendanceUpdates.subscribe(update => {
const emp = this.employees.find(e => e.id === update.employeeId);
emp.status = 'Online'; // UI instantly reflects check-in
});Heavy operations like Mass Payroll Export are queued via Hangfire so the API never blocks:
// Hangfire processes jobs asynchronously in the background
builder.Services.AddHangfire(config => config
.UsePostgreSqlStorage(c => c.UseNpgsqlConnection(connectionString)));ASP.NET Core 9.0 β REST API Framework
Entity Framework Core β ORM + Migrations
Npgsql β PostgreSQL Provider
SignalR β Real-time WebSockets
Hangfire β Background Job Processing
JWT Bearer β Authentication
Angular 17 β UI Framework
@microsoft/signalr β WebSocket Client
RxJS Subject β Live Event Stream
Glassmorphism CSS β Premium UI Design
Inter (Google Fonts) β Typography
Neon PostgreSQL β Cloud Database
XAMPP / localhost β Local Development
Vercel β Frontend Deployment (planned)
Render.com β Backend Deployment (planned)
- .NET 9 SDK
- Node.js 18+
- Angular CLI (
npm install -g @angular/cli)
git clone https://github.com/Mo14745646/SmartHR.git
cd SmartHRcd backend
# Update connection string in appsettings.json with your PostgreSQL credentials
dotnet run
# API runs on: http://localhost:5086
# Swagger UI: http://localhost:5086/swagger
# Hangfire Dashboard: http://localhost:5086/hangfirecd .. # back to SmartHR root
npm install
npx ng serve --port 4400
# App runs on: http://localhost:4400Username: muath
Password: muath123
SmartHR/
βββ src/
β βββ app/
β βββ services/
β β βββ auth.service.ts β JWT + Tenant management
β β βββ signalr.service.ts β Real-time WebSocket client
β βββ app.component.ts β Main dashboard logic
β βββ app.component.html β Enterprise UI template
β βββ app.component.css β Glassmorphism styling
βββ backend/
βββ Program.cs β API startup + DI configuration
βββ appsettings.json β JWT + DB configuration
βββ Data/
β βββ SmartHRDbContext.cs β Multi-tenant EF Core context
βββ Models/
β βββ Tenant.cs
β βββ User.cs
β βββ Employee.cs
β βββ AttendanceRecord.cs
βββ Hubs/
β βββ AttendanceHub.cs β SignalR WebSocket hub
βββ Migrations/ β EF Core database migrations
- JWT Bearer Authentication β All protected endpoints require valid tokens
- Role-Based Access Control β Tenant Admins vs Managers vs Employees
- CORS with Credentials β Properly configured for WebSocket connections
- Tenant Data Isolation β Global Query Filters prevent cross-tenant access
Muath Salem β Senior Full Stack Engineer
5+ Years building enterprise SaaS solutions with .NET, Angular, and PostgreSQL.