Back to Projects

Westgate Pension

Westgate Pension

Overview

Westgate Pension is a full stack pension administration platform that simulates real-world member and employer portals used by pension consulting firms. The system features two distinct role-based portals — employees can log in to view their pension details, run new calculations based on salary and contribution rate, and track their full calculation history. Administrators have access to an organization-wide dashboard showing all members, their profiles, and calculation histories. Built with .NET 10 Web API on the backend and React with TypeScript on the frontend, the application uses Entity Framework Core for database management with SQL Server, JWT authentication for secure access, and BCrypt for password hashing. The project is fully deployed on Azure with a CI/CD pipeline via GitHub Actions that automatically deploys on every push to main.

Challenges & Solutions

One of the main architectural challenges was resolving a circular reference issue caused by the one-to-many relationship between Employee and PensionCalculation entities during JSON serialization. I solved this using [JsonIgnore] and a nullable navigation property, though I identified DTOs as the production-grade solution. Setting up the production deployment on Azure required configuring SQL Server firewall rules, running EF Core migrations automatically on startup, managing environment variables for JWT secrets and connection strings, and configuring CORS to allow requests from the deployed frontend. Switching from LocalDB to Docker for local development and then to Azure SQL for production required careful connection string management using .NET User Secrets locally and Azure App Service environment variables in production.

What I Learned

  • 1Built a RESTful API with ASP.NET Core following a layered architecture — controllers, services, and data access layers with clear separation of concerns.
  • 2Implemented JWT authentication with role-based access control, allowing employees to access only their own data while admins can manage the entire organization.
  • 3Used Entity Framework Core code-first migrations to manage database schema changes across local Docker and production Azure SQL environments.
  • 4Designed a relational database schema with a one-to-many relationship between employees and pension calculations, applying normalization principles.
  • 5Built a reusable React component library with Tailwind CSS design tokens, keeping components under 100 lines and following single responsibility principles.
  • 6Implemented custom React hooks to separate data fetching logic from UI components, improving maintainability and reusability.
  • 7Configured a full CI/CD pipeline using GitHub Actions for automatic deployment to Azure App Service and Azure Static Web Apps on every push to main.
  • 8Managed sensitive credentials using .NET User Secrets locally and Azure App Service environment variables in production, keeping secrets out of source control.
  • 9Applied mobile responsive design using Tailwind CSS breakpoint utilities ensuring the app works across all device sizes.

Deployment Process

The application is deployed across three Azure services — the .NET backend runs on Azure App Service, the React frontend is hosted on Azure Static Web Apps, and the database runs on Azure SQL Database. A GitHub Actions CI/CD pipeline automatically builds and deploys both the backend and frontend whenever changes are pushed to the main branch. EF Core migrations run automatically on application startup, ensuring the production database schema stays in sync with the codebase. Environment variables including the JWT secret key and database connection string are managed through Azure App Service configuration, keeping all credentials out of source control. The custom domain westgatepension.may-nguyen.ca is configured via GoDaddy DNS with CNAME records pointing to the Azure deployment URLs.

Project Details

Technologies

Languages

C#TypeScript

Frontend

ReactTailwind CSS

Backend

.NET 10ASP.NET Core Web APIEntity Framework CoreJWT AuthenticationREST API

Database

Microsoft SQL Server

Cloud

Azure App ServiceAzure SQL DatabaseAzure Static Web Apps

DevOps

DockerGitHub Actions

Gallery Preview

Westgate Pension screenshot 1
Westgate Pension screenshot 2

+1 more screenshots

Project Gallery

Westgate Pension screenshot 1

Westgate Pension - View 1

Westgate Pension screenshot 2

Westgate Pension - View 2

Westgate Pension screenshot 3

Westgate Pension - View 3