Exam Buddy
This project came about after a request from my wife. She needed a simple application to help her prepare for several exams using a known set of questions and answers. I saw it as an opportunity to get my hands dirty with Angular, work with APIs, and experiment with architecture and implementation.
The first version of the application was little more than a collection of ugly code - mostly because I was working under a tight deadline (“I need this now…”). It had no authentication, only a few tests - mainly covering question imports - and a very limited UI. Nevertheless, I managed to deliver an MVP that did the job and helped my wife achieve her goal: preparing for and passing her exams.
But it kept bothering me. I had something that worked, yet behind the scenes, its code, design, and architecture were far from ideal. So I decided to spend some time making it right. I had just finished reading an excellent blog post by Milan Jovanović about Vertical Slice Architecture, and I thought this small application would be the perfect candidate for trying out that approach in practice.
Compared with the initial version, the following features were added:
Authentication using an email address and a verification code
Exam result history
Question categories
The ability to create an exam for a selected category
Importing questions and answers from JSON and CSV files
On the API side, I used:
Minimal APIs with Carter for endpoint registration
MediatR to practise the command and query pattern
FluentValidation for request validation
Mapster for mapping requests to commands
Entity Framework Core with PostgreSQL, and SQLite for tests
On the UI side, I used:
- Angular with PrimeNG components and icons
I also used AI - specifically Codex - to help with:
Converting the original source of the questions and answers to JSON so that the data could be imported
Creating validation rules for commands
Styling the UI and setting up some PrimeNG components
Adding code for new contracts once TypeGen had been configured and used with the initial ones
Creating the graphic for the landing page
Some screenshots from the application

