diff --git a/PracticeCalendar.Api/Controllers/ProductsController.cs b/PracticeCalendar.Api/Controllers/ProductsController.cs new file mode 100644 index 0000000..0a3456c --- /dev/null +++ b/PracticeCalendar.Api/Controllers/ProductsController.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc; +using PracticeCalendar.API.Controllers; +using PracticeCalendar.Application.Products.Queries; +using PracticeCalendar.Application.Products.Queries.GetProducts; + +namespace PracticeCalendar.Api.Controllers +{ + public class ProductsController : ApiControllerBase + { + private readonly ILogger logger; + + public ProductsController(ILogger logger) + { + this.logger = logger; + } + + [HttpGet] + public async Task>> Get() + { + return await Mediator.Send(new GetProductsQuery()); + } + } +} \ No newline at end of file diff --git a/PracticeCalendar.Api/Program.cs b/PracticeCalendar.Api/Program.cs index fae36e4..d4b3e9b 100644 --- a/PracticeCalendar.Api/Program.cs +++ b/PracticeCalendar.Api/Program.cs @@ -9,7 +9,7 @@ namespace PracticeCalendar { public class Program { - public static void Main(string[] args) + public static async Task Main(string[] args) { var builder = WebApplication.CreateBuilder(args); @@ -51,13 +51,11 @@ namespace PracticeCalendar using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; - try { - var context = services.GetRequiredService(); - //context.Database.Migrate(); - context.Database.EnsureCreated(); - //SeedData.Initialize(services); + var initialiser = services.GetRequiredService(); + await initialiser.InitialiseAsync(); + await initialiser.SeedAsync(); } catch (Exception ex) { diff --git a/PracticeCalendar.Api/practicecalendar.sqlite b/PracticeCalendar.Api/practicecalendar.sqlite index e0f4ddb..33a537a 100644 Binary files a/PracticeCalendar.Api/practicecalendar.sqlite and b/PracticeCalendar.Api/practicecalendar.sqlite differ diff --git a/PracticeCalendar.Application/ConfigureServices.cs b/PracticeCalendar.Application/ConfigureServices.cs index f7f9435..7b1ec2a 100644 --- a/PracticeCalendar.Application/ConfigureServices.cs +++ b/PracticeCalendar.Application/ConfigureServices.cs @@ -3,7 +3,10 @@ using MapsterMapper; using MediatR; using Microsoft.Extensions.DependencyInjection; using PracticeCalendar.Application.PracticeEvents.Queries; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Application.Products.Queries; +using PracticeCalendar.Domain.Entities.PracticeEvent; +using PracticeCalendar.Domain.Entities.Product; +using PracticeCalendar.Domain.ValueObjects; using System.Reflection; namespace PracticeCalendar.Application @@ -23,11 +26,35 @@ namespace PracticeCalendar.Application TypeAdapterConfig.GlobalSettings.Default.MapToConstructor(true); TypeAdapterConfig.GlobalSettings.NewConfig() .ConstructUsing(src => new PracticeEvent(src.Title, src.Description, src.StartTime, src.EndTime)); - + var mapsterConfig = new TypeAdapterConfig(); mapsterConfig.NewConfig() .MapToConstructor(true) .ConstructUsing(src => new PracticeEvent(src.Title, src.Description, src.StartTime, src.EndTime)); + mapsterConfig.NewConfig() + .MapToConstructor(true) + .ConstructUsing(src => new Product() + { + Id = src.Id, + Category = src.Category, + Name = src.Name, + UnitPrice = new Price + { + Value = src.UnitPrice, + Currency = src.UnitPriceCurrency + } + }); + mapsterConfig + .ForType() + .MapWith(src => new ProductDto + { + Id = src.Id, + Name = src.Name, + Category = src.Category, + UnitPrice = src.UnitPrice.Value, + UnitPriceCurrency = src.UnitPrice.Currency + }) + ; services.AddSingleton(new Mapper(mapsterConfig)); return services; diff --git a/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeAcceptEventCommand.cs b/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeAcceptEventCommand.cs index 0461478..3218806 100644 --- a/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeAcceptEventCommand.cs +++ b/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeAcceptEventCommand.cs @@ -1,7 +1,7 @@ using MediatR; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; -using PracticeCalendar.Domain.Entities.Specifications; +using PracticeCalendar.Domain.Entities.PracticeEvent; +using PracticeCalendar.Domain.Entities.PracticeEvent.Specifications; using PracticeCalendar.Domain.Exceptions; namespace PracticeCalendar.Application.PracticeEvents.Commands @@ -29,7 +29,7 @@ namespace PracticeCalendar.Application.PracticeEvents.Commands public async Task Handle(AttendeeAcceptEventCommand request, CancellationToken cancellationToken) { - var spec = new PracticeEventByIdWithAttendees(request.EventId); + var spec = new PracticeEventByIdWithAttendeesSpecification(request.EventId); var practiceEvent = await eventsRepo.FirstOrDefaultAsync(spec, cancellationToken); if (practiceEvent == null) { @@ -37,7 +37,7 @@ namespace PracticeCalendar.Application.PracticeEvents.Commands } practiceEvent.AttendeeAcceptEvent(request.AttendeeId); await eventsRepo.SaveChangesAsync(cancellationToken); - + return Unit.Value; } } diff --git a/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeDeclineEventCommand.cs b/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeDeclineEventCommand.cs index a7d1908..62aec16 100644 --- a/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeDeclineEventCommand.cs +++ b/PracticeCalendar.Application/PracticeEvents/Commands/AttendeeDeclineEventCommand.cs @@ -1,7 +1,7 @@ using MediatR; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; -using PracticeCalendar.Domain.Entities.Specifications; +using PracticeCalendar.Domain.Entities.PracticeEvent; +using PracticeCalendar.Domain.Entities.PracticeEvent.Specifications; using PracticeCalendar.Domain.Exceptions; namespace PracticeCalendar.Application.PracticeEvents.Commands @@ -29,14 +29,14 @@ namespace PracticeCalendar.Application.PracticeEvents.Commands public async Task Handle(AttendeeDeclineEventCommand request, CancellationToken cancellationToken) { - var spec = new PracticeEventByIdWithAttendees(request.EventId); + var spec = new PracticeEventByIdWithAttendeesSpecification(request.EventId); var practiceEvent = await eventsRepo.FirstOrDefaultAsync(spec, cancellationToken); if (practiceEvent == null) { throw new PracticeEventNotFoundException(); } practiceEvent.AttendeeDeclineEvent(request.AttendeeId); - + return Unit.Value; } } diff --git a/PracticeCalendar.Application/PracticeEvents/Commands/CreatePracticeEventCommand.cs b/PracticeCalendar.Application/PracticeEvents/Commands/CreatePracticeEventCommand.cs index 149494c..7daaaf1 100644 --- a/PracticeCalendar.Application/PracticeEvents/Commands/CreatePracticeEventCommand.cs +++ b/PracticeCalendar.Application/PracticeEvents/Commands/CreatePracticeEventCommand.cs @@ -2,7 +2,7 @@ using MediatR; using PracticeCalendar.Application.PracticeEvents.Queries; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Application.PracticeEvents.Commands { diff --git a/PracticeCalendar.Application/PracticeEvents/Commands/DeletePracticeEventCommand.cs b/PracticeCalendar.Application/PracticeEvents/Commands/DeletePracticeEventCommand.cs index fe82131..7cb79be 100644 --- a/PracticeCalendar.Application/PracticeEvents/Commands/DeletePracticeEventCommand.cs +++ b/PracticeCalendar.Application/PracticeEvents/Commands/DeletePracticeEventCommand.cs @@ -1,6 +1,6 @@ using MediatR; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; using PracticeCalendar.Domain.Exceptions; namespace PracticeCalendar.Application.PracticeEvents.Commands @@ -32,7 +32,7 @@ namespace PracticeCalendar.Application.PracticeEvents.Commands } await eventsRepo.DeleteAsync(org, cancellationToken); await eventsRepo.SaveChangesAsync(cancellationToken); - + return Unit.Value; } } diff --git a/PracticeCalendar.Application/PracticeEvents/Commands/UpdatePracticeEventCommand.cs b/PracticeCalendar.Application/PracticeEvents/Commands/UpdatePracticeEventCommand.cs index d829ff8..4cd4728 100644 --- a/PracticeCalendar.Application/PracticeEvents/Commands/UpdatePracticeEventCommand.cs +++ b/PracticeCalendar.Application/PracticeEvents/Commands/UpdatePracticeEventCommand.cs @@ -2,7 +2,7 @@ using MediatR; using PracticeCalendar.Application.PracticeEvents.Queries; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; using PracticeCalendar.Domain.Exceptions; namespace PracticeCalendar.Application.PracticeEvents.Commands diff --git a/PracticeCalendar.Application/PracticeEvents/Queries/GetPracticeEvents/GetPracticeEventsQuery.cs b/PracticeCalendar.Application/PracticeEvents/Queries/GetPracticeEvents/GetPracticeEventsQuery.cs index f062e6b..1003a14 100644 --- a/PracticeCalendar.Application/PracticeEvents/Queries/GetPracticeEvents/GetPracticeEventsQuery.cs +++ b/PracticeCalendar.Application/PracticeEvents/Queries/GetPracticeEvents/GetPracticeEventsQuery.cs @@ -3,8 +3,8 @@ using MapsterMapper; using MediatR; using Microsoft.Extensions.Logging; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; -using PracticeCalendar.Domain.Entities.Specifications; +using PracticeCalendar.Domain.Entities.PracticeEvent; +using PracticeCalendar.Domain.Entities.PracticeEvent.Specifications; namespace PracticeCalendar.Application.PracticeEvents.Queries.GetPracticeEvents { @@ -29,7 +29,7 @@ namespace PracticeCalendar.Application.PracticeEvents.Queries.GetPracticeEvents public async Task> Handle(GetPracticeEventsQuery request, CancellationToken cancellationToken) { - var spec = new PracticeEventsWithAttendees(); + var spec = new PracticeEventsWithAttendeesSpecification(); var evList = await eventsRepo.ListAsync(spec, cancellationToken); var lst = evList.Adapt>(mapper.Config); return lst; diff --git a/PracticeCalendar.Application/Products/Queries/GetProducts/GetProductsQuery.cs b/PracticeCalendar.Application/Products/Queries/GetProducts/GetProductsQuery.cs new file mode 100644 index 0000000..e46da85 --- /dev/null +++ b/PracticeCalendar.Application/Products/Queries/GetProducts/GetProductsQuery.cs @@ -0,0 +1,39 @@ +using Mapster; +using MapsterMapper; +using MediatR; +using Microsoft.Extensions.Logging; +using PracticeCalendar.Domain.Common.Interfaces; +using PracticeCalendar.Domain.Entities.Product; +using PracticeCalendar.Domain.Entities.Product.Specifications; + +namespace PracticeCalendar.Application.Products.Queries.GetProducts +{ + public class GetProductsQuery : IRequest> + { + + } + + public class GetProductsQueryHandler : IRequestHandler> + { + private readonly ILogger logger; + private readonly IRepository eventsRepo; + private readonly IMapper mapper; + + public GetProductsQueryHandler(IRepository eventsRepo, + ILogger logger, + IMapper mapper) + { + this.eventsRepo = eventsRepo; + this.logger = logger; + this.mapper = mapper; + } + + public async Task> Handle(GetProductsQuery request, CancellationToken cancellationToken) + { + var spec = new AllProductsSpecification(); + var evList = await eventsRepo.ListAsync(spec, cancellationToken); + var lst = evList.Adapt>(mapper.Config); + return lst; + } + } +} \ No newline at end of file diff --git a/PracticeCalendar.Application/Products/Queries/ProductDto.cs b/PracticeCalendar.Application/Products/Queries/ProductDto.cs new file mode 100644 index 0000000..7d69ca7 --- /dev/null +++ b/PracticeCalendar.Application/Products/Queries/ProductDto.cs @@ -0,0 +1,13 @@ +using PracticeCalendar.Domain.ValueObjects; + +namespace PracticeCalendar.Application.Products.Queries +{ + public class ProductDto + { + public int Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Category { get; set; } = string.Empty; + public decimal UnitPrice { get; set; } + public string UnitPriceCurrency { get; set; } = Price.DEFAULT_CURRENCY; + } +} \ No newline at end of file diff --git a/PracticeCalendar.Domain/Entities/Attendee.cs b/PracticeCalendar.Domain/Entities/PracticeEvent/Attendee.cs similarity index 88% rename from PracticeCalendar.Domain/Entities/Attendee.cs rename to PracticeCalendar.Domain/Entities/PracticeEvent/Attendee.cs index 8a78a53..9d9e958 100644 --- a/PracticeCalendar.Domain/Entities/Attendee.cs +++ b/PracticeCalendar.Domain/Entities/PracticeEvent/Attendee.cs @@ -1,12 +1,12 @@ using Ardalis.GuardClauses; using PracticeCalendar.Domain.Common; -namespace PracticeCalendar.Domain.Entities +namespace PracticeCalendar.Domain.Entities.PracticeEvent { /// /// Attendee to an event /// - public class Attendee: EntityBase + public class Attendee : EntityBase { public Attendee(string name, string emailAddress) { @@ -20,12 +20,12 @@ namespace PracticeCalendar.Domain.Entities public string Name { get; set; } = string.Empty; public string EmailAddress { get; set; } = string.Empty; public bool IsAttending { get; private set; } - + /// /// Set if the Attendee is attending /// /// - public void SetIsAttending (bool isAttending) + public void SetIsAttending(bool isAttending) { this.IsAttending = isAttending; //TODO - raise event diff --git a/PracticeCalendar.Domain/Entities/PracticeEvent.cs b/PracticeCalendar.Domain/Entities/PracticeEvent/PracticeEvent.cs similarity index 95% rename from PracticeCalendar.Domain/Entities/PracticeEvent.cs rename to PracticeCalendar.Domain/Entities/PracticeEvent/PracticeEvent.cs index 200fd2a..5e6e2fe 100644 --- a/PracticeCalendar.Domain/Entities/PracticeEvent.cs +++ b/PracticeCalendar.Domain/Entities/PracticeEvent/PracticeEvent.cs @@ -4,7 +4,7 @@ using PracticeCalendar.Domain.Common.Interfaces; using PracticeCalendar.Domain.Events; using PracticeCalendar.Domain.Exceptions; -namespace PracticeCalendar.Domain.Entities +namespace PracticeCalendar.Domain.Entities.PracticeEvent { /// /// Practice event aggregate @@ -22,7 +22,7 @@ namespace PracticeCalendar.Domain.Entities } public string Title { get; private set; } = string.Empty; - public string Description{ get; private set; } = string.Empty; + public string Description { get; private set; } = string.Empty; public IList Attendees { get; private set; } = new List(); diff --git a/PracticeCalendar.Domain/Entities/PracticeEvent/Specifications/PracticeEventByIdWithAttendeesSpecification.cs b/PracticeCalendar.Domain/Entities/PracticeEvent/Specifications/PracticeEventByIdWithAttendeesSpecification.cs new file mode 100644 index 0000000..18fef0c --- /dev/null +++ b/PracticeCalendar.Domain/Entities/PracticeEvent/Specifications/PracticeEventByIdWithAttendeesSpecification.cs @@ -0,0 +1,13 @@ +using Ardalis.Specification; + +namespace PracticeCalendar.Domain.Entities.PracticeEvent.Specifications +{ + public class PracticeEventByIdWithAttendeesSpecification : Specification + { + public PracticeEventByIdWithAttendeesSpecification(int eventId) + { + Query.Where(x => x.Id == eventId) + .Include(x => x.Attendees); + } + } +} diff --git a/PracticeCalendar.Domain/Entities/PracticeEvent/Specifications/PracticeEventsWithAttendeesSpecification.cs b/PracticeCalendar.Domain/Entities/PracticeEvent/Specifications/PracticeEventsWithAttendeesSpecification.cs new file mode 100644 index 0000000..106bda3 --- /dev/null +++ b/PracticeCalendar.Domain/Entities/PracticeEvent/Specifications/PracticeEventsWithAttendeesSpecification.cs @@ -0,0 +1,13 @@ +using Ardalis.Specification; + +namespace PracticeCalendar.Domain.Entities.PracticeEvent.Specifications +{ + public class PracticeEventsWithAttendeesSpecification : Specification + { + public PracticeEventsWithAttendeesSpecification() + { + Query.AsNoTracking() + .Include(x => x.Attendees); + } + } +} diff --git a/PracticeCalendar.Domain/Entities/Product/Product.cs b/PracticeCalendar.Domain/Entities/Product/Product.cs new file mode 100644 index 0000000..1cba388 --- /dev/null +++ b/PracticeCalendar.Domain/Entities/Product/Product.cs @@ -0,0 +1,13 @@ +using PracticeCalendar.Domain.Common; +using PracticeCalendar.Domain.Common.Interfaces; +using PracticeCalendar.Domain.ValueObjects; + +namespace PracticeCalendar.Domain.Entities.Product +{ + public class Product : EntityBase, IAggregateRoot + { + public string Name { get; set; } = string.Empty; + public string Category { get; set; } = string.Empty; + public Price UnitPrice { get; set; } = Price.Empty; + } +} \ No newline at end of file diff --git a/PracticeCalendar.Domain/Entities/Product/Specifications/AllProductsSpecification.cs b/PracticeCalendar.Domain/Entities/Product/Specifications/AllProductsSpecification.cs new file mode 100644 index 0000000..ee874c1 --- /dev/null +++ b/PracticeCalendar.Domain/Entities/Product/Specifications/AllProductsSpecification.cs @@ -0,0 +1,12 @@ +using Ardalis.Specification; + +namespace PracticeCalendar.Domain.Entities.Product.Specifications +{ + public class AllProductsSpecification : Specification + { + public AllProductsSpecification() + { + Query.AsNoTracking(); + } + } +} \ No newline at end of file diff --git a/PracticeCalendar.Domain/Entities/Specifications/PracticeEventByIdWithAttendees.cs b/PracticeCalendar.Domain/Entities/Specifications/PracticeEventByIdWithAttendees.cs deleted file mode 100644 index 93c6f93..0000000 --- a/PracticeCalendar.Domain/Entities/Specifications/PracticeEventByIdWithAttendees.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Ardalis.Specification; - -namespace PracticeCalendar.Domain.Entities.Specifications -{ - public class PracticeEventByIdWithAttendees : Specification - { - public PracticeEventByIdWithAttendees(int eventId) - { - Query.Where(x=>x.Id == eventId) - .Include(x => x.Attendees); - } - } -} diff --git a/PracticeCalendar.Domain/Entities/Specifications/PracticeEventsWithAttendees.cs b/PracticeCalendar.Domain/Entities/Specifications/PracticeEventsWithAttendees.cs deleted file mode 100644 index 8490ab5..0000000 --- a/PracticeCalendar.Domain/Entities/Specifications/PracticeEventsWithAttendees.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Ardalis.Specification; - -namespace PracticeCalendar.Domain.Entities.Specifications -{ - public class PracticeEventsWithAttendees : Specification - { - public PracticeEventsWithAttendees() - { - Query.AsNoTracking() - .Include(x => x.Attendees); - } - } -} diff --git a/PracticeCalendar.Domain/Events/AttendeeAcceptEvent.cs b/PracticeCalendar.Domain/Events/AttendeeAcceptEvent.cs index a367c8d..a238c25 100644 --- a/PracticeCalendar.Domain/Events/AttendeeAcceptEvent.cs +++ b/PracticeCalendar.Domain/Events/AttendeeAcceptEvent.cs @@ -1,5 +1,5 @@ using PracticeCalendar.Domain.Common; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Domain.Events { diff --git a/PracticeCalendar.Domain/Events/AttendeeAddedEvent.cs b/PracticeCalendar.Domain/Events/AttendeeAddedEvent.cs index 595718d..b58ec5c 100644 --- a/PracticeCalendar.Domain/Events/AttendeeAddedEvent.cs +++ b/PracticeCalendar.Domain/Events/AttendeeAddedEvent.cs @@ -1,5 +1,5 @@ using PracticeCalendar.Domain.Common; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Domain.Events { diff --git a/PracticeCalendar.Domain/Events/AttendeeDeclinedEvent.cs b/PracticeCalendar.Domain/Events/AttendeeDeclinedEvent.cs index d66cec2..10339db 100644 --- a/PracticeCalendar.Domain/Events/AttendeeDeclinedEvent.cs +++ b/PracticeCalendar.Domain/Events/AttendeeDeclinedEvent.cs @@ -1,5 +1,5 @@ using PracticeCalendar.Domain.Common; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Domain.Events { diff --git a/PracticeCalendar.Domain/Events/EventUpdateTitleAndDescriptionEvent.cs b/PracticeCalendar.Domain/Events/EventUpdateTitleAndDescriptionEvent.cs index c7339c7..eff3691 100644 --- a/PracticeCalendar.Domain/Events/EventUpdateTitleAndDescriptionEvent.cs +++ b/PracticeCalendar.Domain/Events/EventUpdateTitleAndDescriptionEvent.cs @@ -1,5 +1,5 @@ using PracticeCalendar.Domain.Common; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Domain.Events { diff --git a/PracticeCalendar.Domain/ValueObjects/Price.cs b/PracticeCalendar.Domain/ValueObjects/Price.cs new file mode 100644 index 0000000..7e2c96a --- /dev/null +++ b/PracticeCalendar.Domain/ValueObjects/Price.cs @@ -0,0 +1,13 @@ +using PracticeCalendar.Domain.Common; + +namespace PracticeCalendar.Domain.ValueObjects +{ + public class Price : ValueObject + { + public static Price Empty = new Price(); + public static string DEFAULT_CURRENCY = "EUR"; + + public decimal Value { get; set; } + public string Currency { get; set; } = Price.DEFAULT_CURRENCY; + } +} \ No newline at end of file diff --git a/PracticeCalendar.Infrastructure/ConfigureServices.cs b/PracticeCalendar.Infrastructure/ConfigureServices.cs index 0cf4eb3..1efd532 100644 --- a/PracticeCalendar.Infrastructure/ConfigureServices.cs +++ b/PracticeCalendar.Infrastructure/ConfigureServices.cs @@ -11,12 +11,13 @@ namespace PracticeCalendar.Infrastructure { public static class ConfigureServices { - public static IServiceCollection AddInfrastructureServices(this IServiceCollection services, + public static IServiceCollection AddInfrastructureServices(this IServiceCollection services, IConfigurationRoot configuration) { string connectionString = configuration.GetConnectionString("SqliteConnection"); services.AddDbContext(connectionString); + services.AddTransient(); services.AddSingleton(); @@ -25,8 +26,11 @@ namespace PracticeCalendar.Infrastructure return services; } - public static void AddDbContext(this IServiceCollection services, string connectionString) => + public static void AddDbContext(this IServiceCollection services, string connectionString) + { services.AddDbContext(options => options.UseSqlite(connectionString)); + services.AddScoped(); + } } } diff --git a/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContext.cs b/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContext.cs index 8962c25..4b0334a 100644 --- a/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContext.cs +++ b/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContext.cs @@ -1,7 +1,8 @@ using Microsoft.EntityFrameworkCore; using PracticeCalendar.Domain.Common; using PracticeCalendar.Domain.Common.Interfaces; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; +using PracticeCalendar.Domain.Entities.Product; using System.Reflection; namespace PracticeCalendar.Infrastructure.Persistence @@ -13,6 +14,8 @@ namespace PracticeCalendar.Infrastructure.Persistence public DbSet Atendees => Set(); public DbSet PracticeEvents => Set(); + public DbSet Products => Set(); + public ApplicationDbContext(DbContextOptions options, IDomainEventService domainEventService) : base(options) { diff --git a/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContextInitialiser.cs b/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContextInitialiser.cs index 25f861c..d5839e2 100644 --- a/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContextInitialiser.cs +++ b/PracticeCalendar.Infrastructure/Persistence/ApplicationDbContextInitialiser.cs @@ -1,11 +1,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; -using PracticeCalendar.Domain.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Infrastructure.Persistence { @@ -14,7 +9,7 @@ namespace PracticeCalendar.Infrastructure.Persistence private readonly ILogger logger; private readonly ApplicationDbContext context; - public ApplicationDbContextInitialiser(ILogger logger, + public ApplicationDbContextInitialiser(ILogger logger, ApplicationDbContext context) { this.logger = logger; @@ -27,6 +22,7 @@ namespace PracticeCalendar.Infrastructure.Persistence { if (context.Database.IsSqlite()) { + await context.Database.EnsureCreatedAsync(); await context.Database.MigrateAsync(); } } @@ -56,7 +52,7 @@ namespace PracticeCalendar.Infrastructure.Persistence // Seed, if necessary if (!context.PracticeEvents.Any()) { - context.PracticeEvents.Add(new PracticeEvent("Event 1", "Event 1 desc", + context.PracticeEvents.Add(new PracticeEvent("Event 1", "Event 1 desc", DateTime.Now.AddHours(-1), DateTime.Now.AddHours(1))); diff --git a/PracticeCalendar.Infrastructure/Persistence/Configuration/AttendeeConfiguration.cs b/PracticeCalendar.Infrastructure/Persistence/Configuration/AttendeeConfiguration.cs index 65ea3bf..5d419a7 100644 --- a/PracticeCalendar.Infrastructure/Persistence/Configuration/AttendeeConfiguration.cs +++ b/PracticeCalendar.Infrastructure/Persistence/Configuration/AttendeeConfiguration.cs @@ -1,6 +1,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Infrastructure.Persistence.Configuration { diff --git a/PracticeCalendar.Infrastructure/Persistence/Configuration/PracticeEventConfiguration.cs b/PracticeCalendar.Infrastructure/Persistence/Configuration/PracticeEventConfiguration.cs index 62aad1a..c545b15 100644 --- a/PracticeCalendar.Infrastructure/Persistence/Configuration/PracticeEventConfiguration.cs +++ b/PracticeCalendar.Infrastructure/Persistence/Configuration/PracticeEventConfiguration.cs @@ -1,6 +1,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.Infrastructure.Persistence.Configuration { diff --git a/PracticeCalendar.Infrastructure/Persistence/Configuration/ProductConfiguration.cs b/PracticeCalendar.Infrastructure/Persistence/Configuration/ProductConfiguration.cs new file mode 100644 index 0000000..b37667e --- /dev/null +++ b/PracticeCalendar.Infrastructure/Persistence/Configuration/ProductConfiguration.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using PracticeCalendar.Domain.Entities.Product; +using PracticeCalendar.Domain.ValueObjects; + +namespace PracticeCalendar.Infrastructure.Persistence.Configuration +{ + public class ProductConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.Property(x => x.Name) + .HasMaxLength(100) + .IsRequired(); + builder.Property(x => x.Category) + .HasMaxLength(100) + .IsRequired(); + builder.OwnsOne(product => product.UnitPrice, price => + { + price.Property(p => p.Currency) + .HasColumnName(nameof(Price.Currency)) + .HasMaxLength(5) + .IsRequired(); + price.Property(p => p.Value) + .HasColumnName(nameof(Price.Value)) + .IsRequired(); + }); + } + } +} diff --git a/PracticeCalendar.UnitTests/Application/Mapping/PracticeEventMappingTests.cs b/PracticeCalendar.UnitTests/Application/Mapping/PracticeEventMappingTests.cs index 439a205..e757983 100644 --- a/PracticeCalendar.UnitTests/Application/Mapping/PracticeEventMappingTests.cs +++ b/PracticeCalendar.UnitTests/Application/Mapping/PracticeEventMappingTests.cs @@ -1,7 +1,7 @@ using FluentAssertions; using Mapster; using PracticeCalendar.Application.PracticeEvents.Queries; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.UnitTests.Application.Mapping { diff --git a/PracticeCalendar.UnitTests/Domain/PracticeEventTest.cs b/PracticeCalendar.UnitTests/Domain/PracticeEventTest.cs index 04ab6fd..5ec7f9e 100644 --- a/PracticeCalendar.UnitTests/Domain/PracticeEventTest.cs +++ b/PracticeCalendar.UnitTests/Domain/PracticeEventTest.cs @@ -1,6 +1,5 @@ using FluentAssertions; -using FluentAssertions.Common; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.UnitTests.Domain { diff --git a/PracticeCalendar.UnitTests/Integration/PracticeEvents/GetPracticeEventsTest.cs b/PracticeCalendar.UnitTests/Integration/PracticeEvents/GetPracticeEventsTest.cs index 24168d1..9688fb2 100644 --- a/PracticeCalendar.UnitTests/Integration/PracticeEvents/GetPracticeEventsTest.cs +++ b/PracticeCalendar.UnitTests/Integration/PracticeEvents/GetPracticeEventsTest.cs @@ -1,7 +1,6 @@ using FluentAssertions; using PracticeCalendar.Application.PracticeEvents.Queries.GetPracticeEvents; -using PracticeCalendar.Domain.Entities; - +using PracticeCalendar.Domain.Entities.PracticeEvent; using static PracticeCalendar.UnitTests.Integration.Testing; namespace PracticeCalendar.UnitTests.Integration.PracticeEvents @@ -26,11 +25,11 @@ namespace PracticeCalendar.UnitTests.Integration.PracticeEvents { await RunBeforeAnyTests(); - await AddAsync(new PracticeEvent("Test Event", "Event description", + await AddAsync(new PracticeEvent("Test Event", "Event description", DateTime.Now.AddHours(-1), DateTime.Now.AddHours(1)) { Id = 1, - Attendees = { + Attendees = { new Attendee("Claudiu F", "claudiuf@busybee.com") { Id = 1 diff --git a/PracticeCalendar.UnitTests/Integration/Testing.cs b/PracticeCalendar.UnitTests/Integration/Testing.cs index 87ea062..0f45609 100644 --- a/PracticeCalendar.UnitTests/Integration/Testing.cs +++ b/PracticeCalendar.UnitTests/Integration/Testing.cs @@ -4,9 +4,9 @@ using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; using PracticeCalendar.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; -using PracticeCalendar.Domain.Entities; using PracticeCalendar.Domain.Common.Interfaces; using Moq; +using PracticeCalendar.Domain.Entities.PracticeEvent; namespace PracticeCalendar.UnitTests.Integration { diff --git a/PracticeCalendar.UnitTests/Integration/api/ControllerApiTest.cs b/PracticeCalendar.UnitTests/Integration/api/ControllerApiTest.cs index ce11d5e..526fcfa 100644 --- a/PracticeCalendar.UnitTests/Integration/api/ControllerApiTest.cs +++ b/PracticeCalendar.UnitTests/Integration/api/ControllerApiTest.cs @@ -1,6 +1,6 @@ using System.Net; using FluentAssertions; -using PracticeCalendar.Domain.Entities; +using PracticeCalendar.Domain.Entities.PracticeEvent; using PracticeCalendar.UnitTests.Integration; using static PracticeCalendar.UnitTests.Integration.Testing;