From e6fa7b5eefbea593b286eb6a6de29cba0cb76bc6 Mon Sep 17 00:00:00 2001 From: Mouaz Abdelsamad <ma03081@surrey.ac.uk> Date: Tue, 9 Apr 2024 17:10:07 +0100 Subject: [PATCH] Connect Booking Service with Gateway --- .env | 2 +- .../BookingService/BookingServiceClient.cs | 51 +++++++++++++++++++ .../BookingService/IBookingServiceClient.cs | 11 ++++ GatewayAPI/Controllers/BookingController.cs | 47 +++++++++++++++++ GatewayAPI/Models/BookingCreation.cs | 10 ++++ GatewayAPI/Models/BookingUpdate.cs | 7 +++ GatewayAPI/ServiceCollectionExtensions.cs | 9 +++- 7 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 GatewayAPI/Clients/BookingService/BookingServiceClient.cs create mode 100644 GatewayAPI/Clients/BookingService/IBookingServiceClient.cs create mode 100644 GatewayAPI/Controllers/BookingController.cs create mode 100644 GatewayAPI/Models/BookingCreation.cs create mode 100644 GatewayAPI/Models/BookingUpdate.cs diff --git a/.env b/.env index f3c6ff9..28e4f23 100644 --- a/.env +++ b/.env @@ -10,7 +10,7 @@ DB_USER=user DB_PASSWORD=user DB_CHARSET=utf8mb4 -# Keeping these for dev perposes, will remove at the end +# Keeping these for dev purposes, will remove at the end #DB_PORT=3308 #DB_NAME=AspNetCoreDb #DB_USER=root diff --git a/GatewayAPI/Clients/BookingService/BookingServiceClient.cs b/GatewayAPI/Clients/BookingService/BookingServiceClient.cs new file mode 100644 index 0000000..dab63de --- /dev/null +++ b/GatewayAPI/Clients/BookingService/BookingServiceClient.cs @@ -0,0 +1,51 @@ +using GatewayAPI.Models; +using Microsoft.AspNetCore.WebUtilities; + +namespace GatewayAPI.Clients.BookingService +{ + public class BookingServiceClient : IBookingServiceClient + { + private readonly HttpClient httpClient; + private const string API_PATH = "api/Booking"; + + public BookingServiceClient(HttpClient httpClient) + { + this.httpClient = httpClient; + } + + public Task<HttpResponseMessage> GetBookingAsync(int id) + { + return httpClient.GetAsync($"{API_PATH}/{id}"); + } + + public Task<HttpResponseMessage> GetBookingsAsync(int? flightId = null, int? userId = null, int? bookingClass = null) + { + Dictionary<string, string?> queryParams = new Dictionary<string, string?>(); + + if (flightId.HasValue) + queryParams.Add("flightId", flightId.Value.ToString()); + + if (userId.HasValue) + queryParams.Add("userId", userId.Value.ToString()); + + if (bookingClass.HasValue) + queryParams.Add("bookingClass", bookingClass.Value.ToString()); + + string url = QueryHelpers.AddQueryString(API_PATH, queryParams); + + return httpClient.GetAsync(url); + } + + public Task<HttpResponseMessage> MakeBookingAsync(BookingCreation bookingModel) + { + return httpClient.PostAsJsonAsync($"{API_PATH}", bookingModel); + } + + public Task<HttpResponseMessage> UpdateBookingAsync(int bookindId, BookingUpdate bookingModel) + { + return httpClient.PutAsJsonAsync($"{API_PATH}/{bookindId}", bookingModel); + } + + + } +} diff --git a/GatewayAPI/Clients/BookingService/IBookingServiceClient.cs b/GatewayAPI/Clients/BookingService/IBookingServiceClient.cs new file mode 100644 index 0000000..9b4d6b2 --- /dev/null +++ b/GatewayAPI/Clients/BookingService/IBookingServiceClient.cs @@ -0,0 +1,11 @@ +using GatewayAPI.Models; + +namespace GatewayAPI.Clients.BookingService +{ + public interface IBookingServiceClient + { + Task<HttpResponseMessage> GetBookingAsync(int id); + Task<HttpResponseMessage> GetBookingsAsync(int? flightId = null, int? userId = null, int? bookingClass = null); + Task<HttpResponseMessage> MakeBookingAsync(BookingCreation bookingModel); + Task<HttpResponseMessage> UpdateBookingAsync(int bookindId, BookingUpdate bookingModel); } +} diff --git a/GatewayAPI/Controllers/BookingController.cs b/GatewayAPI/Controllers/BookingController.cs new file mode 100644 index 0000000..3828149 --- /dev/null +++ b/GatewayAPI/Controllers/BookingController.cs @@ -0,0 +1,47 @@ +using GatewayAPI.Clients.BookingService; +using GatewayAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace GatewayAPI.Controllers +{ + + [ApiController] + [Route("api/[Controller]")] + public class BookingController : ControllerBase + { + private readonly IBookingServiceClient bookingServiceClient; + + public BookingController(IBookingServiceClient bookingServiceClient) + { + this.bookingServiceClient = bookingServiceClient; + } + + [HttpGet("{id}")] + public async Task<IActionResult> GetBooking(int id) + { + HttpResponseMessage response = await bookingServiceClient.GetBookingAsync(id); + return new HttpResponseMessageResult(response); + } + + [HttpGet()] + public async Task<IActionResult> GetBookings(int? flightId = null, int? userId = null, int? bookingClass = null) + { + HttpResponseMessage response = await bookingServiceClient.GetBookingsAsync(flightId, userId, bookingClass); + return new HttpResponseMessageResult(response); + } + + [HttpPost()] + public async Task<IActionResult> MakeBooking([FromBody] BookingCreation bookingCreationModel) + { + HttpResponseMessage response = await bookingServiceClient.MakeBookingAsync(bookingCreationModel); + return new HttpResponseMessageResult(response); + } + + [HttpPut("{id}")] + public async Task<IActionResult> UpdateBooking([FromRoute] int id, [FromBody] BookingUpdate bookingUpdateModel) + { + HttpResponseMessage response = await bookingServiceClient.UpdateBookingAsync(id, bookingUpdateModel); + return new HttpResponseMessageResult(response); + } + } +} diff --git a/GatewayAPI/Models/BookingCreation.cs b/GatewayAPI/Models/BookingCreation.cs new file mode 100644 index 0000000..c313492 --- /dev/null +++ b/GatewayAPI/Models/BookingCreation.cs @@ -0,0 +1,10 @@ +namespace GatewayAPI.Models +{ + public class BookingCreation + { + public required int FlightId { get; set; } + public required int BookingClass { get; set; } + public int? SeatId { get; set; } + + } +} diff --git a/GatewayAPI/Models/BookingUpdate.cs b/GatewayAPI/Models/BookingUpdate.cs new file mode 100644 index 0000000..e723879 --- /dev/null +++ b/GatewayAPI/Models/BookingUpdate.cs @@ -0,0 +1,7 @@ +namespace GatewayAPI.Models +{ + public class BookingUpdate + { + public required int SeatId { get; set; } + } +} diff --git a/GatewayAPI/ServiceCollectionExtensions.cs b/GatewayAPI/ServiceCollectionExtensions.cs index 7235c81..25d509a 100644 --- a/GatewayAPI/ServiceCollectionExtensions.cs +++ b/GatewayAPI/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ -using GatewayAPI.Clients.FlightService; +using GatewayAPI.Clients.BookingService; +using GatewayAPI.Clients.FlightService; using GatewayAPI.Clients.UserService; using System.Runtime.CompilerServices; @@ -20,6 +21,12 @@ namespace GatewayAPI client.BaseAddress = new Uri(baseUrl.EndsWith("/") ? baseUrl : baseUrl + "/"); }).AddHttpMessageHandler<RequestCookieHandler>(); + services.AddHttpClient<IBookingServiceClient, BookingServiceClient>(client => + { + string baseUrl = configurationManager["BookingMicroservice:BaseUrl"] ?? throw new InvalidOperationException("BookingMicroservice BaseUrl is not configured."); + client.BaseAddress = new Uri(baseUrl.EndsWith("/") ? baseUrl : baseUrl + "/"); + }).AddHttpMessageHandler<RequestCookieHandler>(); + return services; } } -- GitLab