From b5f5c808c2d984eaec30bb50bec5b5e25a3d9df9 Mon Sep 17 00:00:00 2001 From: SYAvdeev Date: Sun, 23 Feb 2025 14:08:55 +0700 Subject: [PATCH 1/5] Create build_test.yml --- .github/workflows/build_test.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/build_test.yml diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml new file mode 100644 index 00000000..0e07fbb0 --- /dev/null +++ b/.github/workflows/build_test.yml @@ -0,0 +1,32 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net + +name: .NET + +on: + push: + branches: [ "avdeev/tests" ] + pull_request: + branches: [ "avdeev/tests" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - name: Checkout avdeev/tests branch + uses: actions/checkout@v4 + with: + ref: 'avdeev/tests' + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + - name: Restore dependencies + run: dotnet restore Homeworks/UnitTests/src + - name: Build + run: dotnet build Homeworks/UnitTests/src --no-restore + - name: Test + run: dotnet test Homeworks/UnitTests/src --no-build --verbosity normal From 538eecae28978cc6f6115f44ff1b0d009d97190a Mon Sep 17 00:00:00 2001 From: SYAvdeev Date: Sun, 23 Feb 2025 14:22:22 +0700 Subject: [PATCH 2/5] Update build_test.yml --- .github/workflows/build_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 0e07fbb0..98ab7abb 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -1,7 +1,7 @@ # This workflow will build a .NET project # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net -name: .NET +name: Build and test on: push: From 3a3e2adf1d26f267f9aa92375a5779546c564f6c Mon Sep 17 00:00:00 2001 From: Sergey Avdeev Date: Tue, 15 Jul 2025 15:33:01 +0700 Subject: [PATCH 3/5] wip --- Homeworks/RabbitMQ/compose.bat | 3 ++ Homeworks/RabbitMQ/compose.yml | 49 +++++++++++++++++-- .../Employees/EmployeesMessage.cs | 6 +++ .../Employees/EmployeesService.cs | 33 +++++++++++++ .../Employees/IEmployeesService.cs | 8 +++ .../Pcf.Administration.Services.csproj | 15 ++++++ .../Controllers/EmployeesController.cs | 1 - .../Pcf.Administration.WebHost.csproj | 1 + .../Settings/ApplicationSettings.cs | 7 +++ .../Pcf.Administration.WebHost/Startup.cs | 32 +++++++++++- .../appsettings.json | 5 +- .../Pcf.GivingToCustomer.Services.csproj | 9 ++++ .../appsettings.json | 4 +- .../IRabbitMqConsumer.cs | 8 +++ .../IRabbitMqProducer.cs | 6 +++ .../Pcf.Infrastructure.RabbitMq.csproj | 14 ++++++ .../RabbitMqConfiguration.cs | 20 ++++++++ .../RabbitMqConsumer.cs | 26 ++++++++++ .../RabbitMqProducer.cs | 37 ++++++++++++++ .../RmqSettings.cs | 10 ++++ .../Gateways/IAdministrationGateway.cs | 4 +- .../IGivingPromoCodeToCustomerGateway.cs | 4 +- .../Dto/AdministrationDto.cs | 8 +++ .../Dto/GivePromoCodeToCustomerDto.cs | 2 +- .../Pcf.ReceivingFromPartner.Core.csproj | 4 ++ .../AdministrationGateway.cs | 23 +++++---- .../GivingPromoCodeToCustomerGateway.cs | 30 ++++++------ ...cf.ReceivingFromPartner.Integration.csproj | 1 + .../Pcf.ReceivingFromPartner.WebHost.csproj | 1 + .../Settings/ApplicationSettings.cs | 7 +++ .../Startup.cs | 35 +++++++++---- .../appsettings.json | 13 ++++- Homeworks/RabbitMQ/src/Pcf.sln | 23 +++++++++ 33 files changed, 399 insertions(+), 50 deletions(-) create mode 100644 Homeworks/RabbitMQ/compose.bat create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqProducer.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/Pcf.Infrastructure.RabbitMq.csproj create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqProducer.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/AdministrationDto.cs rename Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/{Pcf.ReceivingFromPartner.Integration => Pcf.ReceivingFromPartner.Core}/Dto/GivePromoCodeToCustomerDto.cs (89%) create mode 100644 Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs diff --git a/Homeworks/RabbitMQ/compose.bat b/Homeworks/RabbitMQ/compose.bat new file mode 100644 index 00000000..05fc00c9 --- /dev/null +++ b/Homeworks/RabbitMQ/compose.bat @@ -0,0 +1,3 @@ +cd D:\OTUS\ASP.NET\Homeworks\RabbitMQ +docker-compose -f compose.yml up +PAUSE \ No newline at end of file diff --git a/Homeworks/RabbitMQ/compose.yml b/Homeworks/RabbitMQ/compose.yml index 8ef772ad..f761d423 100644 --- a/Homeworks/RabbitMQ/compose.yml +++ b/Homeworks/RabbitMQ/compose.yml @@ -1,4 +1,23 @@ services: + + rabbit: + image: rabbitmq:3-management + restart: always + hostname: rabbitmqhost + environment: + RABBITMQ_DEFAULT_USER: myuser + RABBITMQ_DEFAULT_PASS: mypass + volumes: + - rabbitmq_data:/var/lib/rabbitmq + ports: + - "5672:5672" + - "15672:15672" + healthcheck: + test: [ "CMD", "rabbitmqctl", "status" ] + interval: 10s + timeout: 5s + retries: 5 + #Administration Db promocode-factory-administration-db: image: "postgres:latest" @@ -19,7 +38,10 @@ services: environment: - "ConnectionStrings:PromocodeFactoryAdministrationDb=Host=promocode-factory-administration-db;Database=promocode_factory_administration_db;Username=postgres;Password=docker" depends_on: - - promocode-factory-administration-db + promocode-factory-administration-db: + condition: service_started + rabbit: + condition: service_healthy #ReceivingFromPartner Db @@ -41,10 +63,16 @@ services: - "8092:8080" environment: - "ConnectionStrings:PromocodeFactoryReceivingFromPartnerDb=Host=promocode-factory-receiving-from-partner-db;Database=promocode_factory_receiving_from_partner_db;Username=postgres;Password=docker" - - "IntegrationSettings:GivingToCustomerApiUrl=http://promocode-factory-giving-to-customer-api" - - "IntegrationSettings:AdministrationApiUrl=http://promocode-factory-administration-api" + - "IntegrationSettings:GivingToCustomerApiUrl=http://promocode-factory-giving-to-customer-api:8080" + - "IntegrationSettings:AdministrationApiUrl=http://promocode-factory-administration-api:8080" + - "RmqSettings:Host=rabbit" + - "RmqSettings:Login=myuser" + - "RmqSettings:Password=mypass" depends_on: - - promocode-factory-receiving-from-partner-db + promocode-factory-receiving-from-partner-db: + condition: service_started + rabbit: + condition: service_healthy #GivingToCustomer Db promocode-factory-giving-to-customer-db: @@ -66,4 +94,15 @@ services: environment: - "ConnectionStrings:PromocodeFactoryGivingToCustomerDb=Host=promocode-factory-giving-to-customer-db;Database=promocode_factory_giving_to_customer_db;Username=postgres;Password=docker" depends_on: - - promocode-factory-giving-to-customer-db \ No newline at end of file + promocode-factory-giving-to-customer-db: + condition: service_started + rabbit: + condition: service_healthy + +volumes: + rabbitmq_data: + +networks: + default: + name: myLocalNetwork # создана извне: docker network create --driver=bridge myLocalNetwork + external: true \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs new file mode 100644 index 00000000..40496bb0 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs @@ -0,0 +1,6 @@ +namespace Pcf.Administration.Services.Employees; + +public class EmployeesMessage +{ + public Guid Id { get; set; } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs new file mode 100644 index 00000000..19ceb7c4 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs @@ -0,0 +1,33 @@ +using System.Text; +using System.Text.Json; +using Pcf.Administration.Core.Abstractions.Repositories; +using Pcf.Administration.Core.Domain.Administration; +using Pcf.Infrastructure.RabbitMq; +using RabbitMQ.Client.Events; + +namespace Pcf.Administration.Services.Employees; + +public class EmployeesService : RabbitMqConsumer, IEmployeesService +{ + private readonly IRepository _employeeRepository; + + public EmployeesService(IRepository employeeRepository) + { + _employeeRepository = employeeRepository; + } + + protected override async Task OnConsumerOnReceivedAsync(object sender, BasicDeliverEventArgs e) + { + var body = e.Body; + var message = JsonSerializer.Deserialize(Encoding.UTF8.GetString(body.ToArray())); + + var employee = await _employeeRepository.GetByIdAsync(message!.Id); + + if (employee == null) + return; + + employee.AppliedPromocodesCount++; + + await _employeeRepository.UpdateAsync(employee); + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs new file mode 100644 index 00000000..17cf3b8d --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs @@ -0,0 +1,8 @@ +using Pcf.Infrastructure.RabbitMq; + +namespace Pcf.Administration.Services.Employees; + +public interface IEmployeesService : IRabbitMqConsumer +{ + +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj new file mode 100644 index 00000000..4afbc69e --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + 12 + + + + + + + + diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Controllers/EmployeesController.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Controllers/EmployeesController.cs index 03b7ddbc..f53c71ac 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Controllers/EmployeesController.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Controllers/EmployeesController.cs @@ -80,7 +80,6 @@ public async Task> GetEmployeeByIdAsync(Guid id) /// Id сотрудника, например 451533d5-d8d5-4a11-9c7b-eb9f14e1a32f /// [HttpPost("{id:guid}/appliedPromocodes")] - public async Task UpdateAppliedPromocodesAsync(Guid id) { var employee = await _employeeRepository.GetByIdAsync(id); diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj index 761be6a3..2f285a99 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj @@ -7,6 +7,7 @@ + diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs new file mode 100644 index 00000000..3fade901 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs @@ -0,0 +1,7 @@ +namespace Pcf.ReceivingFromPartner.WebHost.Settings +{ + public class ApplicationSettings + { + public RmqSettings RmqSettings { get; set; } + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs index 2baa3996..a745cb4f 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs @@ -10,6 +10,11 @@ using Pcf.Administration.DataAccess.Data; using Pcf.Administration.Core.Abstractions.Repositories; using System; +using System.Threading.Tasks; +using Pcf.Administration.Services.Employees; +using Pcf.Infrastructure.RabbitMq; +using Pcf.ReceivingFromPartner.WebHost.Settings; +using RabbitMQ.Client; namespace Pcf.Administration.WebHost { @@ -38,6 +43,9 @@ public void ConfigureServices(IServiceCollection services) x.UseLazyLoadingProxies(); }); + ConfigureRabbitMq(services).Wait(); + services.AddScoped(); + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); services.AddOpenApiDocument(options => @@ -48,7 +56,22 @@ public void ConfigureServices(IServiceCollection services) } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDbInitializer dbInitializer) + private async Task ConfigureRabbitMq(IServiceCollection services) + { + var rmqSettings = Configuration.Get().RmqSettings; + var connection = await RabbitMqConfiguration.GetRabbitConnection(rmqSettings); + + var channel = await connection.CreateChannelAsync(); + + services.AddSingleton(_ => channel); + } + + public void Configure( + IApplicationBuilder app, + IWebHostEnvironment env, + IDbInitializer dbInitializer, + IEmployeesService employeesService, + IChannel channel) { if (env.IsDevelopment()) { @@ -73,7 +96,12 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDbIniti { endpoints.MapControllers(); }); - + + employeesService.Register( + channel, + Configuration["AdministrationExchangeName"]!, + Configuration["AdministrationQueue"]!, + Configuration["AdministrationRoutingKey"]!); dbInitializer.InitializeDb(); } } diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json index 704547c6..b55be681 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json @@ -9,5 +9,8 @@ "ConnectionStrings":{ "PromocodeFactoryAdministrationDb":"Host=localhost;Database=promocode_factory_administration_db;Username=postgres;Password=docker;Port=5433" }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "AdministrationExchangeName": "exchange.administration", + "AdministrationRoutingKey": "routingKey.administration", + "AdministrationQueue": "queue.administration" } diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj new file mode 100644 index 00000000..3a635329 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json index cfae3069..6d0079b2 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json @@ -9,5 +9,7 @@ "ConnectionStrings":{ "PromocodeFactoryGivingToCustomerDb":"Host=localhost;Database=promocode_factory_givingToCustomer_db;Username=postgres;Password=docker;Port=5435" }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "GivingPromoCodeToCustomerExchangeName": "exchange.giving-promocode", + "GivingPromoCodeToCustomerRoutingKey": "routingKey.giving-promocode" } diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs new file mode 100644 index 00000000..68b8cfb3 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs @@ -0,0 +1,8 @@ +using RabbitMQ.Client; + +namespace Pcf.Infrastructure.RabbitMq; + +public interface IRabbitMqConsumer +{ + public Task Register(IChannel channel, string exchangeName, string queueName, string routingKey); +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqProducer.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqProducer.cs new file mode 100644 index 00000000..bad9c723 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqProducer.cs @@ -0,0 +1,6 @@ +namespace Pcf.Infrastructure.RabbitMq; + +public interface IRabbitMqProducer +{ + public Task Publish(TMessage message); +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/Pcf.Infrastructure.RabbitMq.csproj b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/Pcf.Infrastructure.RabbitMq.csproj new file mode 100644 index 00000000..96ac1811 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/Pcf.Infrastructure.RabbitMq.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + + + + + + + + diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs new file mode 100644 index 00000000..64397885 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs @@ -0,0 +1,20 @@ +using Pcf.ReceivingFromPartner.WebHost.Settings; +using RabbitMQ.Client; + +namespace Pcf.Infrastructure.RabbitMq; + +public static class RabbitMqConfiguration +{ + public static async Task GetRabbitConnection(RmqSettings rmqSettings) + { + ConnectionFactory factory = new ConnectionFactory + { + HostName = rmqSettings.Host, + VirtualHost = rmqSettings.VHost, + UserName = rmqSettings.Login, + Password = rmqSettings.Password + }; + + return await factory.CreateConnectionAsync(); + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs new file mode 100644 index 00000000..2c56a1c5 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs @@ -0,0 +1,26 @@ +using RabbitMQ.Client; +using RabbitMQ.Client.Events; + +namespace Pcf.Infrastructure.RabbitMq; + +public abstract class RabbitMqConsumer : IRabbitMqConsumer +{ + public async Task Register(IChannel channel, string exchangeName, string queueName, string routingKey) + { + await channel.BasicQosAsync(0, 10, false); + await channel.QueueDeclareAsync(queueName, false, false, false, null); + await channel.QueueBindAsync(queueName, exchangeName, routingKey, null); + + var consumer = new AsyncEventingBasicConsumer(channel); + + consumer.ReceivedAsync += async (sender, e) => + { + await OnConsumerOnReceivedAsync(sender, e); + await channel.BasicAckAsync(e.DeliveryTag, false); + }; + + await channel.BasicConsumeAsync(queueName, false, consumer); + } + + protected abstract Task OnConsumerOnReceivedAsync(object sender, BasicDeliverEventArgs e); +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqProducer.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqProducer.cs new file mode 100644 index 00000000..f41091e0 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqProducer.cs @@ -0,0 +1,37 @@ +using System.Text; +using System.Text.Json; +using RabbitMQ.Client; + +namespace Pcf.Infrastructure.RabbitMq; + +public class RabbitMqProducer : IRabbitMqProducer +{ + private readonly string _exchangeName; + private readonly string _routingKey; + private readonly IChannel _channel; + + public RabbitMqProducer( + string exchangeType, + string exchangeName, + string routingKey, + IChannel channel) + { + _exchangeName = exchangeName; + _routingKey = routingKey; + _channel = channel; + _channel.ExchangeDeclareAsync(_exchangeName, exchangeType); + } + + public async Task Publish(TMessage message) + { + var messageSerialized = JsonSerializer.Serialize(message); + var body = Encoding.UTF8.GetBytes(messageSerialized); + + await _channel.BasicPublishAsync( + exchange: _exchangeName, + routingKey: _routingKey, + body: body); + + Console.WriteLine($"Message {messageSerialized} is sent into exchange: {_exchangeName}"); + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs new file mode 100644 index 00000000..90031b7f --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs @@ -0,0 +1,10 @@ +namespace Pcf.ReceivingFromPartner.WebHost.Settings +{ + public class RmqSettings + { + public string Host { get; set; } + public string VHost { get; set; } + public string Login { get; set; } + public string Password { get; set; } + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs index fa91b9d8..cc865a91 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs @@ -1,9 +1,11 @@ using System; using System.Threading.Tasks; +using Pcf.Infrastructure.RabbitMq; +using Pcf.ReceivingFromPartner.Core.Dto; namespace Pcf.ReceivingFromPartner.Core.Abstractions.Gateways { - public interface IAdministrationGateway + public interface IAdministrationGateway : IRabbitMqProducer { Task NotifyAdminAboutPartnerManagerPromoCode(Guid partnerManagerId); } diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs index ad38ac13..53db591d 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs @@ -1,9 +1,11 @@ using System.Threading.Tasks; +using Pcf.Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Domain; +using Pcf.ReceivingFromPartner.Core.Dto; namespace Pcf.ReceivingFromPartner.Core.Abstractions.Gateways { - public interface IGivingPromoCodeToCustomerGateway + public interface IGivingPromoCodeToCustomerGateway : IRabbitMqProducer { Task GivePromoCodeToCustomer(PromoCode promoCode); } diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/AdministrationDto.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/AdministrationDto.cs new file mode 100644 index 00000000..3f70f976 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/AdministrationDto.cs @@ -0,0 +1,8 @@ +using System; + +namespace Pcf.ReceivingFromPartner.Core.Dto; + +public class AdministrationDto +{ + public Guid PartnerId { get; set; } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Dto/GivePromoCodeToCustomerDto.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/GivePromoCodeToCustomerDto.cs similarity index 89% rename from Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Dto/GivePromoCodeToCustomerDto.cs rename to Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/GivePromoCodeToCustomerDto.cs index 920c555e..fbba0388 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Dto/GivePromoCodeToCustomerDto.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Dto/GivePromoCodeToCustomerDto.cs @@ -1,6 +1,6 @@ using System; -namespace Pcf.ReceivingFromPartner.Integration.Dto +namespace Pcf.ReceivingFromPartner.Core.Dto { public class GivePromoCodeToCustomerDto { diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj index 4c096661..1d886919 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj @@ -4,4 +4,8 @@ net8.0 + + + + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs index 446568b4..b97ccf8e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs @@ -1,26 +1,25 @@ using System; -using System.Net.Http; using System.Threading.Tasks; +using Pcf.Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Abstractions.Gateways; +using Pcf.ReceivingFromPartner.Core.Dto; +using RabbitMQ.Client; namespace Pcf.ReceivingFromPartner.Integration { - public class AdministrationGateway - : IAdministrationGateway + public class AdministrationGateway : RabbitMqProducer, IAdministrationGateway { - private readonly HttpClient _httpClient; - - public AdministrationGateway(HttpClient httpClient) - { - _httpClient = httpClient; - } + public AdministrationGateway(string exchangeType, string exchangeName, string routingKey, IChannel channel) : + base(exchangeType, exchangeName,routingKey, channel) { } public async Task NotifyAdminAboutPartnerManagerPromoCode(Guid partnerManagerId) { - var response = await _httpClient.PostAsync($"api/v1/employees/{partnerManagerId}/appliedPromocodes", - new StringContent(string.Empty)); + var message = new AdministrationDto() + { + PartnerId = partnerManagerId + }; - response.EnsureSuccessStatusCode(); + await Publish(message); } } } \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs index abaa7d33..f1f9908e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs @@ -1,24 +1,26 @@ -using System.Net.Http; -using System.Threading.Tasks; -using Pcf.ReceivingFromPartner.Integration.Dto; +using System.Threading.Tasks; +using Pcf.Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Abstractions.Gateways; using Pcf.ReceivingFromPartner.Core.Domain; +using Pcf.ReceivingFromPartner.Core.Dto; +using RabbitMQ.Client; namespace Pcf.ReceivingFromPartner.Integration { - public class GivingPromoCodeToCustomerGateway - : IGivingPromoCodeToCustomerGateway + public class GivingPromoCodeToCustomerGateway : + RabbitMqProducer, + IGivingPromoCodeToCustomerGateway { - private readonly HttpClient _httpClient; - - public GivingPromoCodeToCustomerGateway(HttpClient httpClient) - { - _httpClient = httpClient; - } + public GivingPromoCodeToCustomerGateway( + string exchangeType, + string exchangeName, + string routingKey, + IChannel channel): + base(exchangeType, exchangeName,routingKey, channel) { } public async Task GivePromoCodeToCustomer(PromoCode promoCode) { - var dto = new GivePromoCodeToCustomerDto() + var message = new GivePromoCodeToCustomerDto() { PartnerId = promoCode.Partner.Id, BeginDate = promoCode.BeginDate.ToShortDateString(), @@ -29,9 +31,7 @@ public async Task GivePromoCodeToCustomer(PromoCode promoCode) PartnerManagerId = promoCode.PartnerManagerId }; - var response = await _httpClient.PostAsJsonAsync("api/v1/promocodes", dto); - - response.EnsureSuccessStatusCode(); + await Publish(message); } } } \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj index 6f5336fe..6977a214 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj @@ -10,6 +10,7 @@ + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj index c646b37f..15b99d8e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj @@ -7,6 +7,7 @@ + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs new file mode 100644 index 00000000..3fade901 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs @@ -0,0 +1,7 @@ +namespace Pcf.ReceivingFromPartner.WebHost.Settings +{ + public class ApplicationSettings + { + public RmqSettings RmqSettings { get; set; } + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs index 532bb902..2e605f0b 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs @@ -1,10 +1,12 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; +using Pcf.Infrastructure.RabbitMq; using IConfiguration = Microsoft.Extensions.Configuration.IConfiguration; using Pcf.ReceivingFromPartner.Core.Abstractions.Repositories; using Pcf.ReceivingFromPartner.Core.Abstractions.Gateways; @@ -12,6 +14,8 @@ using Pcf.ReceivingFromPartner.DataAccess.Repositories; using Pcf.ReceivingFromPartner.DataAccess.Data; using Pcf.ReceivingFromPartner.Integration; +using Pcf.ReceivingFromPartner.WebHost.Settings; +using RabbitMQ.Client; namespace Pcf.ReceivingFromPartner.WebHost { @@ -34,15 +38,7 @@ public void ConfigureServices(IServiceCollection services) services.AddScoped(); services.AddScoped(); - services.AddHttpClient(c => - { - c.BaseAddress = new Uri(Configuration["IntegrationSettings:GivingToCustomerApiUrl"]); - }); - - services.AddHttpClient(c => - { - c.BaseAddress = new Uri(Configuration["IntegrationSettings:AdministrationApiUrl"]); - }); + CreateGateways(services).Wait(); services.AddDbContext(x => { @@ -61,6 +57,27 @@ public void ConfigureServices(IServiceCollection services) }); } + private async Task CreateGateways(IServiceCollection services) + { + var rmqSettings = Configuration.Get().RmqSettings; + var connection = await RabbitMqConfiguration.GetRabbitConnection(rmqSettings); + var channel = await connection.CreateChannelAsync(); + + services.AddSingleton(s => + new AdministrationGateway( + ExchangeType.Direct, + Configuration["AdministrationExchangeName"], + Configuration["AdministrationRoutingKey"], + channel)); + + services.AddSingleton(s => + new GivingPromoCodeToCustomerGateway( + ExchangeType.Direct, + Configuration["GivingPromoCodeToCustomerExchangeName"], + Configuration["GivingPromoCodeToCustomerRoutingKey"], + channel)); + } + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDbInitializer dbInitializer) { diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/appsettings.json b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/appsettings.json index b5bbc80d..0182af6b 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/appsettings.json +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/appsettings.json @@ -13,5 +13,16 @@ "GivingToCustomerApiUrl": "http://localhost:8093/", "AdministrationApiUrl": "http://localhost:8091/" }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "RmqSettings": { + "Host": "localhost", + "Port": 5672, + "VHost": "/", + "Login": "guest", + "Password": "guest" + }, + "AdministrationExchangeName": "exchange.administration", + "AdministrationRoutingKey": "routingKey.administration", + "GivingPromoCodeToCustomerExchangeName": "exchange.giving-promocode", + "GivingPromoCodeToCustomerRoutingKey": "routingKey.giving-promocode" } diff --git a/Homeworks/RabbitMQ/src/Pcf.sln b/Homeworks/RabbitMQ/src/Pcf.sln index 1c0b89b6..63bd7b77 100644 --- a/Homeworks/RabbitMQ/src/Pcf.sln +++ b/Homeworks/RabbitMQ/src/Pcf.sln @@ -37,6 +37,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.ReceivingFromPartner.We EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pcf.Administration.IntegrationTests", "Pcf.Administration\Pcf.Administration.IntegrationTests\Pcf.Administration.IntegrationTests.csproj", "{38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.Administration.Services", "Pcf.Administration.Services\Pcf.Administration.Services.csproj", "{C9546462-76BA-493D-941D-CF6F2A33A2CA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pcf.Infrastructure", "Pcf.Infrastructure", "{95C88752-23ED-4BB9-805D-2C7E3B230244}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.Infrastructure.RabbitMq", "Pcf.Infrastructure.RabbitMq\Pcf.Infrastructure.RabbitMq.csproj", "{8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.GivingToCustomer.Services", "Pcf.GivingToCustomer.Services\Pcf.GivingToCustomer.Services.csproj", "{A44231F9-5FEE-46AC-AF64-EEA66ADE019D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -99,6 +107,18 @@ Global {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}.Debug|Any CPU.Build.0 = Debug|Any CPU {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}.Release|Any CPU.ActiveCfg = Release|Any CPU {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}.Release|Any CPU.Build.0 = Release|Any CPU + {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Release|Any CPU.Build.0 = Release|Any CPU + {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Release|Any CPU.Build.0 = Release|Any CPU + {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -118,5 +138,8 @@ Global {9CA552AE-FAAA-40B5-BC89-040F041CA48E} = {45AAAE31-1D5D-400B-ADAA-DE16D7B95BD5} {3C4538FC-B200-4DC1-B278-DE43800B0BE3} = {45AAAE31-1D5D-400B-ADAA-DE16D7B95BD5} {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7} = {92A39EB2-4342-42A8-A30F-36DB3B5D2C95} + {C9546462-76BA-493D-941D-CF6F2A33A2CA} = {92A39EB2-4342-42A8-A30F-36DB3B5D2C95} + {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A} = {95C88752-23ED-4BB9-805D-2C7E3B230244} + {A44231F9-5FEE-46AC-AF64-EEA66ADE019D} = {F097559C-FEF3-49AE-A893-C9061181CEE2} EndGlobalSection EndGlobal From 692511c76e3319ac2745446b7a6c4a4b82015eda Mon Sep 17 00:00:00 2001 From: Sergey Avdeev Date: Wed, 16 Jul 2025 21:49:02 +0700 Subject: [PATCH 4/5] wip --- Homeworks/RabbitMQ/compose.yml | 59 ++++++++++--------- .../Employees/EmployeesMessage.cs | 6 -- .../Employees/IEmployeesService.cs | 8 --- .../Pcf.Administration.Services.csproj | 15 ----- .../src/Pcf.Administration/Dockerfile | 1 + .../Pcf.Administration.WebHost.csproj | 6 +- .../Services/Employees/AdministrationDto.cs | 8 +++ .../Services}/Employees/EmployeesService.cs | 11 ++-- .../Services/Employees/IEmployeesService.cs | 8 +++ .../Settings/ApplicationSettings.cs | 4 +- .../Pcf.Administration.WebHost/Startup.cs | 7 ++- .../appsettings.json | 7 +++ .../src/Pcf.Administration/nuget.config | 12 ++++ .../Pcf.GivingToCustomer.Services.csproj | 9 --- .../src/Pcf.GivingToCustomer/Dockerfile | 1 + .../Mappers/PromoCodeMapper.cs | 33 +++++++++++ .../Pcf.GivingToCustomer.WebHost.csproj | 1 + .../Promocodes/GivePromoCodeToCustomerDto.cs | 23 ++++++++ .../Services/Promocodes/IPromocodesService.cs | 8 +++ .../Services/Promocodes/PromocodesService.cs | 47 +++++++++++++++ .../Settings/ApplicationSettings.cs | 9 +++ .../Pcf.GivingToCustomer.WebHost/Startup.cs | 31 +++++++++- .../appsettings.json | 10 +++- .../src/Pcf.GivingToCustomer/nuget.config | 12 ++++ .../IRabbitMqConsumer.cs | 2 +- .../RabbitMqConfiguration.cs | 3 +- .../RabbitMqConsumer.cs | 2 +- .../RmqSettings.cs | 2 +- .../src/Pcf.ReceivingFromPartner/Dockerfile | 1 + .../Gateways/IAdministrationGateway.cs | 2 +- .../IGivingPromoCodeToCustomerGateway.cs | 2 +- .../Pcf.ReceivingFromPartner.Core.csproj | 2 +- .../AdministrationGateway.cs | 2 +- .../GivingPromoCodeToCustomerGateway.cs | 2 +- ...cf.ReceivingFromPartner.Integration.csproj | 1 + .../Pcf.ReceivingFromPartner.WebHost.csproj | 2 +- .../Settings/ApplicationSettings.cs | 2 + .../Startup.cs | 2 +- .../src/Pcf.ReceivingFromPartner/nuget.config | 12 ++++ Homeworks/RabbitMQ/src/Pcf.sln | 23 -------- Homeworks/RabbitMQ/src/nuget.config | 12 ++++ 41 files changed, 298 insertions(+), 112 deletions(-) delete mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs delete mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs delete mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/AdministrationDto.cs rename Homeworks/RabbitMQ/src/{Pcf.Administration.Services => Pcf.Administration/Pcf.Administration.WebHost/Services}/Employees/EmployeesService.cs (70%) create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/IEmployeesService.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.Administration/nuget.config delete mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj create mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/GivePromoCodeToCustomerDto.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/IPromocodesService.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/PromocodesService.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Settings/ApplicationSettings.cs create mode 100644 Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/nuget.config create mode 100644 Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/nuget.config create mode 100644 Homeworks/RabbitMQ/src/nuget.config diff --git a/Homeworks/RabbitMQ/compose.yml b/Homeworks/RabbitMQ/compose.yml index f761d423..19d7cc08 100644 --- a/Homeworks/RabbitMQ/compose.yml +++ b/Homeworks/RabbitMQ/compose.yml @@ -18,32 +18,6 @@ services: timeout: 5s retries: 5 - #Administration Db - promocode-factory-administration-db: - image: "postgres:latest" - container_name: 'promocode-factory-administration-db' - restart: always - ports: - - 5433:5432 - environment: - - POSTGRES_PASSWORD=docker - - #Administration Api - promocode-factory-administration-api: - build: src/Pcf.Administration/ - container_name: 'promocode-factory-administration-api' - restart: always - ports: - - "8091:8080" - environment: - - "ConnectionStrings:PromocodeFactoryAdministrationDb=Host=promocode-factory-administration-db;Database=promocode_factory_administration_db;Username=postgres;Password=docker" - depends_on: - promocode-factory-administration-db: - condition: service_started - rabbit: - condition: service_healthy - - #ReceivingFromPartner Db promocode-factory-receiving-from-partner-db: image: "postgres:latest" @@ -92,13 +66,44 @@ services: ports: - "8093:8080" environment: - - "ConnectionStrings:PromocodeFactoryGivingToCustomerDb=Host=promocode-factory-giving-to-customer-db;Database=promocode_factory_giving_to_customer_db;Username=postgres;Password=docker" + - "ConnectionStrings:PromocodeFactoryGivingToCustomerDb=Host=promocode-factory-giving-to-customer-db;Database=promocode_factory_giving_to_customer_db;Username=postgres;Password=docker" + - "RmqSettings:Host=rabbit" + - "RmqSettings:Login=myuser" + - "RmqSettings:Password=mypass" depends_on: promocode-factory-giving-to-customer-db: condition: service_started rabbit: condition: service_healthy + #Administration Db + promocode-factory-administration-db: + image: "postgres:latest" + container_name: 'promocode-factory-administration-db' + restart: always + ports: + - 5433:5432 + environment: + - POSTGRES_PASSWORD=docker + + #Administration Api + promocode-factory-administration-api: + build: src/Pcf.Administration/ + container_name: 'promocode-factory-administration-api' + restart: always + ports: + - "8091:8080" + environment: + - "ConnectionStrings:PromocodeFactoryAdministrationDb=Host=promocode-factory-administration-db;Database=promocode_factory_administration_db;Username=postgres;Password=docker" + - "RmqSettings:Host=rabbit" + - "RmqSettings:Login=myuser" + - "RmqSettings:Password=mypass" + depends_on: + promocode-factory-administration-db: + condition: service_started + rabbit: + condition: service_healthy + volumes: rabbitmq_data: diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs deleted file mode 100644 index 40496bb0..00000000 --- a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Pcf.Administration.Services.Employees; - -public class EmployeesMessage -{ - public Guid Id { get; set; } -} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs deleted file mode 100644 index 17cf3b8d..00000000 --- a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/IEmployeesService.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Pcf.Infrastructure.RabbitMq; - -namespace Pcf.Administration.Services.Employees; - -public interface IEmployeesService : IRabbitMqConsumer -{ - -} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj b/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj deleted file mode 100644 index 4afbc69e..00000000 --- a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Pcf.Administration.Services.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net8.0 - enable - enable - 12 - - - - - - - - diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Dockerfile b/Homeworks/RabbitMQ/src/Pcf.Administration/Dockerfile index 4db9c88e..f8376925 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Dockerfile +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Dockerfile @@ -5,6 +5,7 @@ WORKDIR /app # Copy the solution file and project files, then restore dependencies COPY *.sln . COPY */*.csproj ./ +COPY nuget.config . RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done RUN dotnet restore diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj index 2f285a99..583e8e5b 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj @@ -7,13 +7,13 @@ - + @@ -21,4 +21,8 @@ + + + + diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/AdministrationDto.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/AdministrationDto.cs new file mode 100644 index 00000000..d5a0744d --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/AdministrationDto.cs @@ -0,0 +1,8 @@ +using System; + +namespace Pcf.Administration.WebHost.Services.Employees; + +public class AdministrationDto +{ + public Guid PartnerId { get; set; } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/EmployeesService.cs similarity index 70% rename from Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs rename to Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/EmployeesService.cs index 19ceb7c4..8bd78363 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration.Services/Employees/EmployeesService.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/EmployeesService.cs @@ -1,13 +1,14 @@ using System.Text; using System.Text.Json; +using System.Threading.Tasks; +using Infrastructure.RabbitMq; using Pcf.Administration.Core.Abstractions.Repositories; using Pcf.Administration.Core.Domain.Administration; -using Pcf.Infrastructure.RabbitMq; using RabbitMQ.Client.Events; -namespace Pcf.Administration.Services.Employees; +namespace Pcf.Administration.WebHost.Services.Employees; -public class EmployeesService : RabbitMqConsumer, IEmployeesService +public class EmployeesService : RabbitMqConsumer, IEmployeesService { private readonly IRepository _employeeRepository; @@ -19,9 +20,9 @@ public EmployeesService(IRepository employeeRepository) protected override async Task OnConsumerOnReceivedAsync(object sender, BasicDeliverEventArgs e) { var body = e.Body; - var message = JsonSerializer.Deserialize(Encoding.UTF8.GetString(body.ToArray())); + var message = JsonSerializer.Deserialize(Encoding.UTF8.GetString(body.ToArray())); - var employee = await _employeeRepository.GetByIdAsync(message!.Id); + var employee = await _employeeRepository.GetByIdAsync(message!.PartnerId); if (employee == null) return; diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/IEmployeesService.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/IEmployeesService.cs new file mode 100644 index 00000000..d3ed1f0f --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Services/Employees/IEmployeesService.cs @@ -0,0 +1,8 @@ +using Infrastructure.RabbitMq; + +namespace Pcf.Administration.WebHost.Services.Employees; + +public interface IEmployeesService : IRabbitMqConsumer +{ + +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs index 3fade901..2e1c499d 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Settings/ApplicationSettings.cs @@ -1,4 +1,6 @@ -namespace Pcf.ReceivingFromPartner.WebHost.Settings +using Infrastructure.RabbitMq; + +namespace Pcf.Administration.WebHost.Settings { public class ApplicationSettings { diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs index a745cb4f..349d759f 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs @@ -11,9 +11,9 @@ using Pcf.Administration.Core.Abstractions.Repositories; using System; using System.Threading.Tasks; -using Pcf.Administration.Services.Employees; -using Pcf.Infrastructure.RabbitMq; -using Pcf.ReceivingFromPartner.WebHost.Settings; +using Infrastructure.RabbitMq; +using Pcf.Administration.WebHost.Services.Employees; +using Pcf.Administration.WebHost.Settings; using RabbitMQ.Client; namespace Pcf.Administration.WebHost @@ -102,6 +102,7 @@ public void Configure( Configuration["AdministrationExchangeName"]!, Configuration["AdministrationQueue"]!, Configuration["AdministrationRoutingKey"]!); + dbInitializer.InitializeDb(); } } diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json index b55be681..55a21428 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/appsettings.json @@ -10,6 +10,13 @@ "PromocodeFactoryAdministrationDb":"Host=localhost;Database=promocode_factory_administration_db;Username=postgres;Password=docker;Port=5433" }, "AllowedHosts": "*", + "RmqSettings": { + "Host": "localhost", + "Port": 5672, + "VHost": "/", + "Login": "guest", + "Password": "guest" + }, "AdministrationExchangeName": "exchange.administration", "AdministrationRoutingKey": "routingKey.administration", "AdministrationQueue": "queue.administration" diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/nuget.config b/Homeworks/RabbitMQ/src/Pcf.Administration/nuget.config new file mode 100644 index 00000000..a48aae93 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/nuget.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj deleted file mode 100644 index 3a635329..00000000 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer.Services/Pcf.GivingToCustomer.Services.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net8.0 - enable - enable - - - diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Dockerfile b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Dockerfile index e9a8bc8c..1dee44f6 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Dockerfile +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Dockerfile @@ -4,6 +4,7 @@ WORKDIR /app # Copy the solution file and project files, then restore dependencies COPY *.sln . +COPY nuget.config . COPY */*.csproj ./ RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done RUN dotnet restore diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Mappers/PromoCodeMapper.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Mappers/PromoCodeMapper.cs index ef7eb235..bf0b8518 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Mappers/PromoCodeMapper.cs +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Mappers/PromoCodeMapper.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Pcf.GivingToCustomer.Core.Domain; using Pcf.GivingToCustomer.WebHost.Models; +using Pcf.GivingToCustomer.WebHost.Services.Promocodes; namespace Pcf.GivingToCustomer.WebHost.Mappers { @@ -41,5 +42,37 @@ public static PromoCode MapFromModel(GivePromoCodeRequest request, Preference pr return promocode; } + + public static PromoCode MapFromModel(GivePromoCodeToCustomerDto dto, Preference preference, IEnumerable customers) + { + var promocode = new PromoCode(); + promocode.Id = dto.PromoCodeId; + + promocode.PartnerId = dto.PartnerId; + promocode.Code = dto.PromoCode; + promocode.ServiceInfo = dto.ServiceInfo; + + promocode.BeginDate = DateTime.Parse(dto.BeginDate); + promocode.EndDate = DateTime.Parse(dto.EndDate); + + promocode.Preference = preference; + promocode.PreferenceId = preference.Id; + + promocode.Customers = new List(); + + foreach (var item in customers) + { + promocode.Customers.Add(new PromoCodeCustomer() + { + + CustomerId = item.Id, + Customer = item, + PromoCodeId = promocode.Id, + PromoCode = promocode + }); + }; + + return promocode; + } } } diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj index 4fba074e..fe1f1e03 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj @@ -14,6 +14,7 @@ + diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/GivePromoCodeToCustomerDto.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/GivePromoCodeToCustomerDto.cs new file mode 100644 index 00000000..c0851ae4 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/GivePromoCodeToCustomerDto.cs @@ -0,0 +1,23 @@ +using System; + +namespace Pcf.GivingToCustomer.WebHost.Services.Promocodes +{ + public class GivePromoCodeToCustomerDto + { + public string ServiceInfo { get; set; } + + public Guid PartnerId { get; set; } + + public Guid PromoCodeId { get; set; } + + public string PromoCode { get; set; } + + public Guid PreferenceId { get; set; } + + public string BeginDate { get; set; } + + public string EndDate { get; set; } + + public Guid? PartnerManagerId { get; set; } + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/IPromocodesService.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/IPromocodesService.cs new file mode 100644 index 00000000..51ddce40 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/IPromocodesService.cs @@ -0,0 +1,8 @@ +using Infrastructure.RabbitMq; + +namespace Pcf.GivingToCustomer.WebHost.Services.Promocodes; + +public interface IPromocodesService : IRabbitMqConsumer +{ + +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/PromocodesService.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/PromocodesService.cs new file mode 100644 index 00000000..c1fdbbd5 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Services/Promocodes/PromocodesService.cs @@ -0,0 +1,47 @@ +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Infrastructure.RabbitMq; +using Pcf.GivingToCustomer.Core.Abstractions.Repositories; +using Pcf.GivingToCustomer.Core.Domain; +using Pcf.GivingToCustomer.WebHost.Mappers; +using RabbitMQ.Client.Events; + +namespace Pcf.GivingToCustomer.WebHost.Services.Promocodes; + +public class PromocodesService : RabbitMqConsumer, IPromocodesService +{ + private readonly IRepository _promoCodesRepository; + private readonly IRepository _preferencesRepository; + private readonly IRepository _customersRepository; + + public PromocodesService(IRepository promoCodesRepository, IRepository preferencesRepository, IRepository customersRepository) + { + _promoCodesRepository = promoCodesRepository; + _preferencesRepository = preferencesRepository; + _customersRepository = customersRepository; + } + + protected override async Task OnConsumerOnReceivedAsync(object sender, BasicDeliverEventArgs e) + { + var body = e.Body; + var message = JsonSerializer.Deserialize(Encoding.UTF8.GetString(body.ToArray())); + + var preference = await _preferencesRepository.GetByIdAsync(message!.PreferenceId); + + if (preference == null) + { + return; + } + + // Получаем клиентов с этим предпочтением: + var customers = await _customersRepository + .GetWhere(d => d.Preferences.Any(x => + x.Preference.Id == preference.Id)); + + PromoCode promoCode = PromoCodeMapper.MapFromModel(message, preference, customers); + + await _promoCodesRepository.AddAsync(promoCode); + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Settings/ApplicationSettings.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Settings/ApplicationSettings.cs new file mode 100644 index 00000000..9c80a733 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Settings/ApplicationSettings.cs @@ -0,0 +1,9 @@ +using Infrastructure.RabbitMq; + +namespace Pcf.GivingToCustomer.WebHost.Settings +{ + public class ApplicationSettings + { + public RmqSettings RmqSettings { get; set; } + } +} \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs index aedacea7..ece2538e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs @@ -1,4 +1,6 @@ using System; +using System.Threading.Tasks; +using Infrastructure.RabbitMq; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; @@ -12,6 +14,9 @@ using Pcf.GivingToCustomer.DataAccess; using Pcf.GivingToCustomer.DataAccess.Repositories; using Pcf.GivingToCustomer.Integration; +using Pcf.GivingToCustomer.WebHost.Services.Promocodes; +using Pcf.GivingToCustomer.WebHost.Settings; +using RabbitMQ.Client; namespace Pcf.GivingToCustomer.WebHost { @@ -40,6 +45,9 @@ public void ConfigureServices(IServiceCollection services) x.UseSnakeCaseNamingConvention(); x.UseLazyLoadingProxies(); }); + + ConfigureRabbitMq(services).Wait(); + services.AddScoped(); AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); @@ -49,9 +57,24 @@ public void ConfigureServices(IServiceCollection services) options.Version = "1.0"; }); } + + private async Task ConfigureRabbitMq(IServiceCollection services) + { + var rmqSettings = Configuration.Get().RmqSettings; + var connection = await RabbitMqConfiguration.GetRabbitConnection(rmqSettings); + + var channel = await connection.CreateChannelAsync(); + + services.AddSingleton(_ => channel); + } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDbInitializer dbInitializer) + public void Configure( + IApplicationBuilder app, + IWebHostEnvironment env, + IDbInitializer dbInitializer, + IPromocodesService promocodesService, + IChannel channel) { if (env.IsDevelopment()) { @@ -76,6 +99,12 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDbIniti { endpoints.MapControllers(); }); + + promocodesService.Register( + channel, + Configuration["GivingPromoCodeToCustomerExchangeName"]!, + Configuration["GivingPromoCodeToCustomerQueue"]!, + Configuration["GivingPromoCodeToCustomerRoutingKey"]!); dbInitializer.InitializeDb(); } diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json index 6d0079b2..eb3c6bbf 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/appsettings.json @@ -10,6 +10,14 @@ "PromocodeFactoryGivingToCustomerDb":"Host=localhost;Database=promocode_factory_givingToCustomer_db;Username=postgres;Password=docker;Port=5435" }, "AllowedHosts": "*", + "RmqSettings": { + "Host": "localhost", + "Port": 5672, + "VHost": "/", + "Login": "guest", + "Password": "guest" + }, "GivingPromoCodeToCustomerExchangeName": "exchange.giving-promocode", - "GivingPromoCodeToCustomerRoutingKey": "routingKey.giving-promocode" + "GivingPromoCodeToCustomerRoutingKey": "routingKey.giving-promocode", + "GivingPromoCodeToCustomerQueue": "queue.giving-promocode" } diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/nuget.config b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/nuget.config new file mode 100644 index 00000000..a48aae93 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/nuget.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs index 68b8cfb3..09d96ea6 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/IRabbitMqConsumer.cs @@ -2,7 +2,7 @@ namespace Pcf.Infrastructure.RabbitMq; -public interface IRabbitMqConsumer +public interface IRabbitMqConsumer { public Task Register(IChannel channel, string exchangeName, string queueName, string routingKey); } \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs index 64397885..160db3f0 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConfiguration.cs @@ -1,5 +1,4 @@ -using Pcf.ReceivingFromPartner.WebHost.Settings; -using RabbitMQ.Client; +using RabbitMQ.Client; namespace Pcf.Infrastructure.RabbitMq; diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs index 2c56a1c5..bb2b11fc 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RabbitMqConsumer.cs @@ -3,7 +3,7 @@ namespace Pcf.Infrastructure.RabbitMq; -public abstract class RabbitMqConsumer : IRabbitMqConsumer +public abstract class RabbitMqConsumer : IRabbitMqConsumer { public async Task Register(IChannel channel, string exchangeName, string queueName, string routingKey) { diff --git a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs index 90031b7f..aef0cdc8 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Infrastructure.RabbitMq/RmqSettings.cs @@ -1,4 +1,4 @@ -namespace Pcf.ReceivingFromPartner.WebHost.Settings +namespace Pcf.Infrastructure.RabbitMq { public class RmqSettings { diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Dockerfile b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Dockerfile index 2645897f..0796554d 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Dockerfile +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Dockerfile @@ -4,6 +4,7 @@ WORKDIR /app # Copy the solution file and project files, then restore dependencies COPY *.sln . +COPY nuget.config . COPY */*.csproj ./ RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done RUN dotnet restore diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs index cc865a91..0148ef4e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IAdministrationGateway.cs @@ -1,6 +1,6 @@ using System; using System.Threading.Tasks; -using Pcf.Infrastructure.RabbitMq; +using Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Dto; namespace Pcf.ReceivingFromPartner.Core.Abstractions.Gateways diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs index 53db591d..4551ffa0 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Abstractions/Gateways/IGivingPromoCodeToCustomerGateway.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using Pcf.Infrastructure.RabbitMq; +using Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Domain; using Pcf.ReceivingFromPartner.Core.Dto; diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj index 1d886919..511db7ab 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj @@ -5,7 +5,7 @@ - + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs index b97ccf8e..689e34f3 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/AdministrationGateway.cs @@ -1,6 +1,6 @@ using System; using System.Threading.Tasks; -using Pcf.Infrastructure.RabbitMq; +using Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Abstractions.Gateways; using Pcf.ReceivingFromPartner.Core.Dto; using RabbitMQ.Client; diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs index f1f9908e..48add7f9 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/GivingPromoCodeToCustomerGateway.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using Pcf.Infrastructure.RabbitMq; +using Infrastructure.RabbitMq; using Pcf.ReceivingFromPartner.Core.Abstractions.Gateways; using Pcf.ReceivingFromPartner.Core.Domain; using Pcf.ReceivingFromPartner.Core.Dto; diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj index 6977a214..41135bf5 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj @@ -9,6 +9,7 @@ + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj index 15b99d8e..5ffbb881 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj @@ -7,7 +7,6 @@ - @@ -15,6 +14,7 @@ + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs index 3fade901..d2a27451 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Settings/ApplicationSettings.cs @@ -1,3 +1,5 @@ +using Infrastructure.RabbitMq; + namespace Pcf.ReceivingFromPartner.WebHost.Settings { public class ApplicationSettings diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs index 2e605f0b..105bc855 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs @@ -1,12 +1,12 @@ using System; using System.Threading.Tasks; +using Infrastructure.RabbitMq; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; -using Pcf.Infrastructure.RabbitMq; using IConfiguration = Microsoft.Extensions.Configuration.IConfiguration; using Pcf.ReceivingFromPartner.Core.Abstractions.Repositories; using Pcf.ReceivingFromPartner.Core.Abstractions.Gateways; diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/nuget.config b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/nuget.config new file mode 100644 index 00000000..a48aae93 --- /dev/null +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/nuget.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.sln b/Homeworks/RabbitMQ/src/Pcf.sln index 63bd7b77..1c0b89b6 100644 --- a/Homeworks/RabbitMQ/src/Pcf.sln +++ b/Homeworks/RabbitMQ/src/Pcf.sln @@ -37,14 +37,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.ReceivingFromPartner.We EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pcf.Administration.IntegrationTests", "Pcf.Administration\Pcf.Administration.IntegrationTests\Pcf.Administration.IntegrationTests.csproj", "{38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.Administration.Services", "Pcf.Administration.Services\Pcf.Administration.Services.csproj", "{C9546462-76BA-493D-941D-CF6F2A33A2CA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pcf.Infrastructure", "Pcf.Infrastructure", "{95C88752-23ED-4BB9-805D-2C7E3B230244}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.Infrastructure.RabbitMq", "Pcf.Infrastructure.RabbitMq\Pcf.Infrastructure.RabbitMq.csproj", "{8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pcf.GivingToCustomer.Services", "Pcf.GivingToCustomer.Services\Pcf.GivingToCustomer.Services.csproj", "{A44231F9-5FEE-46AC-AF64-EEA66ADE019D}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -107,18 +99,6 @@ Global {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}.Debug|Any CPU.Build.0 = Debug|Any CPU {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}.Release|Any CPU.ActiveCfg = Release|Any CPU {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7}.Release|Any CPU.Build.0 = Release|Any CPU - {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9546462-76BA-493D-941D-CF6F2A33A2CA}.Release|Any CPU.Build.0 = Release|Any CPU - {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A}.Release|Any CPU.Build.0 = Release|Any CPU - {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A44231F9-5FEE-46AC-AF64-EEA66ADE019D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -138,8 +118,5 @@ Global {9CA552AE-FAAA-40B5-BC89-040F041CA48E} = {45AAAE31-1D5D-400B-ADAA-DE16D7B95BD5} {3C4538FC-B200-4DC1-B278-DE43800B0BE3} = {45AAAE31-1D5D-400B-ADAA-DE16D7B95BD5} {38F1FFB6-5EBF-4EDF-B74E-AF29B0F1ABF7} = {92A39EB2-4342-42A8-A30F-36DB3B5D2C95} - {C9546462-76BA-493D-941D-CF6F2A33A2CA} = {92A39EB2-4342-42A8-A30F-36DB3B5D2C95} - {8F9DF345-2DE6-474E-A2F7-EEFF7E05161A} = {95C88752-23ED-4BB9-805D-2C7E3B230244} - {A44231F9-5FEE-46AC-AF64-EEA66ADE019D} = {F097559C-FEF3-49AE-A893-C9061181CEE2} EndGlobalSection EndGlobal diff --git a/Homeworks/RabbitMQ/src/nuget.config b/Homeworks/RabbitMQ/src/nuget.config new file mode 100644 index 00000000..a48aae93 --- /dev/null +++ b/Homeworks/RabbitMQ/src/nuget.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From dea4f2861d7268ab22eadb6f1573f35266fbb9e2 Mon Sep 17 00:00:00 2001 From: Sergey Avdeev Date: Mon, 21 Jul 2025 22:52:47 +0700 Subject: [PATCH 5/5] fixes --- Homeworks/RabbitMQ/compose.yml | 8 ++--- .../Pcf.Administration.WebHost.csproj | 2 +- .../Pcf.Administration.WebHost/Startup.cs | 4 +-- .../Pcf.GivingToCustomer.WebHost.csproj | 2 +- .../Pcf.GivingToCustomer.WebHost/Startup.cs | 4 +-- .../Pcf.ReceivingFromPartner.Core.csproj | 2 +- ...cf.ReceivingFromPartner.Integration.csproj | 2 +- .../Pcf.ReceivingFromPartner.WebHost.csproj | 2 +- .../Startup.cs | 32 +++++++++++++------ 9 files changed, 35 insertions(+), 23 deletions(-) diff --git a/Homeworks/RabbitMQ/compose.yml b/Homeworks/RabbitMQ/compose.yml index 19d7cc08..e3644b6e 100644 --- a/Homeworks/RabbitMQ/compose.yml +++ b/Homeworks/RabbitMQ/compose.yml @@ -107,7 +107,7 @@ services: volumes: rabbitmq_data: -networks: - default: - name: myLocalNetwork # создана извне: docker network create --driver=bridge myLocalNetwork - external: true \ No newline at end of file +#networks: +# default: +# name: myLocalNetwork # создана извне: docker network create --driver=bridge myLocalNetwork +# external: true \ No newline at end of file diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj index 583e8e5b..01c224fd 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Pcf.Administration.WebHost.csproj @@ -13,7 +13,7 @@ - + diff --git a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs index 349d759f..992506f2 100644 --- a/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.Administration/Pcf.Administration.WebHost/Startup.cs @@ -33,7 +33,7 @@ public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddMvcOptions(x => x.SuppressAsyncSuffixInActionNames = false); - services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); + services.AddSingleton(typeof(IRepository<>), typeof(EfRepository<>)); services.AddScoped(); services.AddDbContext(x => { @@ -44,7 +44,7 @@ public void ConfigureServices(IServiceCollection services) }); ConfigureRabbitMq(services).Wait(); - services.AddScoped(); + services.AddSingleton(); AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj index fe1f1e03..b56ca11e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Pcf.GivingToCustomer.WebHost.csproj @@ -14,7 +14,7 @@ - + diff --git a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs index ece2538e..890894ff 100644 --- a/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Startup.cs @@ -35,7 +35,7 @@ public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddMvcOptions(x => x.SuppressAsyncSuffixInActionNames = false); - services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); + services.AddSingleton(typeof(IRepository<>), typeof(EfRepository<>)); services.AddScoped(); services.AddScoped(); services.AddDbContext(x => @@ -47,7 +47,7 @@ public void ConfigureServices(IServiceCollection services) }); ConfigureRabbitMq(services).Wait(); - services.AddScoped(); + services.AddSingleton(); AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj index 511db7ab..4c94d65e 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Core/Pcf.ReceivingFromPartner.Core.csproj @@ -5,7 +5,7 @@ - + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj index 41135bf5..3addb932 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.Integration/Pcf.ReceivingFromPartner.Integration.csproj @@ -9,7 +9,7 @@ - + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj index 5ffbb881..3e090479 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Pcf.ReceivingFromPartner.WebHost.csproj @@ -14,7 +14,7 @@ - + diff --git a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs index 105bc855..b1289fe8 100644 --- a/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs +++ b/Homeworks/RabbitMQ/src/Pcf.ReceivingFromPartner/Pcf.ReceivingFromPartner.WebHost/Startup.cs @@ -63,19 +63,28 @@ private async Task CreateGateways(IServiceCollection services) var connection = await RabbitMqConfiguration.GetRabbitConnection(rmqSettings); var channel = await connection.CreateChannelAsync(); - services.AddSingleton(s => - new AdministrationGateway( + services.AddSingleton(provider => + { + var configuration = provider.GetRequiredService(); + + return new AdministrationGateway( ExchangeType.Direct, - Configuration["AdministrationExchangeName"], - Configuration["AdministrationRoutingKey"], - channel)); + configuration["AdministrationExchangeName"], + configuration["AdministrationRoutingKey"], + channel + ); + }); - services.AddSingleton(s => - new GivingPromoCodeToCustomerGateway( + services.AddSingleton(provider => + { + var configuration = provider.GetRequiredService(); + return new GivingPromoCodeToCustomerGateway( ExchangeType.Direct, - Configuration["GivingPromoCodeToCustomerExchangeName"], - Configuration["GivingPromoCodeToCustomerRoutingKey"], - channel)); + configuration["GivingPromoCodeToCustomerExchangeName"], + configuration["GivingPromoCodeToCustomerRoutingKey"], + channel + ); + }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -105,6 +114,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDbIniti endpoints.MapControllers(); }); + app.ApplicationServices.GetRequiredService(); + app.ApplicationServices.GetRequiredService(); + dbInitializer.InitializeDb(); } }