diff --git a/.editorconfig b/.editorconfig index 69fcc69ea..ef856cdce 100644 --- a/.editorconfig +++ b/.editorconfig @@ -43,7 +43,7 @@ insert_final_newline = false # Organize usings dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = false +dotnet_sort_system_directives_first = true file_header_template = unset # this. and Me. preferences diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Configuration/DependencyInjection.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Configuration/DependencyInjection.cs index 5644282c2..5b5a6e7ea 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Configuration/DependencyInjection.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Configuration/DependencyInjection.cs @@ -1,11 +1,16 @@ namespace Podkrepibg.Campaigns.Application.Configuration { + using System.Reflection; + using MediatR; + using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; public static class DependencyInjection { - public static IServiceCollection AddApplication(IServiceCollection services) + public static IServiceCollection AddApplication(this IServiceCollection services, IConfiguration configuration) { + services.AddMediatR(Assembly.GetExecutingAssembly()); + return services; } } diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Data/IApplicationDbContext.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Data/IApplicationDbContext.cs new file mode 100644 index 000000000..cc696d8ab --- /dev/null +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Data/IApplicationDbContext.cs @@ -0,0 +1,18 @@ +namespace Podkrepibg.Campaigns.Application.Data +{ + using System.Threading; + using System.Threading.Tasks; + using Microsoft.EntityFrameworkCore; + using Podkrepibg.Campaigns.Domain.Entities; + + public interface IApplicationDbContext + { + public DbSet CampaignTypes { get; set; } + + public DbSet CampaignSubTypes { get; set; } + + public DbSet Campaigns { get; set; } + + Task SaveChangesAsync(CancellationToken cancellationToken); + } +} diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Podkrepibg.Campaigns.Application.csproj b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Podkrepibg.Campaigns.Application.csproj index 83af574c0..351f0ef77 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Podkrepibg.Campaigns.Application.csproj +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Podkrepibg.Campaigns.Application.csproj @@ -6,6 +6,7 @@ + @@ -19,4 +20,8 @@ + + + + diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Queries/GetCampaigns/GetCampaignDetailsQuery.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Queries/GetCampaigns/GetCampaignDetailsQuery.cs new file mode 100644 index 000000000..ab22c3020 --- /dev/null +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Queries/GetCampaigns/GetCampaignDetailsQuery.cs @@ -0,0 +1,27 @@ +namespace Podkrepibg.Campaigns.Application.Queries.GetCampaigns +{ + using System.Threading; + using System.Threading.Tasks; + using MediatR; + using Podkrepibg.Campaigns.Application.Data; + + public class GetCampaignDetailsQuery : IRequest + { + public string Id { get; set; } + } + + public class GetCampaignDetailsQueryHandler : IRequestHandler + { + private readonly IApplicationDbContext _dbContext; + + public GetCampaignDetailsQueryHandler(IApplicationDbContext dbContext) + { + _dbContext = dbContext; + } + + public Task Handle(GetCampaignDetailsQuery request, CancellationToken cancellationToken) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Queries/GetCampaigns/GetCampaignsQuery.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Queries/GetCampaigns/GetCampaignsQuery.cs deleted file mode 100644 index 365e18ccc..000000000 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Application/Queries/GetCampaigns/GetCampaignsQuery.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Podkrepibg.Campaigns.Application.Queries -{ - public class GetCampaignsQuery - { - } -} diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/Campaign.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/Campaign.cs index 35a5d3698..e0acbb259 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/Campaign.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/Campaign.cs @@ -1,8 +1,8 @@ -using System; -using Podkrepibg.Campaigns.Domain.Types; - namespace Podkrepibg.Campaigns.Domain.Entities { + using System; + using Podkrepibg.Campaigns.Domain.Types; + public class Campaign { public Guid Id { get; set; } diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignSubType.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignSubType.cs index d5cffba11..6448fd9bd 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignSubType.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignSubType.cs @@ -1,7 +1,7 @@ -using System; - namespace Podkrepibg.Campaigns.Domain.Entities { + using System; + public class CampaignSubType { public Guid Id { get; set; } diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignType.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignType.cs index dc4e780a4..99a0ad4b8 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignType.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Domain/Entities/CampaignType.cs @@ -1,8 +1,8 @@ -using System; -using System.Collections.Generic; - namespace Podkrepibg.Campaigns.Domain.Entities { + using System; + using System.Collections.Generic; + public class CampaignType { public Guid Id { get; set; } diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Configuration/DependencyInjection.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Configuration/DependencyInjection.cs new file mode 100644 index 000000000..aebfb9d65 --- /dev/null +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Configuration/DependencyInjection.cs @@ -0,0 +1,21 @@ +namespace Podkrepibg.Campaigns.Infrastructure.Configuration +{ + using Microsoft.EntityFrameworkCore; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.DependencyInjection; + using Podkrepibg.Campaigns.Application.Data; + using Podkrepibg.Campaigns.Infrastructure.Persistence; + + public static class DependencyInjection + { + public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) + { + services.AddScoped(provider => provider.GetService()); + + services.AddDbContext( + options => options.UseNpgsql(configuration.GetConnectionString("CampaignDb"))); + + return services; + } + } +} diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/CampaignsContext.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/CampaignsContext.cs index 5c9ab4f0c..e6aa3d9dc 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/CampaignsContext.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/CampaignsContext.cs @@ -1,10 +1,11 @@ -using Microsoft.EntityFrameworkCore; -using Podkrepibg.Campaigns.Domain.Entities; -using System.Reflection; - -namespace Podkrepibg.Campaigns.Data +namespace Podkrepibg.Campaigns.Infrastructure.Persistence { - public class CampaignsContext : DbContext + using System.Reflection; + using Microsoft.EntityFrameworkCore; + using Podkrepibg.Campaigns.Application.Data; + using Podkrepibg.Campaigns.Domain.Entities; + + public class CampaignsContext : DbContext, IApplicationDbContext { public DbSet CampaignTypes { get; set; } public DbSet CampaignSubTypes { get; set; } diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignConfiguration.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignConfiguration.cs index ec467d995..710367493 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignConfiguration.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignConfiguration.cs @@ -1,11 +1,11 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Newtonsoft.Json; -using Podkrepibg.Campaigns.Domain.Entities; -using Podkrepibg.Campaigns.Domain.Types; - namespace Podkrepibg.Campaigns.Infrastructure.Persistence.Configurations { + using Microsoft.EntityFrameworkCore; + using Microsoft.EntityFrameworkCore.Metadata.Builders; + using Newtonsoft.Json; + using Podkrepibg.Campaigns.Domain.Entities; + using Podkrepibg.Campaigns.Domain.Types; + public class CampaignConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignSubTypeConfiguration.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignSubTypeConfiguration.cs index d83956025..afdaf81cd 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignSubTypeConfiguration.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignSubTypeConfiguration.cs @@ -1,9 +1,9 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Podkrepibg.Campaigns.Domain.Entities; - namespace Podkrepibg.Campaigns.Infrastructure.Persistence.Configurations { + using Microsoft.EntityFrameworkCore; + using Microsoft.EntityFrameworkCore.Metadata.Builders; + using Podkrepibg.Campaigns.Domain.Entities; + public class CampaignSubTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignTypeConfiguration.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignTypeConfiguration.cs index 06d620a90..025075dd1 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignTypeConfiguration.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Persistence/Configurations/CampaignTypeConfiguration.cs @@ -1,9 +1,9 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Podkrepibg.Campaigns.Domain.Entities; - namespace Podkrepibg.Campaigns.Infrastructure.Persistence.Configurations { + using Microsoft.EntityFrameworkCore; + using Microsoft.EntityFrameworkCore.Metadata.Builders; + using Podkrepibg.Campaigns.Domain.Entities; + public class CampaignTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Podkrepibg.Campaigns.Infrastructure.csproj b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Podkrepibg.Campaigns.Infrastructure.csproj index 74b668ac7..88d2bcd93 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Podkrepibg.Campaigns.Infrastructure.csproj +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns.Infrastructure/Podkrepibg.Campaigns.Infrastructure.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5 @@ -10,7 +10,7 @@ - + diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns/Program.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns/Program.cs index 3aa950336..e0811d961 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns/Program.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns/Program.cs @@ -1,9 +1,9 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - namespace Podkrepibg.Campaigns { + using Microsoft.AspNetCore.Hosting; + using Microsoft.Extensions.Hosting; + using Microsoft.Extensions.Logging; + public class Program { public static void Main(string[] args) diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns/Services/CampaignsService.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns/Services/CampaignsService.cs index d63e26b4a..e8d46e753 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns/Services/CampaignsService.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns/Services/CampaignsService.cs @@ -1,39 +1,25 @@ -using System; -using System.Threading.Tasks; -using Google.Protobuf.WellKnownTypes; -using Grpc.Core; -using Microsoft.Extensions.Logging; -using Podkrepibg.Nomenclatures; - namespace Podkrepibg.Campaigns.Services { + using System; + using System.Threading.Tasks; + using Google.Protobuf.WellKnownTypes; + using Grpc.Core; + public class CampaignsService : CampaignService.CampaignServiceBase { - private readonly ILogger _logger; - - public CampaignsService(ILogger logger) + public CampaignsService() { - _logger = logger; } - public override Task CreateCampaign(CreateCampaignRequest request, ServerCallContext context) + public override Task CreateCampaign(CreateCampaignRequest request, ServerCallContext context) { return Task.FromResult( - new Campaign() + new CreateCampaignResponse() { - BeneficiaryId = request.BeneficiaryId, - Id = Guid.NewGuid().ToString(), - InitiatorId = request.InitiatorId, - OperatorId = request.OperatorId, - State = CampaignState.Draft + Id = Guid.NewGuid().ToString() }); } - public override Task ListCampaignTypes(Empty request, ServerCallContext context) - { - return base.ListCampaignTypes(request, context); - } - public override Task FilterCampaigns(FilterCampaignsRequest request, ServerCallContext context) { return base.FilterCampaigns(request, context); @@ -43,5 +29,15 @@ public override Task ListCampaigns(ListCampaignsRequest reque { return base.ListCampaigns(request, context); } + + public override Task GetCampaignDetails(GetCampaignDetailsRequest request, ServerCallContext context) + { + return base.GetCampaignDetails(request, context); + } + + public override Task ListCampaignTypes(Empty request, ServerCallContext context) + { + return base.ListCampaignTypes(request, context); + } } } diff --git a/backend/module-campaigns/src/Podkrepibg.Campaigns/Startup.cs b/backend/module-campaigns/src/Podkrepibg.Campaigns/Startup.cs index ccf9a8f57..86ba4bfe8 100644 --- a/backend/module-campaigns/src/Podkrepibg.Campaigns/Startup.cs +++ b/backend/module-campaigns/src/Podkrepibg.Campaigns/Startup.cs @@ -1,14 +1,14 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Podkrepibg.Campaigns.Data; - namespace Podkrepibg.Campaigns { + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Hosting; + using Microsoft.AspNetCore.Http; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.Hosting; + using Podkrepibg.Campaigns.Application.Configuration; + using Podkrepibg.Campaigns.Infrastructure.Configuration; + public class Startup { private IConfigurationRoot Configuration { get; set; } @@ -28,9 +28,9 @@ public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); services.AddOptions(); - services.AddSingleton(Configuration); - services.AddDbContext(options => - options.UseNpgsql(Configuration.GetConnectionString("CampaignDb"))); + + services.AddApplication(Configuration); + services.AddInfrastructure(Configuration); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/backend/protos/campaign.proto b/backend/protos/campaign.proto index eb0ea0921..5577ecb2e 100644 --- a/backend/protos/campaign.proto +++ b/backend/protos/campaign.proto @@ -12,110 +12,125 @@ import "google/protobuf/timestamp.proto"; service CampaignService { - // creates a new campaign - rpc CreateCampaign (CreateCampaignRequest) returns (Campaign); + rpc CreateCampaign (CreateCampaignRequest) returns (CreateCampaignResponse); - // list campaigns rpc ListCampaigns (ListCampaignsRequest) returns (CampaignsResponse); + rpc FilterCampaigns (FilterCampaignsRequest) returns (CampaignsResponse); + rpc ListCampaignTypes (google.protobuf.Empty) returns (CampaignTypesResponse); - rpc FilterCampaigns (FilterCampaignsRequest) returns (CampaignsResponse); + rpc GetCampaignDetails (GetCampaignDetailsRequest) returns (CampaignDetails); } message CreateCampaignRequest { string initiator_id = 1; - string operator_id = 2; - string beneficiary_id = 3; - string title = 4; } -message CampaignTypesResponse { - repeated CampaignType campaign_types = 1; +message CreateCampaignResponse { + + string id = 1; } -message CampaignType { +message ListCampaignsRequest { +} - string id = 1; +message FilterCampaignsRequest { - string campaign_type_name = 2; + string campaign_type_id = 1; + string campaign_sub_type_id = 2; + common.nomenclatures.CampaignState state = 3; + string operator_id = 4; + string initiator_id = 5; + string beneficiary_id = 6; +} - string campaign_type_descr = 3; +message CampaignsResponse { - repeated CampaignSubType sub_types = 4; + repeated Campaign campaigns = 1; } -message CampaignSubType { +message CampaignTypesResponse { - string id = 1; + repeated CampaignTypeDetails campaign_types = 1; +} - string campaign_sub_type_name = 2; +message GetCampaignDetailsRequest { - string campaign_sub_type_descr = 3; + string id = 1; } -message FilterCampaignsRequest { +message CampaignType { - CampaignType campaign_types = 1; + string id = 1; + string name = 2; +} - CampaignSubType campaign_sub_type = 2; +message CampaignTypeDetails { - common.nomenclatures.CampaignState state = 3; + string id = 1; + string name = 2; + string description = 3; + repeated CampaignSubTypeDetails sub_types = 4; +} - string operator_id = 4; +message CampaignSubType { - string initiator_id = 5; + string id = 1; + string name = 2; +} - string beneficiary_id = 6; +message CampaignSubTypeDetails { + + string id = 1; + string name = 2; + string description = 3; } message Campaign { string id = 1; - string initiator_id = 2; - string operator_id = 3; - string beneficiary_id = 4; - common.nomenclatures.CampaignState state = 5; - CampaignType campaign_type = 6; - CampaignSubType campaignSubTypes = 7; - string title = 8; - string short_description = 9; + uint32 target_amount = 11; + common.nomenclatures.CurrencyCode currency = 12; + uint32 raised_funds = 13; + uint32 payed_out = 14; +} - string full_description = 10; +message CampaignDetails { + string id = 1; + string initiator_id = 2; + string operator_id = 3; + string beneficiary_id = 4; + common.nomenclatures.CampaignState state = 5; + CampaignType campaign_type = 6; + CampaignSubType campaignSubTypes = 7; + string title = 8; + string short_description = 9; + string full_description = 10; uint32 target_amount = 11; - common.nomenclatures.CurrencyCode currency = 12; - uint32 raised_funds = 13; - uint32 payed_out = 14; - repeated Donation donations = 15; } message Donation { + string donor_display_name = 1; uint32 amount = 2; string message = 3; google.protobuf.Timestamp date = 4; } - -message ListCampaignsRequest { -} - -message CampaignsResponse { - repeated Campaign campaigns = 1; -}