Collaborative software engineering

LusoHealth

I built booking screens and API logic in a five-person academic team. When someone picks a time, the API checks for a conflict before saving the appointment. Payment and chat use that same appointment. I also wrote controller tests and set up the Azure deployment. The prototype uses fictional data.

Role
Full-Stack Developer
Context
Five-Person Academic Team Project
Period
January–May 2024
Status
  • Completed academic project
  • source available
  • .NET 8
  • ASP.NET Core
  • Angular 17
  • SQL Server
  • SignalR
  • Azure
  • TypeScript
  • Entity Framework Core
  • Identity
  • JWT
  • Stripe
  • Google OAuth
  • Google Maps
  • Mailjet
  • xUnit
  • Moq
  • Swagger
  • GitHub Actions
LusoHealth project banner with healthcare interface symbols
Visual used by the academic LusoHealth client. Teammates shared the wider platform work. The project uses fictional data.

My work in the team

I worked across the Angular client, .NET API and SQL data layer in a five-person academic team. The project uses fictional users and appointment data.

My contribution

  • Implemented authentication and account workflows across Angular forms, API endpoints and access checks.
  • Connected professional availability, appointment validation and booking states to payment and refund flows.
  • Integrated appointment-linked SignalR chat and the client views that consume it.
  • Worked on EF Core models, queries and migrations, plus xUnit/Moq controller tests for agendas, appointments and management.
  • Configured GitHub Actions to build the backend and deploy its artifact to Azure Web App.

From availability to a booked appointment

Follow a booking request

Pick a step to see where it runs, from choosing a time to saving the appointment.

  1. The Angular screen sends the chosen professional and time to the API.

  2. I checked that the slot was available and didn’t overlap an existing appointment.

  3. After validation, the API saves the appointment to SQL Server through Entity Framework Core.

  4. Angular shows the state returned by the API. Payment and chat both refer to the saved appointment.

Illustrated request flow through the academic prototype, using fictional demonstration data.

One workflow across application layers

I connected professional availability, conflict checks and appointment states to the booking interface. Payment, refund and chat behaviour then had to refer to the same appointment.

I worked on the EF Core models, queries and migrations behind those flows and kept the client services and API contracts in step as the team changed them.

Testing a shared contract

Changes crossed Angular forms, request data and controller behaviour. I added xUnit/Moq controller tests for agendas, appointments and management, using SQLite and InMemory databases.

I also configured GitHub Actions to build the backend, create its deployment artifact and deploy it to Azure Web App.

Making the workflow usable

I built shared Angular routes, forms and components for authenticated areas. Account access, bookings and appointment-linked chat use the backend's validation and stored state.

The wider feature set was team work. The platform's endpoint and test totals below describe that shared delivery.

LusoHealth professional agenda showing a monthly availability calendar with fictional demonstration data
Professional agenda and availability workflow using fictional demonstration data.

Outcome and evidence

Across the five of us, the prototype reached 104 REST endpoints across ten controllers and 29 test methods. My own tests covered the agenda, appointment and management controllers.

  • My testing work covered controller workflows with xUnit, Moq, SQLite and InMemory databases, with Swagger available for endpoint inspection.
  • I configured the backend build and Azure deployment workflow. The project record describes an academic prototype using fictional demonstration data.

What I learned

I learned to follow a booking change all the way through. If the server changes how it validates a slot, I need to check what the form sends and what the payment flow sees after the appointment is saved.