diff --git a/DigitalData.EmailProfilerDispatcher.API/Controllers/MailController.cs b/DigitalData.EmailProfilerDispatcher.API/Controllers/MailController.cs index b823eae..33a2f3d 100644 --- a/DigitalData.EmailProfilerDispatcher.API/Controllers/MailController.cs +++ b/DigitalData.EmailProfilerDispatcher.API/Controllers/MailController.cs @@ -1,16 +1,15 @@ -using Microsoft.AspNetCore.Mvc; +using DigitalData.Core.API; +using DigitalData.EmailProfilerDispatcher.Application.Contracts; +using DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut; +using DigitalData.EmailProfilerDispatcher.Domain.Entities; +using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts; namespace DigitalData.EmailProfilerGateway.API.Controllers { - [ApiController] - [Route("[controller]")] - public class MailController : ControllerBase + public class MailController : CRUDControllerBase { - private readonly ILogger _logger; - - public MailController(ILogger logger) + public MailController(ILogger logger, IEmailOutService service) : base(logger, service) { - _logger = logger; } } } diff --git a/DigitalData.EmailProfilerDispatcher.API/DigitalData.EmailProfilerDispatcher.API.csproj b/DigitalData.EmailProfilerDispatcher.API/DigitalData.EmailProfilerDispatcher.API.csproj index d8026f4..182654a 100644 --- a/DigitalData.EmailProfilerDispatcher.API/DigitalData.EmailProfilerDispatcher.API.csproj +++ b/DigitalData.EmailProfilerDispatcher.API/DigitalData.EmailProfilerDispatcher.API.csproj @@ -8,6 +8,21 @@ + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + @@ -17,4 +32,16 @@ + + + ..\..\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.dll + + + ..\..\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.dll + + + ..\..\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.DTO.dll + + + diff --git a/DigitalData.EmailProfilerDispatcher.API/Program.cs b/DigitalData.EmailProfilerDispatcher.API/Program.cs index 48863a6..7add3de 100644 --- a/DigitalData.EmailProfilerDispatcher.API/Program.cs +++ b/DigitalData.EmailProfilerDispatcher.API/Program.cs @@ -1,8 +1,17 @@ +using DigitalData.Core.API; +using DigitalData.EmailProfilerDispatcher.Application; +using Microsoft.EntityFrameworkCore; + var builder = WebApplication.CreateBuilder(args); -// Add services to the container. +var config = builder.Configuration; +// Add services to the container. builder.Services.AddControllers(); + +builder.Services.AddCookieBasedLocalizer(); +builder.Services.AddDispatcher(options => options.UseSqlServer(config.GetConnectionString("Default"))); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); @@ -20,6 +29,8 @@ app.UseHttpsRedirection(); app.UseAuthorization(); +app.UseCookieBasedLocalizer("de-DE", "en-US"); + app.MapControllers(); app.Run(); diff --git a/DigitalData.EmailProfilerDispatcher.API/appsettings.json b/DigitalData.EmailProfilerDispatcher.API/appsettings.json index 10f68b8..338fb1e 100644 --- a/DigitalData.EmailProfilerDispatcher.API/appsettings.json +++ b/DigitalData.EmailProfilerDispatcher.API/appsettings.json @@ -5,5 +5,8 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "ConnectionStrings": { + "Default": "Server=SDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;Encrypt=false;TrustServerCertificate=True;" + } } diff --git a/DigitalData.EmailProfilerDispatcher.Application/Contracts/IEmailOutService.cs b/DigitalData.EmailProfilerDispatcher.Application/Contracts/IEmailOutService.cs new file mode 100644 index 0000000..30ee113 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/Contracts/IEmailOutService.cs @@ -0,0 +1,11 @@ +using DigitalData.Core.Contracts.Application; +using DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut; +using DigitalData.EmailProfilerDispatcher.Domain.Entities; +using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts; + +namespace DigitalData.EmailProfilerDispatcher.Application.Contracts +{ + public interface IEmailOutService : ICRUDService + { + } +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Application/DIExtensions.cs b/DigitalData.EmailProfilerDispatcher.Application/DIExtensions.cs new file mode 100644 index 0000000..c0bc49d --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/DIExtensions.cs @@ -0,0 +1,20 @@ +using DigitalData.EmailProfilerDispatcher.Application.Contracts; +using DigitalData.EmailProfilerDispatcher.Application.Services; +using DigitalData.EmailProfilerDispatcher.Infrastructure; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; + +namespace DigitalData.EmailProfilerDispatcher.Application +{ + public static class DIExtensions + { + public static IServiceCollection AddDispatcher(this IServiceCollection services) where TDbContext : DbContext => services + .AddDispatcherRepository() + .AddAutoMapper(typeof(MappingProfile).Assembly) + .AddScoped(); + + public static IServiceCollection AddDispatcher(this IServiceCollection services, Action options) => services + .AddDbContext(options) + .AddDispatcher(); + } +} diff --git a/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOut/EmailOutCreateDto.cs b/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOut/EmailOutCreateDto.cs new file mode 100644 index 0000000..bb1f387 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOut/EmailOutCreateDto.cs @@ -0,0 +1,23 @@ +namespace DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut +{ + public record EmailOutCreateDto( + int ReminderTypeId, + int SendingProfile, + int ReferenceId, + string? ReferenceString, + int? EntityId, + int WfId, + string? WfReference, + string EmailAddress, + string EmailSubj, + string EmailBody, + string? EmailAttmt1, + DateTime? EmailSent, + string? Comment, + string? AddedWho, // Default value will be 'DEFAULT', made nullable + string? ChangedWho, + DateTime? ChangedWhen, + DateTime? ErrorTimestamp, + string? ErrorMsg + ); +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOutDto.cs b/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOut/EmailOutDto.cs similarity index 69% rename from DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOutDto.cs rename to DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOut/EmailOutDto.cs index ccd9f2c..58f7e5e 100644 --- a/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOutDto.cs +++ b/DigitalData.EmailProfilerDispatcher.Application/DTOs/EmailOut/EmailOutDto.cs @@ -1,25 +1,25 @@ -namespace DigitalData.EmailProfilerDispatcher.Application.DTOs +namespace DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut { public record EmailOutDto( - int Guid, + int Id, int ReminderTypeId, int SendingProfile, int ReferenceId, - string ReferenceString, + string? ReferenceString, int? EntityId, int WfId, - string WfReference, + string? WfReference, string EmailAddress, string EmailSubj, string EmailBody, - string EmailAttmt1, + string? EmailAttmt1, DateTime? EmailSent, - string Comment, + string? Comment, string AddedWho, DateTime? AddedWhen, - string ChangedWho, + string? ChangedWho, DateTime? ChangedWhen, DateTime? ErrorTimestamp, - string ErrorMsg + string? ErrorMsg ); } \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Application/DigitalData.EmailProfilerDispatcher.Application.csproj b/DigitalData.EmailProfilerDispatcher.Application/DigitalData.EmailProfilerDispatcher.Application.csproj index 87d31f0..c004aea 100644 --- a/DigitalData.EmailProfilerDispatcher.Application/DigitalData.EmailProfilerDispatcher.Application.csproj +++ b/DigitalData.EmailProfilerDispatcher.Application/DigitalData.EmailProfilerDispatcher.Application.csproj @@ -7,7 +7,29 @@ - + + + + + + + + + + + + + ..\..\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.dll + + + ..\..\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll + + + ..\..\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.DTO.dll + + + ..\..\WebCoreModules\DigitalData.Core.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Infrastructure.dll + diff --git a/DigitalData.EmailProfilerDispatcher.Application/MappingProfile.cs b/DigitalData.EmailProfilerDispatcher.Application/MappingProfile.cs new file mode 100644 index 0000000..2c861f7 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/MappingProfile.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut; +using DigitalData.EmailProfilerDispatcher.Domain.Entities; + +namespace DigitalData.EmailProfilerDispatcher.Application +{ + public class MappingProfile : Profile + { + public MappingProfile() + { + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + } + } +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.cs b/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.cs new file mode 100644 index 0000000..dad86c5 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.cs @@ -0,0 +1,6 @@ +namespace DigitalData.EmailProfilerDispatcher.Application.Resources +{ + public class Resource + { + } +} diff --git a/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.de-DE.resx b/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.de-DE.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.de-DE.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.en-US.resx b/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.en-US.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/Resources/Resource.en-US.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Application/Services/EmailOutService.cs b/DigitalData.EmailProfilerDispatcher.Application/Services/EmailOutService.cs new file mode 100644 index 0000000..41a033e --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Application/Services/EmailOutService.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using DigitalData.Core.Application; +using DigitalData.EmailProfilerDispatcher.Application.Contracts; +using DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut; +using DigitalData.EmailProfilerDispatcher.Application.Resources; +using DigitalData.EmailProfilerDispatcher.Domain.Entities; +using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts; +using Microsoft.Extensions.Localization; + +namespace DigitalData.EmailProfilerDispatcher.Application.Services +{ + public class EmailOutService : CRUDService, IEmailOutService + { + public EmailOutService(IEmailOutRepository repository, IStringLocalizer localizer, IMapper mapper) : base(repository, localizer, mapper) + { + } + } +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Domain/Entities/EmailOut.cs b/DigitalData.EmailProfilerDispatcher.Domain/Entities/EmailOut.cs index 602b229..2dd8320 100644 --- a/DigitalData.EmailProfilerDispatcher.Domain/Entities/EmailOut.cs +++ b/DigitalData.EmailProfilerDispatcher.Domain/Entities/EmailOut.cs @@ -10,7 +10,7 @@ namespace DigitalData.EmailProfilerDispatcher.Domain.Entities [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Column("GUID")] - public int Guid { get; set; } + public int Id { get; set; } [Required] [DefaultValue(1)] @@ -27,7 +27,7 @@ namespace DigitalData.EmailProfilerDispatcher.Domain.Entities [Column("REFERENCE_STRING", TypeName = "varchar(200)")] [StringLength(200)] - public string ReferenceString { get; set; } + public string? ReferenceString { get; set; } [Column("ENTITY_ID")] public int? EntityId { get; set; } @@ -38,7 +38,7 @@ namespace DigitalData.EmailProfilerDispatcher.Domain.Entities [Column("WF_REFERENCE", TypeName = "varchar(200)")] [StringLength(200)] - public string WfReference { get; set; } + public string? WfReference { get; set; } [Required] [Column("EMAIL_ADRESS", TypeName = "varchar(1000)")] @@ -56,14 +56,14 @@ namespace DigitalData.EmailProfilerDispatcher.Domain.Entities [Column("EMAIL_ATTMT1", TypeName = "varchar(512)")] [StringLength(512)] - public string EmailAttmt1 { get; set; } + public string? EmailAttmt1 { get; set; } [Column("EMAIL_SENT")] public DateTime? EmailSent { get; set; } [Column("COMMENT", TypeName = "varchar(500)")] [StringLength(500)] - public string Comment { get; set; } + public string? Comment { get; set; } [Required] [Column("ADDED_WHO", TypeName = "varchar(50)")] @@ -77,7 +77,7 @@ namespace DigitalData.EmailProfilerDispatcher.Domain.Entities [Column("CHANGED_WHO", TypeName = "varchar(50)")] [StringLength(50)] - public string ChangedWho { get; set; } + public string? ChangedWho { get; set; } [Column("CHANGED_WHEN")] public DateTime? ChangedWhen { get; set; } @@ -87,6 +87,6 @@ namespace DigitalData.EmailProfilerDispatcher.Domain.Entities [Column("ERROR_MSG", TypeName = "varchar(900)")] [StringLength(900)] - public string ErrorMsg { get; set; } + public string? ErrorMsg { get; set; } } } diff --git a/DigitalData.EmailProfilerDispatcher.Infrastructure/Contracts/IEmailOutRepository.cs b/DigitalData.EmailProfilerDispatcher.Infrastructure/Contracts/IEmailOutRepository.cs new file mode 100644 index 0000000..893cb90 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Infrastructure/Contracts/IEmailOutRepository.cs @@ -0,0 +1,9 @@ +using DigitalData.Core.Contracts.Infrastructure; +using DigitalData.EmailProfilerDispatcher.Domain.Entities; + +namespace DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts +{ + public interface IEmailOutRepository : ICRUDRepository + { + } +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Infrastructure/DIExtensions.cs b/DigitalData.EmailProfilerDispatcher.Infrastructure/DIExtensions.cs new file mode 100644 index 0000000..3df6da0 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Infrastructure/DIExtensions.cs @@ -0,0 +1,17 @@ +using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts; +using DigitalData.EmailProfilerDispatcher.Infrastructure.Repositories; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; + +namespace DigitalData.EmailProfilerDispatcher.Infrastructure +{ + public static class DIExtensions + { + public static IServiceCollection AddDispatcherRepository(this IServiceCollection services) where TDbContext : DbContext => services + .AddScoped>(); + + public static IServiceCollection AddDispatcherRepository(this IServiceCollection services, Action optionsAction) => services + .AddDbContext(optionsAction) + .AddDispatcherRepository(); + } +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Infrastructure/DefaultMailDbContext.cs b/DigitalData.EmailProfilerDispatcher.Infrastructure/DefaultMailDbContext.cs new file mode 100644 index 0000000..f31abcd --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Infrastructure/DefaultMailDbContext.cs @@ -0,0 +1,21 @@ +using DigitalData.EmailProfilerDispatcher.Domain.Entities; +using Microsoft.EntityFrameworkCore; + +namespace DigitalData.EmailProfilerDispatcher.Infrastructure +{ + public class DefaultMailDbContext : DbContext + { + public DbSet EMailOuts { get; set; } + + public DefaultMailDbContext(DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity().ToTable("TBEMLP_EMAIL_OUT"); + } + } +} \ No newline at end of file diff --git a/DigitalData.EmailProfilerDispatcher.Infrastructure/DigitalData.EmailProfilerDispatcher.Infrastructure.csproj b/DigitalData.EmailProfilerDispatcher.Infrastructure/DigitalData.EmailProfilerDispatcher.Infrastructure.csproj index 69dc56a..f308e00 100644 --- a/DigitalData.EmailProfilerDispatcher.Infrastructure/DigitalData.EmailProfilerDispatcher.Infrastructure.csproj +++ b/DigitalData.EmailProfilerDispatcher.Infrastructure/DigitalData.EmailProfilerDispatcher.Infrastructure.csproj @@ -7,7 +7,33 @@ - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + ..\..\WebCoreModules\DigitalData.Core.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.dll + + + ..\..\WebCoreModules\DigitalData.Core.Infrastructure\bin\Debug\net7.0\DigitalData.Core.DTO.dll + + + ..\..\WebCoreModules\DigitalData.Core.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Infrastructure.dll + diff --git a/DigitalData.EmailProfilerDispatcher.Infrastructure/Repositories/EmailOutRepository.cs b/DigitalData.EmailProfilerDispatcher.Infrastructure/Repositories/EmailOutRepository.cs new file mode 100644 index 0000000..c708b67 --- /dev/null +++ b/DigitalData.EmailProfilerDispatcher.Infrastructure/Repositories/EmailOutRepository.cs @@ -0,0 +1,15 @@ +using DigitalData.Core.Infrastructure; +using DigitalData.EmailProfilerDispatcher.Domain.Entities; +using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts; +using Microsoft.EntityFrameworkCore; + +namespace DigitalData.EmailProfilerDispatcher.Infrastructure.Repositories +{ + public class EmailOutRepository : CRUDRepository, IEmailOutRepository + where TDbContext : DbContext + { + public EmailOutRepository(TDbContext dbContext) : base(dbContext) + { + } + } +} \ No newline at end of file