diff --git a/2-modular-monolith-architecture-style/README.md b/2-modular-monolith-architecture-style/README.md index 7be076b..6009f50 100644 --- a/2-modular-monolith-architecture-style/README.md +++ b/2-modular-monolith-architecture-style/README.md @@ -7,6 +7,16 @@ - [Key Features](#key-features) - [When to Use](#when-to-use) - [Challenges](#challenges) +- [Modular Monolith Architecture Design](#modular-monolith-architecture-design) +- [Development Setup](#development-setup) + - [Dotnet Tools Packages](#dotnet-tools-packages) + - [Husky](#husky) + - [Upgrade Nuget Packages](#upgrade-nuget-packages) +- [How to Run](#how-to-run) + - [Build](#build) + - [Run](#run) + - [Test](#test) +- [Documentation Apis](#documentation-apis) ## Key Features @@ -27,3 +37,66 @@ - Still a single deployment unit, so scaling is limited. - Requires careful design to avoid tight coupling between modules. - Not as scalable or fault-tolerant as microservices. + + +## Modular Monolith Architecture Design + +![](./assets/booking-modular-monolith.png) + + +## Development Setup + +### Dotnet Tools Packages +For installing our requirement packages with .NET cli tools, we need to install `dotnet tool manifest`. +```bash +dotnet new tool-manifest +``` +And after that we can restore our dotnet tools packages with .NET cli tools from `.config` folder and `dotnet-tools.json` file. +``` +dotnet tool restore +``` + +### Husky +Here we use `husky` to handel some pre commit rules and we used `conventional commits` rules and `formatting` as pre commit rules, here in [package.json](.././package.json). of course, we can add more rules for pre commit in future. (find more about husky in the [documentation](https://typicode.github.io/husky/get-started.html)) +We need to install `husky` package for `manage` `pre commits hooks` and also I add two packages `@commitlint/cli` and `@commitlint/config-conventional` for handling conventional commits rules in [package.json](.././package.json). +Run the command bellow in the root of project to install all npm dependencies related to husky: + +```bash +npm install +``` + +> Note: In the root of project we have `.husky` folder and it has `commit-msg` file for handling conventional commits rules with provide user friendly message and `pre-commit` file that we can run our `scripts` as a `pre-commit` hooks. that here we call `format` script from [package.json](./package.json) for formatting purpose. + +### Upgrade Nuget Packages +For upgrading our nuget packages to last version, we use the great package [dotnet-outdated](https://github.com/dotnet-outdated/dotnet-outdated). +Run the command below in the root of project to upgrade all of packages to last version: +```bash +dotnet outdated -u +``` + +## How to Run + +> ### Build +To `build` all modules, run this command in the `root` of the project: +```bash +dotnet build +``` + +> ### Run +To `run` all modules, run this command in the root of the `Api` folder where the `csproj` file is located: +```bash +dotnet run +``` + +> ### Test + +To `test` all modules, run this command in the `root` of the project: +```bash +dotnet test +``` + +> ### Documentation Apis + +Each microservice provides `API documentation` and navigate to `/swagger` for `Swagger OpenAPI` or `/scalar/v1` for `Scalar OpenAPI` to visit list of endpoints. + +As part of API testing, I created the [booking.rest](./booking.rest) file which can be run with the [REST Client](https://github.com/Huachao/vscode-restclient) `VSCode plugin`. diff --git a/2-modular-monolith-architecture-style/assets/booking-modular-monolith.drawio b/2-modular-monolith-architecture-style/assets/booking-modular-monolith.drawio new file mode 100644 index 0000000..fbadb1e --- /dev/null +++ b/2-modular-monolith-architecture-style/assets/booking-modular-monolith.drawio @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2-modular-monolith-architecture-style/assets/booking-modular-monolith.png b/2-modular-monolith-architecture-style/assets/booking-modular-monolith.png new file mode 100644 index 0000000..898f804 Binary files /dev/null and b/2-modular-monolith-architecture-style/assets/booking-modular-monolith.png differ diff --git a/2-modular-monolith-architecture-style/booking.rest b/2-modular-monolith-architecture-style/booking.rest new file mode 100644 index 0000000..3de3b6c --- /dev/null +++ b/2-modular-monolith-architecture-style/booking.rest @@ -0,0 +1,230 @@ + +@booking-modular-monolith-api=https://localhost:5000 + +@contentType = application/json +@flightid = "3c5c0000-97c6-fc34-2eb9-08db322230c9" +@passengerId = "8c9c0000-97c6-fc34-2eb9-66db322230c9" + +################################# Identity API ################################# + +### +# @name Authenticate +POST {{booking-modular-monolith-api}}/connect/token +Content-Type: application/x-www-form-urlencoded + +grant_type=password +&client_id=client +&client_secret=secret +&username=samh +&password=Admin@123456 +&scope=booking-modular-monolith +### + + + +### +# @name Register_New_User +POST {{booking-modular-monolith-api}}/api/v1/identity/register-user +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "firstName": "John", + "lastName": "Do", + "username": "admin", + "passportNumber": "412900000", + "email": "admin@admin.com", + "password": "Admin@12345", + "confirmPassword": "Admin@12345" +} +### + +################################# Flight API ################################# + +### +# @name Create_Seat +Post {{booking-modular-monolith-api}}/api/v1/flight/seat +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "seatNumber": "1255", + "type": 1, + "class": 1, + "flightId": "3c5c0000-97c6-fc34-2eb9-08db322230c9" +} +### + + +### +# @name Reserve_Seat +Post {{booking-modular-monolith-api}}/api/v1/flight/reserve-seat +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "flightId": "3c5c0000-97c6-fc34-2eb9-08db322230c9", + "seatNumber": "1255" +} +### + + +### +# @name Get_Available_Seats +GET {{booking-modular-monolith-api}}/api/v1/flight/get-available-seats/{{flightid}} +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} +### + + +### +# @name Get_Flight_By_Id +GET {{booking-modular-monolith-api}}/api/v1/flight/{{flightid}} +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} +### + + +### +# @name Get_Available_Flights +GET {{booking-modular-monolith-api}}/api/v1/flight/get-available-flights +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} +### + + +### +# @name Create_Flights +POST {{booking-modular-monolith-api}}/api/v1/flight +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "flightNumber": "12BB", + "aircraftId": "3c5c0000-97c6-fc34-fcd3-08db322230c8", + "departureAirportId": "3c5c0000-97c6-fc34-a0cb-08db322230c8", + "departureDate": "2022-03-01T14:55:41.255Z", + "arriveDate": "2022-03-01T14:55:41.255Z", + "arriveAirportId": "3c5c0000-97c6-fc34-fc3c-08db322230c8", + "durationMinutes": 120, + "flightDate": "2022-03-01T14:55:41.255Z", + "status": 1, + "price": 8000 +} +### + + +### +# @name Update_Flights +PUT {{booking-modular-monolith-api}}/api/v1/flight +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "id": 1, + "flightNumber": "BD467", + "aircraftId": "3c5c0000-97c6-fc34-fcd3-08db322230c8", + "departureAirportId": "3c5c0000-97c6-fc34-a0cb-08db322230c8", + "departureDate": "2022-04-23T12:17:45.140Z", + "arriveDate": "2022-04-23T12:17:45.140Z", + "arriveAirportId": "3c5c0000-97c6-fc34-fc3c-08db322230c8", + "durationMinutes": 120, + "flightDate": "2022-04-23T12:17:45.140Z", + "status": 4, + "isDeleted": false, + "price": 99000 +} +### + + +### +# @name Delete_Flights +DELETE {{booking-modular-monolith-api}}/api/v1/flight/{{flightid}} +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} +### + + +### +# @name Create_Airport +POST {{booking-modular-monolith-api}}/api/v1/flight/airport +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "name": "mehrabad", + "address": "tehran", + "code": "12YD" +} +### + + + +### +# @name Create_Aircraft +POST {{booking-modular-monolith-api}}/api/v1/flight/aircraft +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "name": "airbus2", + "model": "322", + "manufacturingYear": 2012 +} +### + + +################################# Passenger API ################################# + + +### +# @name Complete_Registration_Passenger +POST {{booking-modular-monolith-api}}/api/v1/passenger/complete-registration +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "passportNumber": "412900000000", + "passengerType": 1, + "age": 30 +} +### + + +### +# @name Get_Passenger_By_Id +GET {{booking-modular-monolith-api}}/api/v1/passenger/{{passengerId}} +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} +### + + +################################# Booking API ################################# + + +### +# @name Create_Booking +POST {{booking-modular-monolith-api}}/api/v1/booking +accept: application/json +Content-Type: application/json +authorization: bearer {{Authenticate.response.body.access_token}} + +{ + "passengerId": "8c9c0000-97c6-fc34-2eb9-66db322230c9", + "flightId": "3c5c0000-97c6-fc34-2eb9-08db322230c9", + "description": "I want to fly to iran" +} +### diff --git a/2-modular-monolith-architecture-style/src/.gitkeep b/2-modular-monolith-architecture-style/deployments/.gitkeep similarity index 100% rename from 2-modular-monolith-architecture-style/src/.gitkeep rename to 2-modular-monolith-architecture-style/deployments/.gitkeep diff --git a/2-modular-monolith-architecture-style/src/Api/src/Extensions/SharedInfrastructureExtensions.cs b/2-modular-monolith-architecture-style/src/Api/src/Extensions/SharedInfrastructureExtensions.cs index 92aa4c6..2ede23d 100644 --- a/2-modular-monolith-architecture-style/src/Api/src/Extensions/SharedInfrastructureExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Api/src/Extensions/SharedInfrastructureExtensions.cs @@ -4,7 +4,6 @@ using BuildingBlocks.Exception; using BuildingBlocks.HealthCheck; using BuildingBlocks.Jwt; using BuildingBlocks.Logging; -using BuildingBlocks.Mapster; using BuildingBlocks.MassTransit; using BuildingBlocks.OpenApi; using BuildingBlocks.OpenTelemetryCollector; @@ -12,7 +11,6 @@ using BuildingBlocks.PersistMessageProcessor; using BuildingBlocks.ProblemDetails; using BuildingBlocks.Web; using Figgle; -using FluentValidation; using Microsoft.AspNetCore.Mvc; using Serilog; @@ -38,8 +36,8 @@ public static class SharedInfrastructureExtensions Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name)); builder.AddCustomSerilog(builder.Environment); - builder.Services.AddScoped(); builder.Services.AddJwt(); + builder.Services.AddScoped(); builder.Services.AddTransient(); builder.Services.AddPersistMessageProcessor(); @@ -85,9 +83,6 @@ public static class SharedInfrastructureExtensions }); builder.Services.AddEasyCaching(options => { options.UseInMemory(builder.Configuration, "mem"); }); - - builder.Services.AddValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()); - builder.Services.AddCustomMapster(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddProblemDetails(); return builder; diff --git a/2-modular-monolith-architecture-style/src/Api/src/Program.cs b/2-modular-monolith-architecture-style/src/Api/src/Program.cs index 9810f8e..5fb7504 100644 --- a/2-modular-monolith-architecture-style/src/Api/src/Program.cs +++ b/2-modular-monolith-architecture-style/src/Api/src/Program.cs @@ -7,8 +7,6 @@ using Passenger.Extensions.Infrastructure; var builder = WebApplication.CreateBuilder(args); -builder.AddMinimalEndpoints(assemblies: AppDomain.CurrentDomain.GetAssemblies()); - builder.AddSharedInfrastructure(); builder.AddFlightModules(); @@ -16,20 +14,19 @@ builder.AddIdentityModules(); builder.AddPassengerModules(); builder.AddBookingModules(); - var app = builder.Build(); // ref: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-7.0#routing-basics app.UseAuthentication(); app.UseAuthorization(); -app.MapMinimalEndpoints(); -app.UserSharedInfrastructure(); app.UseFlightModules(); app.UseIdentityModules(); app.UsePassengerModules(); app.UseBookingModules(); +app.UserSharedInfrastructure(); +app.MapMinimalEndpoints(); app.Run(); diff --git a/2-modular-monolith-architecture-style/src/Api/src/appsettings.json b/2-modular-monolith-architecture-style/src/Api/src/appsettings.json index 1cf37da..436a3dc 100644 --- a/2-modular-monolith-architecture-style/src/Api/src/appsettings.json +++ b/2-modular-monolith-architecture-style/src/Api/src/appsettings.json @@ -26,10 +26,9 @@ "ConnectionString": "esdb://localhost:2113?tls=false" }, "Jwt": { - "Authority": "http://localhost:5001", - "Audience": "booking_modular_monolith", - "RequireHttpsMetadata": false, - "MetadataAddress": "http://localhost:5001/.well-known/openid-configuration" + "Authority": "https://localhost:5000", + "Audience": "booking-modular-monolith", + "RequireHttpsMetadata": false }, "PersistMessageOptions": { "Interval": 30, diff --git a/2-modular-monolith-architecture-style/src/Api/src/keys/is-signing-key-296345BF73910ADD1DAC302B848E47E7.json b/2-modular-monolith-architecture-style/src/Api/src/keys/is-signing-key-296345BF73910ADD1DAC302B848E47E7.json new file mode 100644 index 0000000..cd34668 --- /dev/null +++ b/2-modular-monolith-architecture-style/src/Api/src/keys/is-signing-key-296345BF73910ADD1DAC302B848E47E7.json @@ -0,0 +1 @@ +{"Version":1,"Id":"296345BF73910ADD1DAC302B848E47E7","Created":"2025-04-06T20:57:25.1670058Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8KNpFTgHKl5Nl-o13RQ8rseNpYdUTB-_FLsIGbeu6jM5x9l_rDfygUsYH6TAnyqXDFeW4U7xf8kJXDDvH1V0jkKcQaHFWYcZnKAirRBnuReu2OcaGWcn0vDccI5liTTRfp_Dknwhf3jgrU-LOBlPDoVGWwTwOQHXa4iHQjfOCG77Ey6CmJZ0w6JMi802tSMbpc2G2376b05GuzpoKwfgG_F8ZJcAtl1cql4KD11CcynPTNqK0fXOcIeGCQKgJDkJp_cHlk-sv4xJTFl5nqRx62v9auoB3AeKxqRqKqserGT-ZFYDeSxOlgmDSreVFezZ4tYd80Iq-ZpQXK5e3uz8gJ1B37_ySzgF_Rkscf67FivIqcpcV-WZzvnKXeQP0Wo7B7Qt8sKwCAW-vh3X5iMdDi-tecOWaRqeNrffbjd4efP1FK5wqmNrZirrcuCZDgPyYUiB1bSUE1HSj5vW4kFy_NF-3k0EVcQf5KqJpJ9QkTQgmTPkFCwwEcyX-P2hA21G64_M_7EjZXnjw29xjnkI7zO3mx3sA5bwPf6sCmxgE6joaI6P7G4u8JB5pbSHynOWWNTWRZm8YHngZCfK1DZa6Y-uAnrNzVQdcbB-uVGwszavP3Ohqtu7NBCaIkIhyT9N783n5-J8KAbSKu2FBF-qwNaUcmSAhbnRLyQwou-F0sxgM9iLwNcCo6jcgqz5g3MBEIcWa5IKdbtYXQQzbj3NlKmYg1l-x0SrxZD9403gNIS-zCEWLPEgpLr-NU06_Y5Vkbvn8jHKAr45nDFvY_osVvCPQ8qFuq_P-z3HMqFrfuPNlLrf_ZoJCpIKYNdXPJwHQXzGpz41QiN2omk52K5N8UCiGnDog66tJZAqGjtWWHpFCF2O4LXA9uEwnlD06N_i1T9umOtLnlGsF5SM0G3YjG_G8APqd6GDnJsM1wBoVXzzldGvS8GEwwxvVRGvLrSljPdR_l-8JifzUzhIOxMdlZUE8D9tQJhqZJovm34kfgx8AA0j4FQxAKPUhz99dapc5rmP1pgkuv7b9ZgtWa9js16GUJUYV3Dd6HC3lWU4zdXnQIsJPBUdgsiKptAXayc1KevAzw7o2PB7_auENui4cj1MuDxbaf9yrq9ZIol_tPw5rdN440vhHPIPzVi-1Wv0YyvyPD0fj2GAU5fL97lVlCprWuM71-rjVtARrn0pbf4ENBYk4ABWWke8ZHppbdFQQbjBv-yKCeiGA7qbRAeb_NMK2wmWUGz9DTVWtb04kmitXvg1-aj6ZwY-uIDSY5uaHPz7b8mxFywlSQ9plQzIkb-EfZk6RWxW1-NqyHMEAryM4QxwdDX9LjSo37CPdHCdOSRsMzH6zGH0_SgeN4W25Lk0RhoBHMMQk_gF5FCXjDteFlAdPFw9K5qmVVohHfEnAMDUZ4xYYgDx0Z254jsbSIFOuqEmUvmb5WvbKFtlcLrpFAuoqcNLfI61JM0LLxZNjpktGOMX5q1E_tYm5Y-bxd6W_2r-UUkCTKWJMp7_wr2CJPyegVshEBuUaO4_GyndCTY9_jh4OEYgyFQliEg66g3CUVy7ZBERrfz1CiHmpTqoKbs3toPsHMrB6yaQe9UtcYzLBRP3OVku3WmE1IylfUsZ64YA2DBU399JjYckXlWU3PxH9GAxcnIW8cU_29XZZ0ueGLFeSRP0mBb8TqVIcqd3xoAUbZGPnleme-D44yco8ZSGFVhQqt5qstzIA2DQALjVf2E5vg-yL8Gj9s5q-xjPjBgZgyW23gbBEO6PynDK3jfnucHXcLsHMpvZwyV1yaU3314mNLUpu241_7ukMuWC5FmxaVWqe4n9h-W479YlK5WmI5TDmWcc12DQI92eIAYCSYA60SOJhnuGsyFHwedfxIjVjouZeAWWHj1QOM3uZ1rwYOB0DZSlqI6C2kecv4D2CFq7gYosBxQX9fSnJ2MyUiGOxbdlRtwGB_dtRtlqWpt-acu-l9i5jNwdM6QnNejoPthvWPCcvfaaqFjWjnZQQKSBBfWV9Coe7mnaJYhyqWFUQ4AKcDuboQ3k3jj2p-5LTnbFlTQ3SzLfsgjLjpD5hqIY1ND5NWOT3D0pQumfh5tJxgSa0g-HhW7XBSGs2783OFdgAMuxCkZUgisdu0MRyQzdqWEY30trlpnpsAGOO3E8MMxQ2COy7Y-WrUykioag1qkJTbT-1FgHgw9Qj4dnQ136_tC3BvVrmO6pId26PzdPDpV_4T5vNLoyuiyyUqnHcKOETFrHpbj2cXmi-sYuqrwfNZKfcPIsAkekmcWlLd9s4glvD3xJ0SB0s6gJURjvupdD96l2kfdHw8qieB0ovlGISrpjnAKGn6F81_32rYULB-NDN8H4aTdiVmhvwf6KkpXHA9Euuyyir4BqHmIknr8WWuugIMxRw3ysCS4OIV5ocsjzIfQ9r_15bNWsoyWPDkVnKcS1ffbURzYPNIqTO6Ik5iC7rk705WAxaojy","DataProtected":true} \ No newline at end of file diff --git a/2-modular-monolith-architecture-style/src/Modules/Booking/src/Booking/Features/CreatingBook/V1/CreateBooking.cs b/2-modular-monolith-architecture-style/src/Modules/Booking/src/Booking/Features/CreatingBook/V1/CreateBooking.cs index bde40c0..9975930 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Booking/src/Booking/Features/CreatingBook/V1/CreateBooking.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Booking/src/Booking/Features/CreatingBook/V1/CreateBooking.cs @@ -50,7 +50,7 @@ public class CreateBookingEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("CreateBooking") .WithApiVersionSet(builder.NewApiVersionSet("Booking").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Booking/src/Extensions/Infrastructure/InfrastructureExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Booking/src/Extensions/Infrastructure/InfrastructureExtensions.cs index 87e6712..3d0050d 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Booking/src/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Booking/src/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -1,7 +1,10 @@ using Booking.Data; using BuildingBlocks.Core; using BuildingBlocks.EventStoreDB; +using BuildingBlocks.Mapster; using BuildingBlocks.Mongo; +using BuildingBlocks.Web; +using FluentValidation; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -12,6 +15,9 @@ public static class InfrastructureExtensions public static WebApplicationBuilder AddBookingModules(this WebApplicationBuilder builder) { builder.Services.AddScoped(); + builder.AddMinimalEndpoints(assemblies: typeof(BookingRoot).Assembly); + builder.Services.AddValidatorsFromAssembly(typeof(BookingRoot).Assembly); + builder.Services.AddCustomMapster(typeof(BookingRoot).Assembly); builder.AddMongoDbContext(); // ref: https://github.com/oskardudycz/EventSourcing.NetCore/tree/main/Sample/EventStoreDB/ECommerce diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs index ff9b266..4a97cdf 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs @@ -54,7 +54,7 @@ public class CreateAircraftEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("CreateAircraft") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Airports/Features/CreatingAirport/V1/CreateAirport.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Airports/Features/CreatingAirport/V1/CreateAirport.cs index 580f9c7..8c5912b 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Airports/Features/CreatingAirport/V1/CreateAirport.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Airports/Features/CreatingAirport/V1/CreateAirport.cs @@ -51,7 +51,7 @@ public class CreateAirportEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("CreateAirport") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/InfrastructureExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/InfrastructureExtensions.cs index dbbb17f..dc9ab2a 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -1,9 +1,12 @@ using BuildingBlocks.Core; using BuildingBlocks.EFCore; +using BuildingBlocks.Mapster; using BuildingBlocks.Mongo; +using BuildingBlocks.Web; using Flight.Data; using Flight.Data.Seed; using Flight.GrpcServer.Services; +using FluentValidation; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -15,6 +18,9 @@ public static class InfrastructureExtensions public static WebApplicationBuilder AddFlightModules(this WebApplicationBuilder builder) { builder.Services.AddScoped(); + builder.AddMinimalEndpoints(assemblies: typeof(FlightRoot).Assembly); + builder.Services.AddValidatorsFromAssembly(typeof(FlightRoot).Assembly); + builder.Services.AddCustomMapster(typeof(FlightRoot).Assembly); builder.AddCustomDbContext(nameof(Flight)); builder.Services.AddScoped(); builder.AddMongoDbContext(); diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/MediatRExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/MediatRExtensions.cs index 7d4eeb5..7fe8ac0 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/MediatRExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Extensions/Infrastructure/MediatRExtensions.cs @@ -14,7 +14,7 @@ public static class MediatRExtensions services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(typeof(FlightRoot).Assembly)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>)); - // services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EfTxFlightBehavior<,>)); + services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EfTxFlightBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(CachingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(InvalidateCachingBehavior<,>)); diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/CreatingFlight/V1/CreateFlight.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/CreatingFlight/V1/CreateFlight.cs index e0a3d99..5f4a05b 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/CreatingFlight/V1/CreateFlight.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/CreatingFlight/V1/CreateFlight.cs @@ -59,7 +59,7 @@ public class CreateFlightEndpoint : IMinimalEndpoint return Results.CreatedAtRoute("GetFlightById", new { id = result.Id }, response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("CreateFlight") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces(StatusCodes.Status201Created) diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/DeletingFlight/V1/DeleteFlight.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/DeletingFlight/V1/DeleteFlight.cs index 3f82d40..ebb0931 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/DeletingFlight/V1/DeleteFlight.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/DeletingFlight/V1/DeleteFlight.cs @@ -45,7 +45,7 @@ public class DeleteFlightEndpoint : IMinimalEndpoint return Results.NoContent(); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("DeleteFlight") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces(StatusCodes.Status204NoContent) diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingAvailableFlights/V1/GetAvailableFlights.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingAvailableFlights/V1/GetAvailableFlights.cs index 73d435e..1dc6071 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingAvailableFlights/V1/GetAvailableFlights.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingAvailableFlights/V1/GetAvailableFlights.cs @@ -46,7 +46,7 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("GetAvailableFlights") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingFlightById/V1/GetFlightById.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingFlightById/V1/GetFlightById.cs index 5f01b14..7b0cf8a 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingFlightById/V1/GetFlightById.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/GettingFlightById/V1/GetFlightById.cs @@ -39,7 +39,7 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("GetFlightById") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/UpdatingFlight/V1/UpdateFlight.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/UpdatingFlight/V1/UpdateFlight.cs index 242f951..25b6159 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/UpdatingFlight/V1/UpdateFlight.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Flights/Features/UpdatingFlight/V1/UpdateFlight.cs @@ -56,7 +56,7 @@ public class UpdateFlightEndpoint : IMinimalEndpoint return Results.NoContent(); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("UpdateFlight") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces(StatusCodes.Status204NoContent) diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/CreatingSeat/V1/CreateSeat.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/CreatingSeat/V1/CreateSeat.cs index 1ab80ff..35e7da9 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/CreatingSeat/V1/CreateSeat.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/CreatingSeat/V1/CreateSeat.cs @@ -44,7 +44,7 @@ public class CreateSeatEndpoint : IMinimalEndpoint public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder) { builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/seat", CreateSeat) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("CreateSeat") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/GettingAvailableSeats/V1/GetAvailableSeats.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/GettingAvailableSeats/V1/GetAvailableSeats.cs index 2470176..1470d13 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/GettingAvailableSeats/V1/GetAvailableSeats.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/GettingAvailableSeats/V1/GetAvailableSeats.cs @@ -34,7 +34,7 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder) { builder.MapGet($"{EndpointConfig.BaseApiPath}/flight/get-available-seats/{{id}}", GetAvailableSeats) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("GetAvailableSeats") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/ReservingSeat/V1/ReserveSeat.cs b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/ReservingSeat/V1/ReserveSeat.cs index 4123393..04d179a 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/ReservingSeat/V1/ReserveSeat.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Flight/src/Seats/Features/ReservingSeat/V1/ReserveSeat.cs @@ -35,7 +35,7 @@ public class ReserveSeatEndpoint : IMinimalEndpoint public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder) { builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/reserve-seat", ReserveSeat) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("ReserveSeat") .WithApiVersionSet(builder.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Configurations/Config.cs b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Configurations/Config.cs index d1ded48..c0ac516 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Configurations/Config.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Configurations/Config.cs @@ -25,7 +25,8 @@ public static class Config new(Constants.StandardScopes.FlightApi), new(Constants.StandardScopes.PassengerApi), new(Constants.StandardScopes.BookingApi), - new(Constants.StandardScopes.IdentityApi) + new(Constants.StandardScopes.IdentityApi), + new(Constants.StandardScopes.BookingModularMonolith), }; @@ -35,7 +36,8 @@ public static class Config new(Constants.StandardScopes.FlightApi), new(Constants.StandardScopes.PassengerApi), new(Constants.StandardScopes.BookingApi), - new(Constants.StandardScopes.IdentityApi) + new(Constants.StandardScopes.IdentityApi), + new(Constants.StandardScopes.BookingModularMonolith), }; public static IEnumerable Clients => @@ -56,7 +58,8 @@ public static class Config Constants.StandardScopes.FlightApi, Constants.StandardScopes.PassengerApi, Constants.StandardScopes.BookingApi, - Constants.StandardScopes.IdentityApi + Constants.StandardScopes.IdentityApi, + Constants.StandardScopes.BookingModularMonolith, }, AccessTokenLifetime = 3600, // authorize the client to access protected resources IdentityTokenLifetime = 3600 // authenticate the user diff --git a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/InfrastructureExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/InfrastructureExtensions.cs index d38d12b..3e754e5 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -1,5 +1,8 @@ using BuildingBlocks.Core; using BuildingBlocks.EFCore; +using BuildingBlocks.Mapster; +using BuildingBlocks.Web; +using FluentValidation; using Identity.Configurations; using Identity.Data; using Identity.Data.Seed; @@ -15,6 +18,9 @@ public static class InfrastructureExtensions public static WebApplicationBuilder AddIdentityModules(this WebApplicationBuilder builder) { builder.Services.AddScoped(); + builder.AddMinimalEndpoints(assemblies: typeof(IdentityRoot).Assembly); + builder.Services.AddValidatorsFromAssembly(typeof(IdentityRoot).Assembly); + builder.Services.AddCustomMapster(typeof(IdentityRoot).Assembly); builder.AddCustomDbContext(nameof(Identity)); builder.Services.AddScoped(); builder.AddCustomIdentityServer(); diff --git a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/MediatRExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/MediatRExtensions.cs index 1e5145c..a43a3d4 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/MediatRExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Extensions/Infrastructure/MediatRExtensions.cs @@ -16,7 +16,7 @@ public static class MediatRExtensions services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(typeof(IdentityRoot).Assembly)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>)); - // services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EfTxIdentityBehavior<,>)); + services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EfTxIdentityBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(CachingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(InvalidateCachingBehavior<,>)); diff --git a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Constants/Constants.cs b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Constants/Constants.cs index d87e053..35f89a5 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Constants/Constants.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Constants/Constants.cs @@ -15,5 +15,6 @@ public static class Constants public const string PassengerApi = "passenger-api"; public const string BookingApi = "booking-api"; public const string IdentityApi = "identity-api"; + public const string BookingModularMonolith = "booking-modular-monolith"; } } diff --git a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Features/RegisteringNewUser/V1/RegisterNewUser.cs b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Features/RegisteringNewUser/V1/RegisterNewUser.cs index 0e95a69..ead4de7 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Features/RegisteringNewUser/V1/RegisterNewUser.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Identity/src/Identity/Features/RegisteringNewUser/V1/RegisterNewUser.cs @@ -9,7 +9,6 @@ using BuildingBlocks.Contracts.EventBus.Messages; using BuildingBlocks.Core; using BuildingBlocks.Core.CQRS; using BuildingBlocks.Web; -using Duende.IdentityServer.EntityFramework.Entities; using Exceptions; using FluentValidation; using Mapster; @@ -48,7 +47,7 @@ public class RegisterNewUserEndpoint : IMinimalEndpoint return Results.Ok(response); }) - // .RequireAuthorization() + .RequireAuthorization() .WithName("RegisterUser") .WithApiVersionSet(builder.NewApiVersionSet("Identity").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/InfrastructureExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/InfrastructureExtensions.cs index 611b3e1..f4ed2a4 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -1,6 +1,9 @@ using BuildingBlocks.Core; using BuildingBlocks.EFCore; +using BuildingBlocks.Mapster; using BuildingBlocks.Mongo; +using BuildingBlocks.Web; +using FluentValidation; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Passenger.Data; @@ -13,6 +16,9 @@ public static class InfrastructureExtensions public static WebApplicationBuilder AddPassengerModules(this WebApplicationBuilder builder) { builder.Services.AddScoped(); + builder.AddMinimalEndpoints(assemblies: typeof(PassengerRoot).Assembly); + builder.Services.AddValidatorsFromAssembly(typeof(PassengerRoot).Assembly); + builder.Services.AddCustomMapster(typeof(PassengerRoot).Assembly); builder.AddCustomDbContext(nameof(Passenger)); builder.AddMongoDbContext(); diff --git a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/MediatRExtensions.cs b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/MediatRExtensions.cs index ad6bf1c..e39a970 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/MediatRExtensions.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Extensions/Infrastructure/MediatRExtensions.cs @@ -14,7 +14,7 @@ public static class MediatRExtensions services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(typeof(PassengerRoot).Assembly)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>)); - // services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EfTxPassengerBehavior<,>)); + services.AddScoped(typeof(IPipelineBehavior<,>), typeof(EfTxPassengerBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(CachingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(InvalidateCachingBehavior<,>)); diff --git a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs index 5860071..1066b32 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs @@ -51,7 +51,7 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("CompleteRegisterPassenger") .WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build()) .Produces() diff --git a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/GettingPassengerById/V1/GetPassengerById.cs b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/GettingPassengerById/V1/GetPassengerById.cs index 2b36d5f..e30bcda 100644 --- a/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/GettingPassengerById/V1/GetPassengerById.cs +++ b/2-modular-monolith-architecture-style/src/Modules/Passenger/src/Passengers/Features/GettingPassengerById/V1/GetPassengerById.cs @@ -36,7 +36,7 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint return Results.Ok(response); }) - .RequireAuthorization(nameof(ApiScope)) + .RequireAuthorization() .WithName("GetPassengerById") .WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build()) .Produces() diff --git a/3-microservices-architecture-style/assets/booking-microservices.drawio b/3-microservices-architecture-style/assets/booking-microservices.drawio index 3c64261..e764edb 100644 --- a/3-microservices-architecture-style/assets/booking-microservices.drawio +++ b/3-microservices-architecture-style/assets/booking-microservices.drawio @@ -1,6 +1,6 @@ - + - + @@ -10,9 +10,6 @@ - - - @@ -110,7 +107,7 @@ - + @@ -211,24 +208,6 @@ - - - - - - - - - - - - - - - - - - @@ -477,7 +456,7 @@ - + diff --git a/3-microservices-architecture-style/assets/booking-microservices.png b/3-microservices-architecture-style/assets/booking-microservices.png index 664dcee..81e60ec 100644 Binary files a/3-microservices-architecture-style/assets/booking-microservices.png and b/3-microservices-architecture-style/assets/booking-microservices.png differ diff --git a/3-microservices-architecture-style/booking.rest b/3-microservices-architecture-style/booking.rest index 319ae75..bac041a 100644 --- a/3-microservices-architecture-style/booking.rest +++ b/3-microservices-architecture-style/booking.rest @@ -45,7 +45,7 @@ authorization: bearer {{Authenticate.response.body.access_token}} "firstName": "John", "lastName": "Do", "username": "admin", - "passportNumber": "412900000000", + "passportNumber": "412900000", "email": "admin@admin.com", "password": "Admin@12345", "confirmPassword": "Admin@12345" diff --git a/building-blocks/Jwt/JwtExtensions.cs b/building-blocks/Jwt/JwtExtensions.cs index e46738e..cea1529 100644 --- a/building-blocks/Jwt/JwtExtensions.cs +++ b/building-blocks/Jwt/JwtExtensions.cs @@ -13,33 +13,40 @@ public static class JwtExtensions { var jwtOptions = services.GetOptions("Jwt"); - services.AddAuthentication(o => - { - o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }) - .AddCookie(cfg => cfg.SlidingExpiration = true) - .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => - { - options.Authority = jwtOptions.Authority; - options.TokenValidationParameters = new TokenValidationParameters + services.AddAuthentication( + o => { - ValidateAudience = false, - ClockSkew = TimeSpan.FromSeconds(2) // For prevent add default value (5min) to life time token! - }; - options.RequireHttpsMetadata = jwtOptions.RequireHttpsMetadata; - options.MetadataAddress = jwtOptions.MetadataAddress; - }); + o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddCookie(cfg => cfg.SlidingExpiration = true) + .AddJwtBearer( + JwtBearerDefaults.AuthenticationScheme, + options => + { + options.Authority = jwtOptions.Authority; + + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateAudience = false, + ClockSkew = TimeSpan.FromSeconds(2) // For prevent add default value (5min) to life time token! + }; + + options.RequireHttpsMetadata = jwtOptions.RequireHttpsMetadata; + options.MetadataAddress = jwtOptions.MetadataAddress; + }); if (!string.IsNullOrEmpty(jwtOptions.Audience)) { - services.AddAuthorization(options => - options.AddPolicy(nameof(ApiScope), policy => - { - policy.RequireAuthenticatedUser(); - policy.RequireClaim("scope", jwtOptions.Audience); - }) - ); + services.AddAuthorization( + options => + options.AddPolicy( + nameof(ApiScope), + policy => + { + policy.RequireAuthenticatedUser(); + policy.RequireClaim("scope", jwtOptions.Audience); + })); } return services;