diff --git a/TaleEngine/.dockerignore b/TaleEngine/.dockerignore new file mode 100644 index 0000000..3729ff0 --- /dev/null +++ b/TaleEngine/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Application.Testing/TaleEngine.Application.Testing.csproj b/TaleEngine/TaleEngine.Application.Testing/TaleEngine.Application.Testing.csproj index b7e0290..386612d 100644 --- a/TaleEngine/TaleEngine.Application.Testing/TaleEngine.Application.Testing.csproj +++ b/TaleEngine/TaleEngine.Application.Testing/TaleEngine.Application.Testing.csproj @@ -12,7 +12,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/TaleEngine/TaleEngine.Application/Mappers/ActivityMapper.cs b/TaleEngine/TaleEngine.Application/Mappers/ActivityMapper.cs index 52b0ad2..2c158ea 100644 --- a/TaleEngine/TaleEngine.Application/Mappers/ActivityMapper.cs +++ b/TaleEngine/TaleEngine.Application/Mappers/ActivityMapper.cs @@ -1,80 +1,79 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; -using TaleEngine.Application.Contracts.Dtos; -using TaleEngine.Bussiness.Contracts.Models; - -namespace TaleEngine.Application.Mappers -{ - public static class ActivityMapper - { - public static ActivityDto Map(ActivityModel activityModel) - { - if (activityModel == null) return null; - - return new ActivityDto - { - Id = activityModel.Id, - Title = activityModel.Title, - Description = activityModel.Description, - Places = activityModel.Places, - ActivityEnd = activityModel.EndDateTime.ToString(), - ActivityStart = activityModel.StartDateTime.ToString(), - StatusId = activityModel.StatusId, - TypeId = activityModel.TypeId, - Image = activityModel.Image, - TimeSlotId = activityModel.TimeSlotId ?? 0 - }; - } - - public static List Map(List activityModels) - { - if (activityModels == null || activityModels.Count == 0) return null; - - return activityModels.Select(Map).ToList(); - } - - - public static ActivityModel Map(ActivityDto activityDto) - { - if (activityDto == null) return null; - - return new ActivityModel - { - Id = activityDto.Id, - Title = activityDto.Title, - Description = activityDto.Description, - Places = activityDto.Places, - Image = activityDto.Image, - TypeId = activityDto.TypeId, - StatusId = activityDto.StatusId, - EndDateTime = ParseTime(activityDto.ActivityEnd), - StartDateTime = ParseTime(activityDto.ActivityStart), - TimeSlotId = activityDto.TimeSlotId - }; - } - - public static List Map(List activityDtos) - { - if (activityDtos == null || activityDtos.Count == 0) return null; - - return activityDtos.Select(Map).ToList(); - } - - private static DateTime? ParseTime(string date) - { - DateTime? result; - - try - { - result = DateTime.Parse(date); - } - catch (Exception e) - { - result = null; - } - - return result; - } - } -} +using TaleEngine.Application.Contracts.Dtos; +using TaleEngine.Bussiness.Contracts.Models; + +namespace TaleEngine.Application.Mappers +{ + public static class ActivityMapper + { + public static ActivityDto Map(ActivityModel activityModel) + { + if (activityModel == null) return null; + + return new ActivityDto + { + Id = activityModel.Id, + Title = activityModel.Title, + Description = activityModel.Description, + Places = activityModel.Places, + ActivityEnd = activityModel.EndDateTime.ToString(), + ActivityStart = activityModel.StartDateTime.ToString(), + StatusId = activityModel.StatusId, + TypeId = activityModel.TypeId, + Image = activityModel.Image, + TimeSlotId = activityModel.TimeSlotId ?? 0 + }; + } + + public static List Map(List activityModels) + { + if (activityModels == null || activityModels.Count == 0) return null; + + return activityModels.Select(Map).ToList(); + } + + public static ActivityModel Map(ActivityDto activityDto) + { + if (activityDto == null) return null; + + return new ActivityModel + { + Id = activityDto.Id, + Title = activityDto.Title, + Description = activityDto.Description, + Places = activityDto.Places, + Image = activityDto.Image, + TypeId = activityDto.TypeId, + StatusId = activityDto.StatusId, + EndDateTime = ParseTime(activityDto.ActivityEnd), + StartDateTime = ParseTime(activityDto.ActivityStart), + TimeSlotId = activityDto.TimeSlotId + }; + } + + public static List Map(List activityDtos) + { + if (activityDtos == null || activityDtos.Count == 0) return null; + + return activityDtos.Select(Map).ToList(); + } + + private static DateTime? ParseTime(string date) + { + DateTime? result; + + try + { + result = DateTime.Parse(date); + } + catch (Exception) + { + result = null; + } + + return result; + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Application/Services/ActivityStatusService.cs b/TaleEngine/TaleEngine.Application/Services/ActivityStatusService.cs index 7684330..4515a87 100644 --- a/TaleEngine/TaleEngine.Application/Services/ActivityStatusService.cs +++ b/TaleEngine/TaleEngine.Application/Services/ActivityStatusService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; using TaleEngine.Application.Mappers; @@ -12,7 +13,7 @@ public class ActivityStatusService : IActivityStatusService public ActivityStatusService(IActivityStatusDomainService activityStatusDomainService) { - _activityStatusDomainService = activityStatusDomainService; + _activityStatusDomainService = activityStatusDomainService ?? throw new ArgumentNullException(nameof(activityStatusDomainService)); } public List GetActivityStatuses() @@ -24,4 +25,4 @@ public List GetActivityStatuses() return result; } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Application/Services/EventService.cs b/TaleEngine/TaleEngine.Application/Services/EventService.cs index c60b40c..9d5e012 100644 --- a/TaleEngine/TaleEngine.Application/Services/EventService.cs +++ b/TaleEngine/TaleEngine.Application/Services/EventService.cs @@ -3,7 +3,6 @@ using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; using TaleEngine.Application.Mappers; -using TaleEngine.Bussiness.Contracts; using TaleEngine.Bussiness.Contracts.DomainServices; namespace TaleEngine.Application.Services diff --git a/TaleEngine/TaleEngine.Business.Testing/Services/ActivityDomainServiceTests.cs b/TaleEngine/TaleEngine.Business.Testing/Services/ActivityDomainServiceTests.cs index c4796b1..8d9dc99 100644 --- a/TaleEngine/TaleEngine.Business.Testing/Services/ActivityDomainServiceTests.cs +++ b/TaleEngine/TaleEngine.Business.Testing/Services/ActivityDomainServiceTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TaleEngine.Bussiness.DomainServices; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; using TaleEngine.Fakes.Entities; @@ -14,17 +13,29 @@ namespace TaleEngine.Business.Testing.Services [ExcludeFromCodeCoverage] public class ActivityDomainServiceTests { - private Mock uowMock; - private Mock activityRepoMock; - private Mock activityStatusRepoMock; - private Mock editionRepoMock; + private readonly Mock _activityRepositoryMock; + private readonly Mock _activityStatusRepositoryMock; + private readonly Mock _editionRepositoryMock; + private readonly Mock _activityTypeRepositoryMock; + private readonly Mock _timeSlotRepositoryMock; public ActivityDomainServiceTests() { - uowMock = new Mock(); - activityRepoMock = new Mock(); - activityStatusRepoMock = new Mock(); - editionRepoMock = new Mock(); + _activityRepositoryMock = new Mock(); + _activityStatusRepositoryMock = new Mock(); + _activityTypeRepositoryMock = new Mock(); + _editionRepositoryMock = new Mock(); + _timeSlotRepositoryMock = new Mock(); + } + + private ActivityDomainService CreateActivityDomainService() + { + return new ActivityDomainService( + _activityRepositoryMock.Object, + _activityStatusRepositoryMock.Object, + _activityTypeRepositoryMock.Object, + _editionRepositoryMock.Object, + _timeSlotRepositoryMock.Object); } [Fact] @@ -36,15 +47,12 @@ public void GetActiveActivities_Success() List list = ActivityBuilder.BuildActivityList(); var status = ActivityBuilder.BuildActivityStatus(); - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetActiveActivities(editionId); @@ -63,15 +71,12 @@ public void GetActiveActivities_IdIsZero_ShouldReturnNull() List list = null; var status = ActivityBuilder.BuildActivityStatus(); - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetActiveActivities(editionId); @@ -89,15 +94,12 @@ public void GetActiveActivities_StatusNotExist_ShouldReturnNull() List list = null; ActivityStatus status = null; - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetActiveActivities(editionId); @@ -106,7 +108,6 @@ public void GetActiveActivities_StatusNotExist_ShouldReturnNull() result.Should().BeNull(); } - [Fact] public void GetPendingActivities_Success() { @@ -116,15 +117,12 @@ public void GetPendingActivities_Success() List list = ActivityBuilder.BuildActivityList(); var status = ActivityBuilder.BuildActivityStatus(); - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetPendingActivities(editionId); @@ -143,15 +141,12 @@ public void GetPendingActivities_IdIsZero_ShouldReturnNull() List list = null; var status = ActivityBuilder.BuildActivityStatus(); - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetPendingActivities(editionId); @@ -169,15 +164,12 @@ public void GetPendingActivities_StatusNotExist_ShouldReturnNull() List list = null; ActivityStatus status = null; - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetPendingActivities(editionId); @@ -200,25 +192,20 @@ public void GetFilteredActiveActivities_Success() var status = ActivityBuilder.BuildActivityStatus(); var edition = EditionBuilder.BuildEdition(); - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - activityRepoMock.Setup(x => x.GetTotalActivities(It.IsAny(), It.IsAny(), + _activityRepositoryMock.Setup(x => x.GetTotalActivities(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(totalActivities); - activityRepoMock.Setup(x => x.GetActiveActivitiesFiltered(It.IsAny(), It.IsAny(), + _activityRepositoryMock.Setup(x => x.GetActiveActivitiesFiltered(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(It.IsAny())) + _editionRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetActiveActivitiesFiltered(typeId, edition.Id, title, currentPage); @@ -240,15 +227,12 @@ public void GetFilteredActiveActivities_EditionNotExist_ShouldReturnNull() var status = ActivityBuilder.BuildActivityStatus(); Edition edition = null; - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(editionId)) + _editionRepositoryMock.Setup(x => x.GetById(editionId)) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetActiveActivitiesFiltered(typeId, editionId, title, currentPage); @@ -270,15 +254,12 @@ public void GetFilteredActiveActivities_StatusNotExist_ShouldReturnNull() ActivityStatus status = null; Edition edition = EditionBuilder.BuildEdition(); - activityStatusRepoMock.Setup(x => x.GetById(statusId)) + _activityStatusRepositoryMock.Setup(x => x.GetById(statusId)) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(editionId)) + _editionRepositoryMock.Setup(x => x.GetById(editionId)) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetActiveActivitiesFiltered(typeId, editionId, title, currentPage); @@ -295,20 +276,14 @@ public void GetLastThreeActivities_Success() ActivityStatus status = ActivityBuilder.BuildActivityStatus(); Edition edition = EditionBuilder.BuildEdition(); - activityRepoMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), - It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(It.IsAny())) + _editionRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetLastThreeActivities(edition.Id); @@ -327,20 +302,14 @@ public void GetLastThreeActivities_EditionNotExist_ShouldReturnNull() ActivityStatus status = ActivityBuilder.BuildActivityStatus(); Edition edition = null; - activityRepoMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), - It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(It.IsAny())) + _editionRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetLastThreeActivities(editionId); @@ -357,20 +326,14 @@ public void GetLastThreeActivities_StatusNotExist_ShouldReturnNull() ActivityStatus status = null; Edition edition = EditionBuilder.BuildEdition(); - activityRepoMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), - It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(It.IsAny())) + _editionRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetLastThreeActivities(edition.Id); @@ -387,20 +350,14 @@ public void GetLastThreeActivities_NoActivities_ShouldReturnNull() ActivityStatus status = ActivityBuilder.BuildActivityStatus(); Edition edition = EditionBuilder.BuildEdition(); - activityRepoMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), - It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(It.IsAny())) + _editionRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetLastThreeActivities(edition.Id); @@ -417,22 +374,16 @@ public void GetLastThreeActivities_ActivitiesEmpty_ShouldReturnNull() ActivityStatus status = ActivityBuilder.BuildActivityStatus(); Edition edition = EditionBuilder.BuildEdition(); - activityRepoMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetActivitiesByStatus(It.IsAny(), It.IsAny())) .Returns(list); - activityRepoMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), - It.IsAny())) + _activityRepositoryMock.Setup(x => x.GetLastThreeActivities(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); - uowMock.Setup(x => x.ActivityRepository) - .Returns(activityRepoMock.Object); - activityStatusRepoMock.Setup(x => x.GetById(It.IsAny())) + _activityStatusRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(status); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - editionRepoMock.Setup(x => x.GetById(It.IsAny())) + _editionRepositoryMock.Setup(x => x.GetById(It.IsAny())) .Returns(edition); - uowMock.Setup(x => x.EditionRepository) - .Returns(editionRepoMock.Object); - var target = new ActivityDomainService(uowMock.Object); + + var target = CreateActivityDomainService(); // Act var result = target.GetLastThreeActivities(edition.Id); @@ -440,6 +391,5 @@ public void GetLastThreeActivities_ActivitiesEmpty_ShouldReturnNull() // Assert result.Should().BeNull(); } - } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Business.Testing/Services/ActivityStatusDomainServiceTests.cs b/TaleEngine/TaleEngine.Business.Testing/Services/ActivityStatusDomainServiceTests.cs index e41ba8e..c5c85e4 100644 --- a/TaleEngine/TaleEngine.Business.Testing/Services/ActivityStatusDomainServiceTests.cs +++ b/TaleEngine/TaleEngine.Business.Testing/Services/ActivityStatusDomainServiceTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TaleEngine.Bussiness.DomainServices; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; using TaleEngine.Fakes.Entities; @@ -14,13 +13,17 @@ namespace TaleEngine.Business.Testing.Services [ExcludeFromCodeCoverage] public class ActivityStatusDomainServiceTests { - private Mock uowMock; - private Mock activityStatusRepoMock; + private readonly Mock _activityStatusRepositoryMock; public ActivityStatusDomainServiceTests() { - uowMock = new Mock(); - activityStatusRepoMock = new Mock(); + _activityStatusRepositoryMock = new Mock(); + } + + private ActivityStatusDomainService CreateActivityStatusDomainService() + { + return new ActivityStatusDomainService( + _activityStatusRepositoryMock.Object); } [Fact] @@ -29,11 +32,10 @@ public void GetAll_Success() // Arrange List list = ActivityBuilder.BuildActivityStatusList(); - activityStatusRepoMock.Setup(x => x.GetAll()) + _activityStatusRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityStatusDomainService(uowMock.Object); + + var target = CreateActivityStatusDomainService(); // Act var result = target.GetAllActivityStatuses(); @@ -49,11 +51,10 @@ public void GetAll_RepoIsEmpty_ShouldReturnNull() // Arrange List list = null; - activityStatusRepoMock.Setup(x => x.GetAll()) + _activityStatusRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityStatusDomainService(uowMock.Object); + + var target = CreateActivityStatusDomainService(); // Act var result = target.GetAllActivityStatuses(); @@ -68,11 +69,10 @@ public void GetAll_EmptyResult_ShouldReturnNull() // Arrange List list = new(); - activityStatusRepoMock.Setup(x => x.GetAll()) + _activityStatusRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.ActivityStatusRepository) - .Returns(activityStatusRepoMock.Object); - var target = new ActivityStatusDomainService(uowMock.Object); + + var target = CreateActivityStatusDomainService(); // Act var result = target.GetAllActivityStatuses(); @@ -81,5 +81,4 @@ public void GetAll_EmptyResult_ShouldReturnNull() result.Should().BeNull(); } } -} - +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Business.Testing/Services/ActivityTypeDomainServiceTests.cs b/TaleEngine/TaleEngine.Business.Testing/Services/ActivityTypeDomainServiceTests.cs index 6a84a3a..7561edc 100644 --- a/TaleEngine/TaleEngine.Business.Testing/Services/ActivityTypeDomainServiceTests.cs +++ b/TaleEngine/TaleEngine.Business.Testing/Services/ActivityTypeDomainServiceTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TaleEngine.Bussiness.DomainServices; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; using TaleEngine.Fakes.Entities; @@ -14,13 +13,17 @@ namespace TaleEngine.Business.Testing.Services [ExcludeFromCodeCoverage] public class ActivityTypeDomainServiceTests { - private Mock uowMock; - private Mock activityTypeRepoMock; + private readonly Mock _activityTypeRepositoryMock; public ActivityTypeDomainServiceTests() { - uowMock = new Mock(); - activityTypeRepoMock = new Mock(); + _activityTypeRepositoryMock = new Mock(); + } + + private ActivityTypeDomainService CreateActivityTypeDomainService() + { + return new ActivityTypeDomainService( + _activityTypeRepositoryMock.Object); } [Fact] @@ -29,11 +32,10 @@ public void GetAll_Success() // Arrange List list = ActivityBuilder.BuildActivityTypeList(); - activityTypeRepoMock.Setup(x => x.GetAll()) + _activityTypeRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.ActivityTypeRepository) - .Returns(activityTypeRepoMock.Object); - var target = new ActivityTypeDomainService(uowMock.Object); + + var target = CreateActivityTypeDomainService(); // Act var result = target.GetAllActivityTypes(); @@ -49,11 +51,10 @@ public void GetAll_RepoIsEmpty_ShouldReturnNull() // Arrange List list = null; - activityTypeRepoMock.Setup(x => x.GetAll()) + _activityTypeRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.ActivityTypeRepository) - .Returns(activityTypeRepoMock.Object); - var target = new ActivityTypeDomainService(uowMock.Object); + + var target = CreateActivityTypeDomainService(); // Act var result = target.GetAllActivityTypes(); @@ -68,11 +69,10 @@ public void GetAll_EmptyResult_ShouldReturnNull() // Arrange List list = new(); - activityTypeRepoMock.Setup(x => x.GetAll()) + _activityTypeRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.ActivityTypeRepository) - .Returns(activityTypeRepoMock.Object); - var target = new ActivityTypeDomainService(uowMock.Object); + + var target = CreateActivityTypeDomainService(); // Act var result = target.GetAllActivityTypes(); @@ -81,5 +81,4 @@ public void GetAll_EmptyResult_ShouldReturnNull() result.Should().BeNull(); } } -} - +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Business.Testing/Services/RoleDomainServiceTests.cs b/TaleEngine/TaleEngine.Business.Testing/Services/RoleDomainServiceTests.cs index e69fc2a..eb450a7 100644 --- a/TaleEngine/TaleEngine.Business.Testing/Services/RoleDomainServiceTests.cs +++ b/TaleEngine/TaleEngine.Business.Testing/Services/RoleDomainServiceTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TaleEngine.Bussiness.DomainServices; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; using TaleEngine.Fakes.Entities; @@ -14,13 +13,17 @@ namespace TaleEngine.Business.Testing.Services [ExcludeFromCodeCoverage] public class RoleDomainServiceTests { - private Mock uowMock; - private Mock roleRepoMock; + private readonly Mock _roleRepositoryMock; public RoleDomainServiceTests() { - uowMock = new Mock(); - roleRepoMock = new Mock(); + _roleRepositoryMock = new Mock(); + } + + private RoleDomainService CreateRoleDomainService() + { + return new RoleDomainService( + _roleRepositoryMock.Object); } [Fact] @@ -29,11 +32,10 @@ public void GetAll_Success() // Arrange List list = RoleBuilder.BuildRoleList(); - roleRepoMock.Setup(x => x.GetAll()) + _roleRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.RoleRepository) - .Returns(roleRepoMock.Object); - var target = new RoleDomainService(uowMock.Object); + + var target = CreateRoleDomainService(); // Act var result = target.GetAllRoles(); @@ -49,11 +51,10 @@ public void GetAll_RepoIsEmpty_ShouldReturnNull() // Arrange List list = null; - roleRepoMock.Setup(x => x.GetAll()) + _roleRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.RoleRepository) - .Returns(roleRepoMock.Object); - var target = new RoleDomainService(uowMock.Object); + + var target = CreateRoleDomainService(); // Act var result = target.GetAllRoles(); @@ -68,11 +69,10 @@ public void GetAll_EmptyResult_ShouldReturnNull() // Arrange List list = new(); - roleRepoMock.Setup(x => x.GetAll()) + _roleRepositoryMock.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.RoleRepository) - .Returns(roleRepoMock.Object); - var target = new RoleDomainService(uowMock.Object); + + var target = CreateRoleDomainService(); // Act var result = target.GetAllRoles(); @@ -81,5 +81,4 @@ public void GetAll_EmptyResult_ShouldReturnNull() result.Should().BeNull(); } } -} - +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Business.Testing/Services/TimeSlotDomainServiceTests.cs b/TaleEngine/TaleEngine.Business.Testing/Services/TimeSlotDomainServiceTests.cs index 828ec0f..2cb864f 100644 --- a/TaleEngine/TaleEngine.Business.Testing/Services/TimeSlotDomainServiceTests.cs +++ b/TaleEngine/TaleEngine.Business.Testing/Services/TimeSlotDomainServiceTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using TaleEngine.Bussiness.DomainServices; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; using TaleEngine.Fakes.Entities; @@ -14,13 +13,17 @@ namespace TaleEngine.Business.Testing.Services [ExcludeFromCodeCoverage] public class TimeSlotDomainServiceTests { - private Mock uowMock; - private Mock timeSlotRepoMock; + private readonly Mock _timeSlotRepository; public TimeSlotDomainServiceTests() { - uowMock = new Mock(); - timeSlotRepoMock = new Mock(); + _timeSlotRepository = new Mock(); + } + + private TimeSlotDomainService CreateTimeSlotDomainService() + { + return new TimeSlotDomainService( + _timeSlotRepository.Object); } [Fact] @@ -29,11 +32,10 @@ public void GetActiveActivities_Success() // Arrange List list = TimeSlotBuilder.BuildTimeSlotList(); - timeSlotRepoMock.Setup(x => x.GetAll()) + _timeSlotRepository.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.TimeSlotRepository) - .Returns(timeSlotRepoMock.Object); - var target = new TimeSlotDomainService(uowMock.Object); + + var target = CreateTimeSlotDomainService(); // Act var result = target.GetAllTimeSlots(); @@ -49,11 +51,10 @@ public void GetActiveActivities_RepoIsEmpty_ShouldReturnNull() // Arrange List list = null; - timeSlotRepoMock.Setup(x => x.GetAll()) + _timeSlotRepository.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.TimeSlotRepository) - .Returns(timeSlotRepoMock.Object); - var target = new TimeSlotDomainService(uowMock.Object); + + var target = CreateTimeSlotDomainService(); // Act var result = target.GetAllTimeSlots(); @@ -68,11 +69,10 @@ public void GetActiveActivities_EmptyResult_ShouldReturnNull() // Arrange List list = new(); - timeSlotRepoMock.Setup(x => x.GetAll()) + _timeSlotRepository.Setup(x => x.GetAll()) .Returns(list); - uowMock.Setup(x => x.TimeSlotRepository) - .Returns(timeSlotRepoMock.Object); - var target = new TimeSlotDomainService(uowMock.Object); + + var target = CreateTimeSlotDomainService(); // Act var result = target.GetAllTimeSlots(); @@ -81,4 +81,4 @@ public void GetActiveActivities_EmptyResult_ShouldReturnNull() result.Should().BeNull(); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Business.Testing/TaleEngine.Business.Testing.csproj b/TaleEngine/TaleEngine.Business.Testing/TaleEngine.Business.Testing.csproj index ed31117..9f93d4c 100644 --- a/TaleEngine/TaleEngine.Business.Testing/TaleEngine.Business.Testing.csproj +++ b/TaleEngine/TaleEngine.Business.Testing/TaleEngine.Business.Testing.csproj @@ -12,7 +12,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityDomainService.cs index 946f06d..c924deb 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityDomainService.cs @@ -5,7 +5,7 @@ using TaleEngine.Bussiness.Contracts.Models.Results; using TaleEngine.Bussiness.Enums; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; +using TaleEngine.Data.Contracts.Repositories; namespace TaleEngine.Bussiness.DomainServices { @@ -13,16 +13,24 @@ public class ActivityDomainService : IActivityDomainService { private const int ACTIVITIESINHOME = 3; - private readonly IUnitOfWork _unitOfWork; + private readonly IActivityRepository _activityRepository; + private readonly IActivityStatusRepository _activityStatusRepository; + private readonly IEditionRepository _editionRepository; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly ITimeSlotRepository _timeSlotRepository; - public ActivityDomainService(IUnitOfWork unitOfWork) + public ActivityDomainService(IActivityRepository activityRepository, IActivityStatusRepository activityStatusRepository, IActivityTypeRepository activityTypeRepository, IEditionRepository editionRepository, ITimeSlotRepository timeSlotRepository) { - _unitOfWork = unitOfWork; + _activityRepository = activityRepository ?? throw new ArgumentNullException(nameof(activityRepository)); + _activityStatusRepository = activityStatusRepository ?? throw new ArgumentNullException(nameof(activityStatusRepository)); + _activityTypeRepository = activityTypeRepository ?? throw new ArgumentNullException(nameof(activityTypeRepository)); + _editionRepository = editionRepository ?? throw new ArgumentNullException(nameof(editionRepository)); + _timeSlotRepository = timeSlotRepository ?? throw new ArgumentNullException(nameof(timeSlotRepository)); } public List GetActiveActivities(int editionId) { - var activeStatus = _unitOfWork.ActivityStatusRepository + var activeStatus = _activityStatusRepository .GetById((int)ActivityStatusEnum.ACT); if (activeStatus == null) @@ -30,7 +38,7 @@ public List GetActiveActivities(int editionId) return null; } - var activities = _unitOfWork.ActivityRepository + var activities = _activityRepository .GetActivitiesByStatus(editionId, activeStatus.Id); var models = ActivityMapper.Map(activities); @@ -40,7 +48,7 @@ public List GetActiveActivities(int editionId) public List GetPendingActivities(int editionId) { - var pendingStatus = _unitOfWork.ActivityStatusRepository + var pendingStatus = _activityStatusRepository .GetById((int)ActivityStatusEnum.PEN); if (pendingStatus == null) @@ -48,7 +56,7 @@ public List GetPendingActivities(int editionId) return null; } - var activities = _unitOfWork.ActivityRepository + var activities = _activityRepository .GetActivitiesByStatus(editionId, pendingStatus.Id); var models = ActivityMapper.Map(activities); @@ -60,8 +68,8 @@ public int DeleteActivity(int activityId) { try { - _unitOfWork.ActivityRepository.Delete(activityId); - _unitOfWork.ActivityRepository.Save(); + _activityRepository.Delete(activityId); + _activityRepository.Save(); } catch (Exception) { @@ -80,7 +88,7 @@ public int CreateActivity(int editionId, ActivityModel activityModel) return 0; } - var status = _unitOfWork.ActivityStatusRepository.GetById((int)ActivityStatusEnum.PEN); + var status = _activityStatusRepository.GetById((int)ActivityStatusEnum.PEN); activityModel.StatusId = status.Id; var activity = ActivityMapper.Map(activityModel); @@ -91,10 +99,10 @@ public int CreateActivity(int editionId, ActivityModel activityModel) try { - _unitOfWork.ActivityRepository.Insert(activity); - _unitOfWork.ActivityRepository.Save(); + _activityRepository.Insert(activity); + _activityRepository.Save(); } - catch (Exception) + catch (Exception e) { return 0; } @@ -108,8 +116,8 @@ public int UpdateActivity(ActivityModel activityModel) try { - _unitOfWork.ActivityRepository.Update(activity); - _unitOfWork.ActivityRepository.Save(); + _activityRepository.Update(activity); + _activityRepository.Save(); } catch (Exception) { @@ -121,7 +129,7 @@ public int UpdateActivity(ActivityModel activityModel) private bool ValidateNewActivityData(ActivityModel model, int editionId) { - var edition = _unitOfWork.EditionRepository.GetById(editionId); + var edition = _editionRepository.GetById(editionId); if (edition == null) { return false; @@ -132,13 +140,13 @@ private bool ValidateNewActivityData(ActivityModel model, int editionId) return false; } - var type = _unitOfWork.ActivityTypeRepository.GetById(model.TypeId); + var type = _activityTypeRepository.GetById(model.TypeId); if (type == null) { return false; } - var timeSlot = _unitOfWork.TimeSlotRepository.GetById(model.TimeSlotId.Value); + var timeSlot = _timeSlotRepository.GetById(model.TimeSlotId.Value); if (timeSlot == null) { return false; @@ -149,8 +157,8 @@ private bool ValidateNewActivityData(ActivityModel model, int editionId) public int ChangeActivityStatus(int activityId, int statusId) { - var status = _unitOfWork.ActivityStatusRepository.GetById(statusId); - var activity = _unitOfWork.ActivityRepository.GetById(activityId); + var status = _activityStatusRepository.GetById(statusId); + var activity = _activityRepository.GetById(activityId); if (status == null || activity == null) { @@ -161,10 +169,10 @@ public int ChangeActivityStatus(int activityId, int statusId) try { - _unitOfWork.ActivityRepository.Update(activity); - _unitOfWork.ActivityRepository.Save(); + _activityRepository.Update(activity); + _activityRepository.Save(); } - catch (Exception) + catch (Exception e) { return 0; } @@ -177,10 +185,10 @@ public ActivityFilteredResultModel GetActiveActivitiesFiltered(int type, int edi { int activitiesPerPage = 10; - var activeStatus = _unitOfWork.ActivityStatusRepository + var activeStatus = _activityStatusRepository .GetById((int)ActivityStatusEnum.ACT); - var currentEdition = _unitOfWork.EditionRepository + var currentEdition = _editionRepository .GetById(edition); if (currentEdition == null || activeStatus == null) @@ -190,13 +198,13 @@ public ActivityFilteredResultModel GetActiveActivitiesFiltered(int type, int edi int skipByPagination = (currentPage - 1) * activitiesPerPage; - var activities = _unitOfWork.ActivityRepository + var activities = _activityRepository .GetActiveActivitiesFiltered(activeStatus.Id, type, currentEdition.Id, title, skipByPagination, activitiesPerPage); var models = ActivityMapper.Map(activities); - int totalActivities = _unitOfWork.ActivityRepository + int totalActivities = _activityRepository .GetTotalActivities(activeStatus.Id, type, currentEdition.Id, title); double actsPerPage = totalActivities / activitiesPerPage; @@ -214,10 +222,10 @@ public ActivityFilteredResultModel GetActiveActivitiesFiltered(int type, int edi public List GetLastThreeActivities(int edition) { - var activeStatus = _unitOfWork.ActivityStatusRepository + var activeStatus = _activityStatusRepository .GetById((int)ActivityStatusEnum.ACT); - var currentEdition = _unitOfWork.EditionRepository + var currentEdition = _editionRepository .GetById(edition); if (currentEdition == null || activeStatus == null) @@ -225,7 +233,7 @@ public List GetLastThreeActivities(int edition) return null; } - var activities = _unitOfWork.ActivityRepository + var activities = _activityRepository .GetLastThreeActivities(activeStatus.Id, currentEdition.Id, ACTIVITIESINHOME); if (activities == null || activities.Count == 0) diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityStatusDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityStatusDomainService.cs index 81da91c..c681c98 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityStatusDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityStatusDomainService.cs @@ -1,23 +1,24 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using TaleEngine.Bussiness.Contracts.DomainServices; using TaleEngine.Bussiness.Contracts.Models; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; +using TaleEngine.Data.Contracts.Repositories; namespace TaleEngine.Bussiness.DomainServices { public class ActivityStatusDomainService : IActivityStatusDomainService { - private readonly IUnitOfWork _unitOfWork; + private readonly IActivityStatusRepository _activityStatusRepository; - public ActivityStatusDomainService(IUnitOfWork unitOfWork) + public ActivityStatusDomainService(IActivityStatusRepository activityStatusRepository) { - _unitOfWork = unitOfWork; + _activityStatusRepository = activityStatusRepository ?? throw new ArgumentNullException(nameof(activityStatusRepository)); } public List GetAllActivityStatuses() { - var allStatuses = _unitOfWork.ActivityStatusRepository.GetAll(); + var allStatuses = _activityStatusRepository.GetAll(); if (allStatuses == null || allStatuses.Count == 0) { @@ -29,4 +30,4 @@ public List GetAllActivityStatuses() return models; } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityTypeDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityTypeDomainService.cs index 60261e5..773c69a 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityTypeDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/ActivityTypeDomainService.cs @@ -1,23 +1,24 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using TaleEngine.Bussiness.Contracts.DomainServices; using TaleEngine.Bussiness.Contracts.Models; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; +using TaleEngine.Data.Contracts.Repositories; namespace TaleEngine.Bussiness.DomainServices { public class ActivityTypeDomainService : IActivityTypeDomainService { - private readonly IUnitOfWork _unitOfWork; + private readonly IActivityTypeRepository _activityTypeRepository; - public ActivityTypeDomainService(IUnitOfWork unitOfWork) + public ActivityTypeDomainService(IActivityTypeRepository activityTypeRepository) { - _unitOfWork = unitOfWork; + _activityTypeRepository = activityTypeRepository ?? throw new ArgumentNullException(nameof(activityTypeRepository)); } public List GetAllActivityTypes() { - var activityTypes = _unitOfWork.ActivityTypeRepository.GetAll(); + var activityTypes = _activityTypeRepository.GetAll(); if (activityTypes == null || activityTypes.Count == 0) { @@ -29,4 +30,4 @@ public List GetAllActivityTypes() return models; } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/EditionDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/EditionDomainService.cs index c68ae2f..9a75ac4 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/EditionDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/EditionDomainService.cs @@ -3,22 +3,22 @@ using TaleEngine.Bussiness.Contracts.DomainServices; using TaleEngine.Bussiness.Contracts.Models; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; +using TaleEngine.Data.Contracts.Repositories; namespace TaleEngine.Bussiness.DomainServices { public class EditionDomainService : IEditionDomainService { - private readonly IUnitOfWork _unitOfWork; + private readonly IEditionRepository _editionRepository; - public EditionDomainService(IUnitOfWork unitOfWork) + public EditionDomainService(IEditionRepository editionRepository) { - _unitOfWork = unitOfWork; + _editionRepository = editionRepository ?? throw new ArgumentNullException(nameof(editionRepository)); } public EditionDaysModel GetEditionDays(int editionId) { - var edition = _unitOfWork.EditionRepository.GetById(editionId); + var edition = _editionRepository.GetById(editionId); if (edition == null) { @@ -37,7 +37,7 @@ public EditionDaysModel GetEditionDays(int editionId) public EditionModel GetLastOrCurrentEdition(int ofEvent) { - var edition = _unitOfWork.EditionRepository.GetLastEditionInEvent(ofEvent); + var edition = _editionRepository.GetLastEditionInEvent(ofEvent); if (edition != null) { @@ -60,6 +60,5 @@ private List GetAllDaysFromRange(DateTime init, DateTime end) return days; } - } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/EventDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/EventDomainService.cs index 3fb30f6..0fb2bb2 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/EventDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/EventDomainService.cs @@ -1,24 +1,24 @@ -using System.Collections.Generic; -using TaleEngine.Bussiness.Contracts; +using System; +using System.Collections.Generic; using TaleEngine.Bussiness.Contracts.DomainServices; using TaleEngine.Bussiness.Contracts.Models; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; +using TaleEngine.Data.Contracts.Repositories; namespace TaleEngine.Bussiness.DomainServices { public class EventDomainService : IEventDomainService { - private readonly IUnitOfWork _unitOfWork; + private readonly IEventRepository _eventRepository; - public EventDomainService(IUnitOfWork unitOfWork) + public EventDomainService(IEventRepository eventRepository) { - _unitOfWork = unitOfWork; + _eventRepository = eventRepository ?? throw new ArgumentNullException(nameof(eventRepository)); } public List GetEventsNoFilter() { - var events = _unitOfWork.EventRepository.GetAll(); + var events = _eventRepository.GetAll(); var eventDtos = new List(); @@ -32,7 +32,7 @@ public List GetEventsNoFilter() public EventModel GetEvent(int eventId) { - var ev = _unitOfWork.EventRepository.GetById(eventId); + var ev = _eventRepository.GetById(eventId); var result = EventMapper.Map(ev); diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/RoleDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/RoleDomainService.cs index 126a917..669c61e 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/RoleDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/RoleDomainService.cs @@ -3,23 +3,23 @@ using TaleEngine.Bussiness.Contracts.DomainServices; using TaleEngine.Bussiness.Contracts.Models; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.Repositories; namespace TaleEngine.Bussiness.DomainServices { public class RoleDomainService : IRoleDomainService { - private readonly IUnitOfWork _unitOfWork; + private readonly IRoleRepository _roleRepository; - public RoleDomainService(IUnitOfWork unitOfWork) + public RoleDomainService(IRoleRepository roleRepository) { - _unitOfWork = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork)); + _roleRepository = roleRepository ?? throw new ArgumentNullException(nameof(roleRepository)); } public List GetAllRoles() { - List roles = _unitOfWork.RoleRepository.GetAll(); + List roles = _roleRepository.GetAll(); if (roles == null || roles.Count == 0) { @@ -30,4 +30,4 @@ public List GetAllRoles() return roleModels; } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Bussiness/DomainServices/TimeSlotDomainService.cs b/TaleEngine/TaleEngine.Bussiness/DomainServices/TimeSlotDomainService.cs index 3398969..52ba80d 100644 --- a/TaleEngine/TaleEngine.Bussiness/DomainServices/TimeSlotDomainService.cs +++ b/TaleEngine/TaleEngine.Bussiness/DomainServices/TimeSlotDomainService.cs @@ -1,23 +1,24 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using TaleEngine.Bussiness.Contracts.DomainServices; using TaleEngine.Bussiness.Contracts.Models; using TaleEngine.Bussiness.Mappers; -using TaleEngine.Data.Contracts; - +using TaleEngine.Data.Contracts.Repositories; + namespace TaleEngine.Bussiness.DomainServices { public class TimeSlotDomainService : ITimeSlotDomainService { - private readonly IUnitOfWork _unitOfWork; + private readonly ITimeSlotRepository _timeSlotRepository; - public TimeSlotDomainService(IUnitOfWork unitOfWork) - { - _unitOfWork = unitOfWork; + public TimeSlotDomainService(ITimeSlotRepository timeSlotRepository) + { + _timeSlotRepository = timeSlotRepository ?? throw new ArgumentNullException(nameof(timeSlotRepository)); } public List GetAllTimeSlots() { - var timeslots = _unitOfWork.TimeSlotRepository.GetAll(); + var timeslots = _timeSlotRepository.GetAll(); if (timeslots == null || timeslots.Count == 0) { @@ -29,4 +30,4 @@ public List GetAllTimeSlots() return timeslotDtos; } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data.Contracts/IDatabaseContext.cs b/TaleEngine/TaleEngine.Data.Contracts/IDatabaseContext.cs deleted file mode 100644 index eda5c35..0000000 --- a/TaleEngine/TaleEngine.Data.Contracts/IDatabaseContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using TaleEngine.Data.Contracts.Entities; - -namespace TaleEngine.Data.Contracts -{ - public interface IDatabaseContext - { - DbSet Events { get; set; } - DbSet Activities { get; set; } - DbSet ActivityTypes { get; set; } - DbSet ActivityStatuses { get; set; } - DbSet UserStatuses { get; set; } - DbSet Users { get; set; } - DbSet Permissions { get; set; } - DbSet PermissionsValue { get; set; } - DbSet AssignedPermissions { get; set; } - DbSet Roles { get; set; } - DbSet Editions { get; set; } - DbSet TimeSlot { get; set; } - - int SaveChanges(); - } -} diff --git a/TaleEngine/TaleEngine.Data.Contracts/IUnitOfWork.cs b/TaleEngine/TaleEngine.Data.Contracts/IUnitOfWork.cs deleted file mode 100644 index 15ad1ae..0000000 --- a/TaleEngine/TaleEngine.Data.Contracts/IUnitOfWork.cs +++ /dev/null @@ -1,15 +0,0 @@ -using TaleEngine.Data.Contracts.Repositories; - -namespace TaleEngine.Data.Contracts -{ - public interface IUnitOfWork - { - IEventRepository EventRepository { get; } - IActivityRepository ActivityRepository { get; } - IActivityStatusRepository ActivityStatusRepository { get; } - IActivityTypeRepository ActivityTypeRepository { get; } - IEditionRepository EditionRepository { get; } - ITimeSlotRepository TimeSlotRepository { get; } - IRoleRepository RoleRepository { get; } - } -} diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityRepository.cs index 7dfe095..48e0842 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityRepository.cs @@ -1,14 +1,19 @@ using System.Collections.Generic; using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Contracts.Repositories { public interface IActivityRepository : IGenericRepository { List GetEventActivities(int eventId); + List GetActivitiesByStatus(int edition, int status); + List GetActiveActivitiesFiltered(int status, int type, int edition, string title, int skip, int activitiesPerPage); + List GetLastThreeActivities(int status, int edition, int numberOfActivities); + int GetTotalActivities(int status, int type, int edition, string title); } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityStatusRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityStatusRepository.cs index 63f6e44..54b0b79 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityStatusRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityStatusRepository.cs @@ -1,4 +1,5 @@ using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Contracts.Repositories { diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityTypeRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityTypeRepository.cs index 2d8521d..4231657 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityTypeRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IActivityTypeRepository.cs @@ -1,4 +1,5 @@ using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Contracts.Repositories { diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEditionRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEditionRepository.cs index c33e406..ac67a76 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEditionRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEditionRepository.cs @@ -1,4 +1,5 @@ using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Contracts.Repositories { diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEventRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEventRepository.cs index 3fdabf8..cf66201 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEventRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IEventRepository.cs @@ -1,5 +1,6 @@ using TaleEngine.Data.Contracts.Entities; - +using TaleEngine.Data.Contracts.SeedWork; + namespace TaleEngine.Data.Contracts.Repositories { public interface IEventRepository : IGenericRepository diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IRoleRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IRoleRepository.cs index d736705..33e2fac 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/IRoleRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/IRoleRepository.cs @@ -1,4 +1,5 @@ using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Contracts.Repositories { diff --git a/TaleEngine/TaleEngine.Data.Contracts/Repositories/ITimeSlotRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/Repositories/ITimeSlotRepository.cs index b2a91d3..bfc15e1 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/Repositories/ITimeSlotRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/Repositories/ITimeSlotRepository.cs @@ -1,4 +1,5 @@ using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Contracts.Repositories { diff --git a/TaleEngine/TaleEngine.Data.Contracts/IGenericRepository.cs b/TaleEngine/TaleEngine.Data.Contracts/SeedWork/IGenericRepository.cs similarity index 76% rename from TaleEngine/TaleEngine.Data.Contracts/IGenericRepository.cs rename to TaleEngine/TaleEngine.Data.Contracts/SeedWork/IGenericRepository.cs index d56b1df..cebac6a 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/IGenericRepository.cs +++ b/TaleEngine/TaleEngine.Data.Contracts/SeedWork/IGenericRepository.cs @@ -1,15 +1,21 @@ using System.Collections.Generic; -namespace TaleEngine.Data.Contracts +namespace TaleEngine.Data.Contracts.SeedWork { public interface IGenericRepository where T : class { + IUnitOfWork UnitOfWork { get; } + List GetAll(); + T GetById(int entityId); + void Insert(T entity); + void Update(T entity); + void Delete(int entityId); - void Save(); + void Save(); } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data.Contracts/SeedWork/IUnitOfWork.cs b/TaleEngine/TaleEngine.Data.Contracts/SeedWork/IUnitOfWork.cs new file mode 100644 index 0000000..916255e --- /dev/null +++ b/TaleEngine/TaleEngine.Data.Contracts/SeedWork/IUnitOfWork.cs @@ -0,0 +1,8 @@ +using System; + +namespace TaleEngine.Data.Contracts.SeedWork +{ + public interface IUnitOfWork : IDisposable + { + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data.Contracts/TaleEngine.Data.Contracts.csproj b/TaleEngine/TaleEngine.Data.Contracts/TaleEngine.Data.Contracts.csproj index 2974dc2..69fa092 100644 --- a/TaleEngine/TaleEngine.Data.Contracts/TaleEngine.Data.Contracts.csproj +++ b/TaleEngine/TaleEngine.Data.Contracts/TaleEngine.Data.Contracts.csproj @@ -13,6 +13,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + diff --git a/TaleEngine/TaleEngine.Data.Testing/TaleEngine.Data.Testing.csproj b/TaleEngine/TaleEngine.Data.Testing/TaleEngine.Data.Testing.csproj index d08eb4e..623e007 100644 --- a/TaleEngine/TaleEngine.Data.Testing/TaleEngine.Data.Testing.csproj +++ b/TaleEngine/TaleEngine.Data.Testing/TaleEngine.Data.Testing.csproj @@ -6,12 +6,18 @@ false + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + @@ -23,9 +29,4 @@ - - - - - - + \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data.Testing/UnitOfWorkMock.cs b/TaleEngine/TaleEngine.Data.Testing/UnitOfWorkMock.cs deleted file mode 100644 index 7318a8e..0000000 --- a/TaleEngine/TaleEngine.Data.Testing/UnitOfWorkMock.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Moq; -using TaleEngine.Data.Contracts; - -namespace TaleEngine.Data.Testing -{ - public class UnitOfWorkMock - { - public Mock _unitOfWork; - - public UnitOfWorkMock() - { - _unitOfWork = new Mock(); - Setup(); - } - - private void Setup() - { - //var activityRepository = new ActivityRepositoryMock(); - //var editionRepository = new EditionRepositoryMock(); - //var timeSlotRepository = new TimeSlotRepositoryMock(); - //var activityStatusRepository = new ActivityStatusRepositoryMock(); - //var activityTypeRepository = new ActivityTypeRepositoryMock(); - - //_unitOfWork.Setup(m => m.ActivityRepository) - // .Returns(activityRepository._activityRepository.Object); - //_unitOfWork.Setup(m => m.EditionRepository) - // .Returns(editionRepository._editionRepository.Object); - //_unitOfWork.Setup(m => m.TimeSlotRepository) - // .Returns(timeSlotRepository._timeSlotRepository.Object); - //_unitOfWork.Setup(m => m.ActivityStatusRepository) - // .Returns(activityStatusRepository._activityStatusRepository.Object); - //_unitOfWork.Setup(m => m.ActivityTypeRepository) - // .Returns(activityTypeRepository._activityStatusRepository.Object); - } - } -} diff --git a/TaleEngine/TaleEngine.Data/Exceptions/TaleEngineDomainException.cs b/TaleEngine/TaleEngine.Data/Exceptions/TaleEngineDomainException.cs new file mode 100644 index 0000000..f5fe7a4 --- /dev/null +++ b/TaleEngine/TaleEngine.Data/Exceptions/TaleEngineDomainException.cs @@ -0,0 +1,21 @@ +using System; + +namespace TaleEngine.Data.Exceptions +{ + /// + /// Exception type for domain exceptions + /// + public class TaleEngineDomainException : Exception + { + public TaleEngineDomainException() + { } + + public TaleEngineDomainException(string message) + : base(message) + { } + + public TaleEngineDomainException(string message, Exception innerException) + : base(message, innerException) + { } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/IMediatorExtensions.cs b/TaleEngine/TaleEngine.Data/IMediatorExtensions.cs new file mode 100644 index 0000000..eb0ffec --- /dev/null +++ b/TaleEngine/TaleEngine.Data/IMediatorExtensions.cs @@ -0,0 +1,27 @@ +using MediatR; +using System.Linq; +using System.Threading.Tasks; +using TaleEngine.Data.SeedWork; + +namespace TaleEngine.Data +{ + internal static class IMediatorExtensions + { + public static async Task DispatchDomainEventsAsync(this IMediator mediator, TaleEngineContext ctx) + { + var domainEntities = ctx.ChangeTracker + .Entries() + .Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any()); + + var domainEvents = domainEntities + .SelectMany(x => x.Entity.DomainEvents) + .ToList(); + + domainEntities.ToList() + .ForEach(entity => entity.Entity.ClearDomainEvents()); + + foreach (var domainEvent in domainEvents) + await mediator.Publish(domainEvent); + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Migrations/20191009133730_initial.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20191009133730_initial.Designer.cs index 56e81e0..112087b 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20191009133730_initial.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20191009133730_initial.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20191009133730_initial")] partial class initial { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20191015120601_DataStructure.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20191015120601_DataStructure.Designer.cs index e50faf4..f802dd0 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20191015120601_DataStructure.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20191015120601_DataStructure.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20191015120601_DataStructure")] partial class DataStructure { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20191016120933_ActivityTimeControl.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20191016120933_ActivityTimeControl.Designer.cs index 16a0501..82327a9 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20191016120933_ActivityTimeControl.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20191016120933_ActivityTimeControl.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20191016120933_ActivityTimeControl")] partial class ActivityTimeControl { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20191021181350_AddMasterTablesData.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20191021181350_AddMasterTablesData.Designer.cs index cf9a50f..4c8c470 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20191021181350_AddMasterTablesData.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20191021181350_AddMasterTablesData.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20191021181350_AddMasterTablesData")] partial class AddMasterTablesData { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20210219182326_ReorganizeEntities.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20210219182326_ReorganizeEntities.Designer.cs index 6e271a2..b0c7d93 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20210219182326_ReorganizeEntities.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20210219182326_ReorganizeEntities.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20210219182326_ReorganizeEntities")] partial class ReorganizeEntities { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20210222155903_ChangeUserMngRelationships.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20210222155903_ChangeUserMngRelationships.Designer.cs index d5d2747..6688997 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20210222155903_ChangeUserMngRelationships.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20210222155903_ChangeUserMngRelationships.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20210222155903_ChangeUserMngRelationships")] partial class ChangeUserMngRelationships { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20210222162400_ConnectRoleToEvent.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20210222162400_ConnectRoleToEvent.Designer.cs index 0798780..de9970a 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20210222162400_ConnectRoleToEvent.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20210222162400_ConnectRoleToEvent.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20210222162400_ConnectRoleToEvent")] partial class ConnectRoleToEvent { diff --git a/TaleEngine/TaleEngine.Data/Migrations/20210317091148_RemoveFieldsBaseEntity.Designer.cs b/TaleEngine/TaleEngine.Data/Migrations/20210317091148_RemoveFieldsBaseEntity.Designer.cs index 22ba40a..e80265e 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/20210317091148_RemoveFieldsBaseEntity.Designer.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/20210317091148_RemoveFieldsBaseEntity.Designer.cs @@ -9,7 +9,7 @@ namespace TaleEngine.Data.Migrations { - [DbContext(typeof(DatabaseContext))] + [DbContext(typeof(TaleEngineContext))] [Migration("20210317091148_RemoveFieldsBaseEntity")] partial class RemoveFieldsBaseEntity { diff --git a/TaleEngine/TaleEngine.Data/Migrations/DatabaseContextModelSnapshot.cs b/TaleEngine/TaleEngine.Data/Migrations/TaleEngineContextModelSnapshot.cs similarity index 97% rename from TaleEngine/TaleEngine.Data/Migrations/DatabaseContextModelSnapshot.cs rename to TaleEngine/TaleEngine.Data/Migrations/TaleEngineContextModelSnapshot.cs index 2ad6dba..b019b1e 100644 --- a/TaleEngine/TaleEngine.Data/Migrations/DatabaseContextModelSnapshot.cs +++ b/TaleEngine/TaleEngine.Data/Migrations/TaleEngineContextModelSnapshot.cs @@ -1,892 +1,892 @@ -// -using System; -using System.Diagnostics.CodeAnalysis; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using TaleEngine.Data; - -namespace TaleEngine.Data.Migrations -{ - [DbContext(typeof(DatabaseContext))] - [ExcludeFromCodeCoverage] - partial class DatabaseContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("ActivityUser", b => - { - b.Property("ActivitiesCreateId") - .HasColumnType("int"); - - b.Property("UsersCreateId") - .HasColumnType("int"); - - b.HasKey("ActivitiesCreateId", "UsersCreateId"); - - b.HasIndex("UsersCreateId"); - - b.ToTable("ActivityCreators"); - }); - - modelBuilder.Entity("ActivityUser1", b => - { - b.Property("ActivitiesFavId") - .HasColumnType("int"); - - b.Property("UsersFavId") - .HasColumnType("int"); - - b.HasKey("ActivitiesFavId", "UsersFavId"); - - b.HasIndex("UsersFavId"); - - b.ToTable("FavActivities"); - }); - - modelBuilder.Entity("ActivityUser2", b => - { - b.Property("ActivitiesPlayId") - .HasColumnType("int"); - - b.Property("UsersPlayId") - .HasColumnType("int"); - - b.HasKey("ActivitiesPlayId", "UsersPlayId"); - - b.HasIndex("UsersPlayId"); - - b.ToTable("ActivityEnrollments"); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.Property("RolesId") - .HasColumnType("int"); - - b.Property("UsersId") - .HasColumnType("int"); - - b.HasKey("RolesId", "UsersId"); - - b.HasIndex("UsersId"); - - b.ToTable("RoleUser"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Activity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("EditionId") - .HasColumnType("int"); - - b.Property("EndDateTime") - .HasColumnType("datetime2"); - - b.Property("Image") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Places") - .HasColumnType("int"); - - b.Property("PublicationDate") - .HasColumnType("datetime2"); - - b.Property("StartDateTime") - .HasColumnType("datetime2"); - - b.Property("StatusId") - .HasColumnType("int"); - - b.Property("TimeSlotId") - .HasColumnType("int"); - - b.Property("Title") - .HasColumnType("nvarchar(max)"); - - b.Property("TypeId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("EditionId"); - - b.HasIndex("StatusId"); - - b.HasIndex("TimeSlotId"); - - b.HasIndex("TypeId"); - - b.ToTable("Activity"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityStatus", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Abbr") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("ActivityStatus"); - - b.HasData( - new - { - Id = 1, - Abbr = "PEN", - Description = "Waiting for approval", - Name = "Pending" - }, - new - { - Id = 2, - Abbr = "ACT", - Description = "Accepted and waiting for participants", - Name = "Active" - }, - new - { - Id = 3, - Abbr = "REV", - Description = "In revision process", - Name = "Revision" - }, - new - { - Id = 4, - Abbr = "BAN", - Description = "Excluded as it doesn't align with the core values", - Name = "Banned" - }); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Abbr") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("ActivityType"); - - b.HasData( - new - { - Id = 1, - Abbr = "TTRPG", - Description = "Tabletop roleplaying game session", - Name = "Tabletop role-playing games" - }, - new - { - Id = 2, - Abbr = "BG", - Description = "Board games for everyone!", - Name = "Board games" - }, - new - { - Id = 3, - Abbr = "TOU", - Description = "A board or card game competition", - Name = "Tournament" - }, - new - { - Id = 4, - Abbr = "DEM", - Description = "Show your brand new project to the community", - Name = "Demos" - }, - new - { - Id = 5, - Abbr = "LARP", - Description = "Role-play games in live action", - Name = "Live action role-playing" - }); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.AssignedPermission", b => - { - b.Property("RoleId") - .HasColumnType("int"); - - b.Property("PermissionId") - .HasColumnType("int"); - - b.Property("PermissionValueId") - .HasColumnType("int"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Id") - .HasColumnType("int"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.HasKey("RoleId", "PermissionId", "PermissionValueId"); - - b.HasIndex("PermissionId"); - - b.HasIndex("PermissionValueId"); - - b.ToTable("AssignedPermissions"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Edition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("DateEnd") - .HasColumnType("datetime2"); - - b.Property("DateInit") - .HasColumnType("datetime2"); - - b.Property("EventId") - .HasColumnType("int"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.HasKey("Id"); - - b.HasIndex("EventId"); - - b.ToTable("Edition"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Event", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Title") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Event"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Permission", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Abbr") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Permission"); - - b.HasData( - new - { - Id = 1, - Abbr = "SEE", - Name = "See activities" - }, - new - { - Id = 2, - Abbr = "REQJOIN", - Name = "Request join" - }, - new - { - Id = 3, - Abbr = "MARKFAV", - Name = "Mark as favourite" - }, - new - { - Id = 4, - Abbr = "ABANACT", - Name = "Abandon activity" - }, - new - { - Id = 5, - Abbr = "PROPACT", - Name = "Propose activity" - }, - new - { - Id = 6, - Abbr = "EDITACT", - Name = "Edit proposed activity" - }, - new - { - Id = 7, - Abbr = "DELACT", - Name = "Delete proposed activity" - }, - new - { - Id = 8, - Abbr = "SEEPART", - Name = "See participants" - }, - new - { - Id = 9, - Abbr = "ACCACTEDIT", - Name = "Accept activity edit" - }, - new - { - Id = 10, - Abbr = "ACCACTDEL", - Name = "Accept activity deletion" - }, - new - { - Id = 11, - Abbr = "MARKREV", - Name = "Mark proposal for revision" - }, - new - { - Id = 12, - Abbr = "CRTU", - Name = "Create user" - }, - new - { - Id = 13, - Abbr = "DELU", - Name = "Delete user" - }, - new - { - Id = 14, - Abbr = "BANU", - Name = "Ban user" - }, - new - { - Id = 15, - Abbr = "ACCACTPROP", - Name = "Accept activity proposal" - }, - new - { - Id = 16, - Abbr = "DELACTPROP", - Name = "Delete activity proposal" - }, - new - { - Id = 17, - Abbr = "EDITU", - Name = "Edit user" - }); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.PermissionValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Abbr") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("PermissionValue"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Abbr") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("EventId") - .HasColumnType("int"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("EventId"); - - b.ToTable("Role"); - - b.HasData( - new - { - Id = 1, - Abbr = "MNG", - Description = "Manager of the app", - EventId = 2, - Name = "Manager" - }, - new - { - Id = 2, - Abbr = "OPR", - Description = "Operator in the app", - EventId = 2, - Name = "Operator" - }, - new - { - Id = 3, - Abbr = "CRT", - Description = "Creator content in the events", - EventId = 2, - Name = "Creator" - }, - new - { - Id = 4, - Abbr = "USR", - Description = "Player in the application", - EventId = 2, - Name = "User" - }); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.TimeSlot", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("TimeSlot"); - - b.HasData( - new - { - Id = 1, - Name = "MON" - }, - new - { - Id = 2, - Name = "EVE" - }, - new - { - Id = 3, - Name = "NGH" - }); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Blog") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Mail") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .HasColumnType("nvarchar(max)"); - - b.Property("StatusId") - .HasColumnType("int"); - - b.Property("Website") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("StatusId"); - - b.ToTable("User"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.UserStatus", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Abbr") - .HasColumnType("nvarchar(max)"); - - b.Property("CreateDateTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("ModificationDate") - .HasColumnType("datetime2"); - - b.Property("Name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("UserStatus"); - - b.HasData( - new - { - Id = 1, - Abbr = "PEN", - Description = "Pending to confirm", - Name = "Pending" - }, - new - { - Id = 2, - Abbr = "ACT", - Description = "Active user", - Name = "Active" - }, - new - { - Id = 3, - Abbr = "REV", - Description = "In revision process", - Name = "Revision" - }, - new - { - Id = 4, - Abbr = "BAN", - Description = "Banned from event", - Name = "Banned" - }, - new - { - Id = 5, - Abbr = "INC", - Description = "Pending to confirm", - Name = "Inactive" - }); - }); - - modelBuilder.Entity("ActivityUser", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Activity", null) - .WithMany() - .HasForeignKey("ActivitiesCreateId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) - .WithMany() - .HasForeignKey("UsersCreateId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ActivityUser1", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Activity", null) - .WithMany() - .HasForeignKey("ActivitiesFavId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) - .WithMany() - .HasForeignKey("UsersFavId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("ActivityUser2", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Activity", null) - .WithMany() - .HasForeignKey("ActivitiesPlayId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) - .WithMany() - .HasForeignKey("UsersPlayId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("RoleUser", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Role", null) - .WithMany() - .HasForeignKey("RolesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) - .WithMany() - .HasForeignKey("UsersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Activity", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Edition", "Edition") - .WithMany("Activities") - .HasForeignKey("EditionId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.ActivityStatus", "Status") - .WithMany("Activities") - .HasForeignKey("StatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.TimeSlot", "TimeSlot") - .WithMany("Activities") - .HasForeignKey("TimeSlotId"); - - b.HasOne("TaleEngine.Data.Contracts.Entities.ActivityType", "Type") - .WithMany("Activities") - .HasForeignKey("TypeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Edition"); - - b.Navigation("Status"); - - b.Navigation("TimeSlot"); - - b.Navigation("Type"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.AssignedPermission", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Permission", "Permission") - .WithMany() - .HasForeignKey("PermissionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.PermissionValue", "PermissionValue") - .WithMany() - .HasForeignKey("PermissionValueId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TaleEngine.Data.Contracts.Entities.Role", "Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Permission"); - - b.Navigation("PermissionValue"); - - b.Navigation("Role"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Edition", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Event", "Event") - .WithMany("Editions") - .HasForeignKey("EventId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Role", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.Event", "Event") - .WithMany("Roles") - .HasForeignKey("EventId"); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.User", b => - { - b.HasOne("TaleEngine.Data.Contracts.Entities.UserStatus", "Status") - .WithMany("Users") - .HasForeignKey("StatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Status"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityStatus", b => - { - b.Navigation("Activities"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityType", b => - { - b.Navigation("Activities"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Edition", b => - { - b.Navigation("Activities"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Event", b => - { - b.Navigation("Editions"); - - b.Navigation("Roles"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.TimeSlot", b => - { - b.Navigation("Activities"); - }); - - modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.UserStatus", b => - { - b.Navigation("Users"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using System.Diagnostics.CodeAnalysis; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TaleEngine.Data; + +namespace TaleEngine.Data.Migrations +{ + [DbContext(typeof(TaleEngineContext))] + [ExcludeFromCodeCoverage] + partial class TaleEngineContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.4") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("ActivityUser", b => + { + b.Property("ActivitiesCreateId") + .HasColumnType("int"); + + b.Property("UsersCreateId") + .HasColumnType("int"); + + b.HasKey("ActivitiesCreateId", "UsersCreateId"); + + b.HasIndex("UsersCreateId"); + + b.ToTable("ActivityCreators"); + }); + + modelBuilder.Entity("ActivityUser1", b => + { + b.Property("ActivitiesFavId") + .HasColumnType("int"); + + b.Property("UsersFavId") + .HasColumnType("int"); + + b.HasKey("ActivitiesFavId", "UsersFavId"); + + b.HasIndex("UsersFavId"); + + b.ToTable("FavActivities"); + }); + + modelBuilder.Entity("ActivityUser2", b => + { + b.Property("ActivitiesPlayId") + .HasColumnType("int"); + + b.Property("UsersPlayId") + .HasColumnType("int"); + + b.HasKey("ActivitiesPlayId", "UsersPlayId"); + + b.HasIndex("UsersPlayId"); + + b.ToTable("ActivityEnrollments"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("int"); + + b.Property("UsersId") + .HasColumnType("int"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Activity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EditionId") + .HasColumnType("int"); + + b.Property("EndDateTime") + .HasColumnType("datetime2"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Places") + .HasColumnType("int"); + + b.Property("PublicationDate") + .HasColumnType("datetime2"); + + b.Property("StartDateTime") + .HasColumnType("datetime2"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("TimeSlotId") + .HasColumnType("int"); + + b.Property("Title") + .HasColumnType("nvarchar(max)"); + + b.Property("TypeId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("EditionId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TimeSlotId"); + + b.HasIndex("TypeId"); + + b.ToTable("Activity"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Abbr") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ActivityStatus"); + + b.HasData( + new + { + Id = 1, + Abbr = "PEN", + Description = "Waiting for approval", + Name = "Pending" + }, + new + { + Id = 2, + Abbr = "ACT", + Description = "Accepted and waiting for participants", + Name = "Active" + }, + new + { + Id = 3, + Abbr = "REV", + Description = "In revision process", + Name = "Revision" + }, + new + { + Id = 4, + Abbr = "BAN", + Description = "Excluded as it doesn't align with the core values", + Name = "Banned" + }); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Abbr") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ActivityType"); + + b.HasData( + new + { + Id = 1, + Abbr = "TTRPG", + Description = "Tabletop roleplaying game session", + Name = "Tabletop role-playing games" + }, + new + { + Id = 2, + Abbr = "BG", + Description = "Board games for everyone!", + Name = "Board games" + }, + new + { + Id = 3, + Abbr = "TOU", + Description = "A board or card game competition", + Name = "Tournament" + }, + new + { + Id = 4, + Abbr = "DEM", + Description = "Show your brand new project to the community", + Name = "Demos" + }, + new + { + Id = 5, + Abbr = "LARP", + Description = "Role-play games in live action", + Name = "Live action role-playing" + }); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.AssignedPermission", b => + { + b.Property("RoleId") + .HasColumnType("int"); + + b.Property("PermissionId") + .HasColumnType("int"); + + b.Property("PermissionValueId") + .HasColumnType("int"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Id") + .HasColumnType("int"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.HasKey("RoleId", "PermissionId", "PermissionValueId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("PermissionValueId"); + + b.ToTable("AssignedPermissions"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Edition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("DateEnd") + .HasColumnType("datetime2"); + + b.Property("DateInit") + .HasColumnType("datetime2"); + + b.Property("EventId") + .HasColumnType("int"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("Edition"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Title") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Event"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Abbr") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Permission"); + + b.HasData( + new + { + Id = 1, + Abbr = "SEE", + Name = "See activities" + }, + new + { + Id = 2, + Abbr = "REQJOIN", + Name = "Request join" + }, + new + { + Id = 3, + Abbr = "MARKFAV", + Name = "Mark as favourite" + }, + new + { + Id = 4, + Abbr = "ABANACT", + Name = "Abandon activity" + }, + new + { + Id = 5, + Abbr = "PROPACT", + Name = "Propose activity" + }, + new + { + Id = 6, + Abbr = "EDITACT", + Name = "Edit proposed activity" + }, + new + { + Id = 7, + Abbr = "DELACT", + Name = "Delete proposed activity" + }, + new + { + Id = 8, + Abbr = "SEEPART", + Name = "See participants" + }, + new + { + Id = 9, + Abbr = "ACCACTEDIT", + Name = "Accept activity edit" + }, + new + { + Id = 10, + Abbr = "ACCACTDEL", + Name = "Accept activity deletion" + }, + new + { + Id = 11, + Abbr = "MARKREV", + Name = "Mark proposal for revision" + }, + new + { + Id = 12, + Abbr = "CRTU", + Name = "Create user" + }, + new + { + Id = 13, + Abbr = "DELU", + Name = "Delete user" + }, + new + { + Id = 14, + Abbr = "BANU", + Name = "Ban user" + }, + new + { + Id = 15, + Abbr = "ACCACTPROP", + Name = "Accept activity proposal" + }, + new + { + Id = 16, + Abbr = "DELACTPROP", + Name = "Delete activity proposal" + }, + new + { + Id = 17, + Abbr = "EDITU", + Name = "Edit user" + }); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.PermissionValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Abbr") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("PermissionValue"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Abbr") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EventId") + .HasColumnType("int"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("Role"); + + b.HasData( + new + { + Id = 1, + Abbr = "MNG", + Description = "Manager of the app", + EventId = 2, + Name = "Manager" + }, + new + { + Id = 2, + Abbr = "OPR", + Description = "Operator in the app", + EventId = 2, + Name = "Operator" + }, + new + { + Id = 3, + Abbr = "CRT", + Description = "Creator content in the events", + EventId = 2, + Name = "Creator" + }, + new + { + Id = 4, + Abbr = "USR", + Description = "Player in the application", + EventId = 2, + Name = "User" + }); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.TimeSlot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("TimeSlot"); + + b.HasData( + new + { + Id = 1, + Name = "MON" + }, + new + { + Id = 2, + Name = "EVE" + }, + new + { + Id = 3, + Name = "NGH" + }); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Blog") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Mail") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .HasColumnType("nvarchar(max)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Website") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("StatusId"); + + b.ToTable("User"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.UserStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Abbr") + .HasColumnType("nvarchar(max)"); + + b.Property("CreateDateTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("ModificationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("UserStatus"); + + b.HasData( + new + { + Id = 1, + Abbr = "PEN", + Description = "Pending to confirm", + Name = "Pending" + }, + new + { + Id = 2, + Abbr = "ACT", + Description = "Active user", + Name = "Active" + }, + new + { + Id = 3, + Abbr = "REV", + Description = "In revision process", + Name = "Revision" + }, + new + { + Id = 4, + Abbr = "BAN", + Description = "Banned from event", + Name = "Banned" + }, + new + { + Id = 5, + Abbr = "INC", + Description = "Pending to confirm", + Name = "Inactive" + }); + }); + + modelBuilder.Entity("ActivityUser", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Activity", null) + .WithMany() + .HasForeignKey("ActivitiesCreateId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) + .WithMany() + .HasForeignKey("UsersCreateId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ActivityUser1", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Activity", null) + .WithMany() + .HasForeignKey("ActivitiesFavId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) + .WithMany() + .HasForeignKey("UsersFavId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ActivityUser2", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Activity", null) + .WithMany() + .HasForeignKey("ActivitiesPlayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) + .WithMany() + .HasForeignKey("UsersPlayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Activity", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Edition", "Edition") + .WithMany("Activities") + .HasForeignKey("EditionId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.ActivityStatus", "Status") + .WithMany("Activities") + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.TimeSlot", "TimeSlot") + .WithMany("Activities") + .HasForeignKey("TimeSlotId"); + + b.HasOne("TaleEngine.Data.Contracts.Entities.ActivityType", "Type") + .WithMany("Activities") + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Edition"); + + b.Navigation("Status"); + + b.Navigation("TimeSlot"); + + b.Navigation("Type"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.AssignedPermission", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Permission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.PermissionValue", "PermissionValue") + .WithMany() + .HasForeignKey("PermissionValueId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TaleEngine.Data.Contracts.Entities.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("PermissionValue"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Edition", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Event", "Event") + .WithMany("Editions") + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Role", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.Event", "Event") + .WithMany("Roles") + .HasForeignKey("EventId"); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.User", b => + { + b.HasOne("TaleEngine.Data.Contracts.Entities.UserStatus", "Status") + .WithMany("Users") + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityStatus", b => + { + b.Navigation("Activities"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.ActivityType", b => + { + b.Navigation("Activities"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Edition", b => + { + b.Navigation("Activities"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.Event", b => + { + b.Navigation("Editions"); + + b.Navigation("Roles"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.TimeSlot", b => + { + b.Navigation("Activities"); + }); + + modelBuilder.Entity("TaleEngine.Data.Contracts.Entities.UserStatus", b => + { + b.Navigation("Users"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TaleEngine/TaleEngine.Data/Repositories/ActivityRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/ActivityRepository.cs index f3f585f..76022e3 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/ActivityRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/ActivityRepository.cs @@ -1,19 +1,27 @@ using System; using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class ActivityRepository : IActivityRepository { - private readonly IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public ActivityRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context; + get + { + return _dbContext; + } + } + + public ActivityRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -23,40 +31,40 @@ public void Delete(int entityId) public List GetAll() { - return _context.Activities.ToList(); + return _dbContext.Activities.ToList(); } public Activity GetById(int entityId) { - return _context.Activities + return _dbContext.Activities .FirstOrDefault(a => a.Id == entityId); } public void Insert(Activity entity) { - _context.Activities.Add(entity); + _dbContext.Activities.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(Activity entity) { - _context.Activities.Update(entity); + _dbContext.Activities.Update(entity); } public List GetEventActivities(int editionId) { - return _context.Activities + return _dbContext.Activities .Where(a => a.EditionId == editionId) .ToList(); } public List GetActivitiesByStatus(int edition, int status) { - return _context.Activities + return _dbContext.Activities .Where(a => a.EditionId == edition && a.StatusId == status) .ToList(); } @@ -85,7 +93,7 @@ public int GetTotalActivities(int status, int type, int edition, string title) private IQueryable GetActiveActivitiesWithFilter(int status, int type, int edition, string title) { - var query = _context.Activities.Select(a => a).Where(a => a.EditionId == edition); + var query = _dbContext.Activities.Select(a => a).Where(a => a.EditionId == edition); if (status != 0) { query = query.Where(a => a.StatusId == status); @@ -102,4 +110,4 @@ private IQueryable GetActiveActivitiesWithFilter(int status, int type, return query; } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Repositories/ActivityStatusRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/ActivityStatusRepository.cs index 3f3ff05..460f0ff 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/ActivityStatusRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/ActivityStatusRepository.cs @@ -1,18 +1,27 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class ActivityStatusRepository : IActivityStatusRepository { - private readonly IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public ActivityStatusRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context; + get + { + return _dbContext; + } + } + + public ActivityStatusRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -22,28 +31,28 @@ public void Delete(int entityId) public List GetAll() { - return _context.ActivityStatuses.ToList(); + return _dbContext.ActivityStatuses.ToList(); } public ActivityStatus GetById(int entityId) { - return _context.ActivityStatuses + return _dbContext.ActivityStatuses .FirstOrDefault(aS => aS.Id == entityId); } public void Insert(ActivityStatus entity) { - _context.ActivityStatuses.Add(entity); + _dbContext.ActivityStatuses.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(ActivityStatus entity) { - _context.ActivityStatuses.Update(entity); + _dbContext.ActivityStatuses.Update(entity); } } } \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Repositories/ActivityTypeRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/ActivityTypeRepository.cs index 2044ed6..0d9b9dd 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/ActivityTypeRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/ActivityTypeRepository.cs @@ -1,18 +1,27 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class ActivityTypeRepository : IActivityTypeRepository { - private readonly IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public ActivityTypeRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context; + get + { + return _dbContext; + } + } + + public ActivityTypeRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -22,28 +31,28 @@ public void Delete(int entityId) public List GetAll() { - return _context.ActivityTypes.ToList(); + return _dbContext.ActivityTypes.ToList(); } public ActivityType GetById(int entityId) { - return _context.ActivityTypes + return _dbContext.ActivityTypes .FirstOrDefault(aT => aT.Id == entityId); } public void Insert(ActivityType entity) { - _context.ActivityTypes.Add(entity); + _dbContext.ActivityTypes.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(ActivityType entity) { - _context.ActivityTypes.Update(entity); + _dbContext.ActivityTypes.Update(entity); } } } \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Repositories/EditionRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/EditionRepository.cs index d4d9ff1..2ee5ffc 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/EditionRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/EditionRepository.cs @@ -1,19 +1,27 @@ using System; using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class EditionRepository : IEditionRepository { - private readonly IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public EditionRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context; + get + { + return _dbContext; + } + } + + public EditionRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -23,32 +31,32 @@ public void Delete(int entityId) public List GetAll() { - return _context.Editions.ToList(); + return _dbContext.Editions.ToList(); } public Edition GetById(int entityId) { - return _context.Editions.FirstOrDefault(ed => ed.Id == entityId); + return _dbContext.Editions.FirstOrDefault(ed => ed.Id == entityId); } public Edition GetLastEditionInEvent(int ofEvent) { - return _context.Editions.FirstOrDefault(ed => ed.EventId == ofEvent); + return _dbContext.Editions.FirstOrDefault(ed => ed.EventId == ofEvent); } public void Insert(Edition entity) { - _context.Editions.Add(entity); + _dbContext.Editions.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(Edition entity) { - _context.Editions.Update(entity); + _dbContext.Editions.Update(entity); } } } \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Repositories/EventRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/EventRepository.cs index d1904b0..e3069e6 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/EventRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/EventRepository.cs @@ -1,18 +1,27 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class EventRepository : IEventRepository { - private readonly IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public EventRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context; + get + { + return _dbContext; + } + } + + public EventRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -22,28 +31,28 @@ public void Delete(int entityId) public List GetAll() { - return _context.Events.ToList(); + return _dbContext.Events.ToList(); } public Event GetById(int entityId) { - return _context.Events + return _dbContext.Events .FirstOrDefault(ev => ev.Id == entityId); } public void Insert(Event entity) { - _context.Events.Add(entity); + _dbContext.Events.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(Event entity) { - _context.Events.Update(entity); + _dbContext.Events.Update(entity); } } } \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Repositories/RoleRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/RoleRepository.cs index e23e87a..c8213f4 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/RoleRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/RoleRepository.cs @@ -1,19 +1,27 @@ using System; using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class RoleRepository : IRoleRepository { - private IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public RoleRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context ?? throw new ArgumentNullException(nameof(context)); + get + { + return _dbContext; + } + } + + public RoleRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -23,7 +31,7 @@ public void Delete(int entityId) public List GetAll() { - return _context.Roles.ToList(); + return _dbContext.Roles.ToList(); } public Role GetById(int entityId) @@ -33,17 +41,17 @@ public Role GetById(int entityId) public void Insert(Role entity) { - _context.Roles.Add(entity); + _dbContext.Roles.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(Role entity) { - _context.Roles.Update(entity); + _dbContext.Roles.Update(entity); } } } \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/Repositories/TimeSlotRepository.cs b/TaleEngine/TaleEngine.Data/Repositories/TimeSlotRepository.cs index 2b7277a..1231530 100644 --- a/TaleEngine/TaleEngine.Data/Repositories/TimeSlotRepository.cs +++ b/TaleEngine/TaleEngine.Data/Repositories/TimeSlotRepository.cs @@ -1,19 +1,27 @@ using System; using System.Collections.Generic; using System.Linq; -using TaleEngine.Data.Contracts; using TaleEngine.Data.Contracts.Entities; using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Contracts.SeedWork; namespace TaleEngine.Data.Repositories { public class TimeSlotRepository : ITimeSlotRepository { - private readonly IDatabaseContext _context; + private readonly TaleEngineContext _dbContext; - public TimeSlotRepository(IDatabaseContext context) + public IUnitOfWork UnitOfWork { - _context = context; + get + { + return _dbContext; + } + } + + public TimeSlotRepository(TaleEngineContext context) + { + _dbContext = context ?? throw new ArgumentNullException(nameof(context)); } public void Delete(int entityId) @@ -23,28 +31,28 @@ public void Delete(int entityId) public List GetAll() { - return _context.TimeSlot.ToList(); + return _dbContext.TimeSlot.ToList(); } public TimeSlot GetById(int entityId) { - return _context.TimeSlot + return _dbContext.TimeSlot .FirstOrDefault(a => a.Id == entityId); } public void Insert(TimeSlot entity) { - _context.TimeSlot.Add(entity); + _dbContext.TimeSlot.Add(entity); } public void Save() { - _context.SaveChanges(); + _dbContext.SaveChanges(); } public void Update(TimeSlot entity) { - _context.TimeSlot.Update(entity); + _dbContext.TimeSlot.Update(entity); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/SeedWork/Entity.cs b/TaleEngine/TaleEngine.Data/SeedWork/Entity.cs new file mode 100644 index 0000000..6c5ab25 --- /dev/null +++ b/TaleEngine/TaleEngine.Data/SeedWork/Entity.cs @@ -0,0 +1,92 @@ +using MediatR; +using System.Collections.Generic; + +namespace TaleEngine.Data.SeedWork +{ + public abstract class Entity + { + private int? _requestedHashCode; + private int _Id; + + public virtual int Id + { + get + { + return _Id; + } + protected set + { + _Id = value; + } + } + + private List _domainEvents; + public IReadOnlyCollection DomainEvents => _domainEvents?.AsReadOnly(); + + public void AddDomainEvent(INotification eventItem) + { + _domainEvents = _domainEvents ?? new List(); + _domainEvents.Add(eventItem); + } + + public void RemoveDomainEvent(INotification eventItem) + { + _domainEvents?.Remove(eventItem); + } + + public void ClearDomainEvents() + { + _domainEvents?.Clear(); + } + + public bool IsTransient() + { + return Id == default; + } + + public override bool Equals(object obj) + { + if (obj == null || !(obj is Entity)) + return false; + + if (ReferenceEquals(this, obj)) + return true; + + if (GetType() != obj.GetType()) + return false; + + Entity item = (Entity)obj; + + if (item.IsTransient() || IsTransient()) + return false; + else + return item.Id == Id; + } + + public override int GetHashCode() + { + if (!IsTransient()) + { + if (!_requestedHashCode.HasValue) + _requestedHashCode = Id.GetHashCode() ^ 31; // XOR for random distribution (http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx) + + return _requestedHashCode.Value; + } + else + return base.GetHashCode(); + } + + public static bool operator ==(Entity left, Entity right) + { + if (Equals(left, null)) + return Equals(right, null) ? true : false; + else + return left.Equals(right); + } + + public static bool operator !=(Entity left, Entity right) + { + return !(left == right); + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/TaleEngine.Data.csproj b/TaleEngine/TaleEngine.Data/TaleEngine.Data.csproj index d167531..24d3ff7 100644 --- a/TaleEngine/TaleEngine.Data/TaleEngine.Data.csproj +++ b/TaleEngine/TaleEngine.Data/TaleEngine.Data.csproj @@ -26,9 +26,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/TaleEngine/TaleEngine.Data/DatabaseContext.cs b/TaleEngine/TaleEngine.Data/TaleEngineContext.cs similarity index 61% rename from TaleEngine/TaleEngine.Data/DatabaseContext.cs rename to TaleEngine/TaleEngine.Data/TaleEngineContext.cs index 6b94d95..bd63665 100644 --- a/TaleEngine/TaleEngine.Data/DatabaseContext.cs +++ b/TaleEngine/TaleEngine.Data/TaleEngineContext.cs @@ -1,16 +1,37 @@ -using Microsoft.EntityFrameworkCore; +using MediatR; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Configuration; using System; +using System.Data; using System.Linq; -using TaleEngine.Data.Contracts; +using System.Threading; +using System.Threading.Tasks; using TaleEngine.Data.Contracts.Entities; +using TaleEngine.Data.Contracts.SeedWork; using TaleEngine.Data.Data; namespace TaleEngine.Data { - public class DatabaseContext : DbContext, IDatabaseContext + public class TaleEngineContext : DbContext, IUnitOfWork { - public DatabaseContext(DbContextOptions options) : base(options) { } + private readonly IMediator _mediator; + private IDbContextTransaction _currentTransaction; + + public TaleEngineContext(DbContextOptions options) : base(options) + { + } + + public TaleEngineContext(DbContextOptions options, IMediator mediator) : base(options) + { + _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); + + System.Diagnostics.Debug.WriteLine("TaleEngineContext::ctor ->" + this.GetHashCode()); + } + + public IDbContextTransaction GetCurrentTransaction() => _currentTransaction; + + public bool HasActiveTransaction => _currentTransaction != null; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -20,7 +41,7 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json") .Build(); - optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection")).EnableSensitiveDataLogging(); + optionsBuilder.UseSqlServer(configuration["ConnectionString"]).EnableSensitiveDataLogging(); } } @@ -38,6 +59,73 @@ public override int SaveChanges() return base.SaveChanges(); } + public async Task SaveEntitiesAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + // Dispatch Domain Events collection. + // Choices: + // A) Right BEFORE committing data (EF SaveChanges) into the DB will make a single transaction including + // side effects from the domain event handlers which are using the same DbContext with "InstancePerLifetimeScope" or "scoped" lifetime + // B) Right AFTER committing data (EF SaveChanges) into the DB will make multiple transactions. + // You will need to handle eventual consistency and compensatory actions in case of failures in any of the Handlers. + await _mediator.DispatchDomainEventsAsync(this); + + // After executing this line all the changes (from the Command Handler and Domain Event Handlers) + // performed through the DbContext will be committed + var result = await base.SaveChangesAsync(cancellationToken); + + return true; + } + + public async Task BeginTransactionAsync() + { + if (_currentTransaction != null) return null; + + _currentTransaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted); + + return _currentTransaction; + } + + public async Task CommitTransactionAsync(IDbContextTransaction transaction) + { + if (transaction == null) throw new ArgumentNullException(nameof(transaction)); + if (transaction != _currentTransaction) throw new InvalidOperationException($"Transaction {transaction.TransactionId} is not current"); + + try + { + await SaveChangesAsync(); + transaction.Commit(); + } + catch + { + RollbackTransaction(); + throw; + } + finally + { + if (_currentTransaction != null) + { + _currentTransaction.Dispose(); + _currentTransaction = null; + } + } + } + + public void RollbackTransaction() + { + try + { + _currentTransaction?.Rollback(); + } + finally + { + if (_currentTransaction != null) + { + _currentTransaction.Dispose(); + _currentTransaction = null; + } + } + } + public DbSet Events { get; set; } public DbSet Activities { get; set; } public DbSet ActivityTypes { get; set; } @@ -159,4 +247,4 @@ protected override void OnModelCreating(ModelBuilder builder) .HasData(InitialTimeSlotData.GetTimeSlotData().ToArray()); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Data/UnitOfWork.cs b/TaleEngine/TaleEngine.Data/UnitOfWork.cs deleted file mode 100644 index b8e00e8..0000000 --- a/TaleEngine/TaleEngine.Data/UnitOfWork.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using TaleEngine.Data.Contracts; -using TaleEngine.Data.Contracts.Repositories; -using TaleEngine.Data.Repositories; - -namespace TaleEngine.Data -{ - public class UnitOfWork : IUnitOfWork - { - private readonly IDatabaseContext _context; - - public UnitOfWork(IDatabaseContext databaseContext) - { - _context = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext)); - - EventRepository = new EventRepository(_context); - EditionRepository = new EditionRepository(_context); - ActivityRepository = new ActivityRepository(_context); - ActivityStatusRepository = new ActivityStatusRepository(_context); - ActivityTypeRepository = new ActivityTypeRepository(_context); - TimeSlotRepository = new TimeSlotRepository(_context); - RoleRepository = new RoleRepository(_context); - } - - public IEventRepository EventRepository { get; } - public IActivityRepository ActivityRepository { get; set; } - public IActivityStatusRepository ActivityStatusRepository { get; set; } - public IActivityTypeRepository ActivityTypeRepository { get; set; } - public IEditionRepository EditionRepository { get; set; } - public ITimeSlotRepository TimeSlotRepository { get; set; } - public IRoleRepository RoleRepository { get; set; } - } -} diff --git a/TaleEngine/TaleEngine.IntegrationTests/Base/ActivityScenarioBase.cs b/TaleEngine/TaleEngine.IntegrationTests/Base/ActivityScenarioBase.cs index 4dd9c4e..9120cf1 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Base/ActivityScenarioBase.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Base/ActivityScenarioBase.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.TestHost; using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; +using TaleEngine.API; namespace TaleEngine.IntegrationTests.Base { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Base/TaleEngineContextInMemoryDatabase.cs b/TaleEngine/TaleEngine.IntegrationTests/Base/TaleEngineContextInMemoryDatabase.cs index bf52fea..d770b34 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Base/TaleEngineContextInMemoryDatabase.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Base/TaleEngineContextInMemoryDatabase.cs @@ -6,18 +6,18 @@ namespace TaleEngine.IntegrationTests { [ExcludeFromCodeCoverage] - public class DatabaseContextInMemoryDatabase + public class TaleEngineContextInMemoryDatabase { - protected DatabaseContext _dbContext; + protected TaleEngineContext _dbContext; - public DatabaseContextInMemoryDatabase() + public TaleEngineContextInMemoryDatabase() { var options = CreateNewContextOptions(); - _dbContext = new DatabaseContext(options); + _dbContext = new TaleEngineContext(options); } - protected static DbContextOptions CreateNewContextOptions() + protected static DbContextOptions CreateNewContextOptions() { // Create a fresh service provider, and therefore a fresh // InMemory database instance. @@ -27,7 +27,7 @@ protected static DbContextOptions CreateNewContextOptions() // Create a new options instance telling the context to use an // InMemory database and the new service provider. - var builder = new DbContextOptionsBuilder(); + var builder = new DbContextOptionsBuilder(); builder.UseInMemoryDatabase("TaleEngine") .UseInternalServiceProvider(serviceProvider); diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityRepositoryTests.cs index ece0cb8..3a944bb 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityRepositoryTests.cs @@ -9,7 +9,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class ActivityRepositoryTests : DatabaseContextInMemoryDatabase + public class ActivityRepositoryTests : TaleEngineContextInMemoryDatabase { private ActivityRepository CreateActivityRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityStatusRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityStatusRepositoryTests.cs index 0b1d52a..e1e3b41 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityStatusRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityStatusRepositoryTests.cs @@ -9,7 +9,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class ActivityStatusRepositoryTests : DatabaseContextInMemoryDatabase + public class ActivityStatusRepositoryTests : TaleEngineContextInMemoryDatabase { private ActivityStatusRepository CreateActivityStatusRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityTypeRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityTypeRepositoryTests.cs index 50f4a15..7ea1e1e 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityTypeRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/ActivityTypeRepositoryTests.cs @@ -9,7 +9,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class ActivityTypeRepositoryTests : DatabaseContextInMemoryDatabase + public class ActivityTypeRepositoryTests : TaleEngineContextInMemoryDatabase { private ActivityTypeRepository CreateActivityTypeRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/EditionRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/EditionRepositoryTests.cs index 59f04ba..d30e4a9 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/EditionRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/EditionRepositoryTests.cs @@ -7,7 +7,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class EditionRepositoryTests : DatabaseContextInMemoryDatabase + public class EditionRepositoryTests : TaleEngineContextInMemoryDatabase { private EditionRepository CreateEditionRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/EventRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/EventRepositoryTests.cs index e4542a9..8db001e 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/EventRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/EventRepositoryTests.cs @@ -7,7 +7,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class EventRepositoryTests : DatabaseContextInMemoryDatabase + public class EventRepositoryTests : TaleEngineContextInMemoryDatabase { private EventRepository CreateEventRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/RoleRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/RoleRepositoryTests.cs index f84f4c7..4f0b836 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/RoleRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/RoleRepositoryTests.cs @@ -7,7 +7,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class RoleRepositoryTests : DatabaseContextInMemoryDatabase + public class RoleRepositoryTests : TaleEngineContextInMemoryDatabase { private RoleRepository CreateRoleRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/Repositories/TimeSlotRepositoryTests.cs b/TaleEngine/TaleEngine.IntegrationTests/Repositories/TimeSlotRepositoryTests.cs index c9bc902..e816892 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/Repositories/TimeSlotRepositoryTests.cs +++ b/TaleEngine/TaleEngine.IntegrationTests/Repositories/TimeSlotRepositoryTests.cs @@ -7,7 +7,7 @@ namespace TaleEngine.IntegrationTests.Repositories { [ExcludeFromCodeCoverage] - public class TimeSlotRepositoryTests : DatabaseContextInMemoryDatabase + public class TimeSlotRepositoryTests : TaleEngineContextInMemoryDatabase { private TimeSlotRepository CreateTimeSlotRepository() { diff --git a/TaleEngine/TaleEngine.IntegrationTests/TaleEngine.IntegrationTests.csproj b/TaleEngine/TaleEngine.IntegrationTests/TaleEngine.IntegrationTests.csproj index c12d35f..b8563cf 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/TaleEngine.IntegrationTests.csproj +++ b/TaleEngine/TaleEngine.IntegrationTests/TaleEngine.IntegrationTests.csproj @@ -23,7 +23,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/TaleEngine/TaleEngine.IntegrationTests/appsettings.json b/TaleEngine/TaleEngine.IntegrationTests/appsettings.json index 1a9363b..cc9de54 100644 --- a/TaleEngine/TaleEngine.IntegrationTests/appsettings.json +++ b/TaleEngine/TaleEngine.IntegrationTests/appsettings.json @@ -1,11 +1,14 @@ { - "Logging": { - "LogLevel": { - "Default": "Warning" + "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=TaleEngine;User Id=sa;Password=Pass@word;", + "Serilog": { + "SeqServerUrl": null, + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.eShopOnContainers": "Information", + "System": "Warning" + } } - }, - "AllowedHosts": "*", - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=TaleEngine;Trusted_Connection=True;" } } \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityControllerTests.cs index 63beeb7..74d9be7 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityControllerTests.cs @@ -4,11 +4,11 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V1; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Dtos.Requests; using TaleEngine.Application.Contracts.Dtos.Results; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V1; using TaleEngine.Fakes.Dtos; using Xunit; @@ -399,4 +399,4 @@ public void GetActivitiesFiltered_NullResult_Success() serviceMock.Verify(x => x.GetActiveActivitiesFiltered(request), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityStatusControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityStatusControllerTests.cs index f8f1848..ddf7e18 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityStatusControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityStatusControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V1; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V1; using Xunit; namespace TaleEngine.Testing.Controllers.V1 @@ -93,4 +93,4 @@ public void GetActivityStatuses_NullResult_Success() serviceMock.Verify(x => x.GetActivityStatuses(), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityTypesControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityTypesControllerTests.cs index 2d2d908..adea3ba 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityTypesControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V1/ActivityTypesControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V1; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V1; using Xunit; namespace TaleEngine.Testing.Controllers.V1 @@ -93,4 +93,4 @@ public void GetActivityTypes_NullResult_Success() serviceMock.Verify(x => x.GetActivityTypes(), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V1/EditionControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V1/EditionControllerTests.cs index e454dd7..6424ea0 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V1/EditionControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V1/EditionControllerTests.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V1; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V1; using Xunit; namespace TaleEngine.Testing.Controllers.V1 @@ -68,4 +68,4 @@ public void GetEditionDays_NullResult_Success() serviceMock.Verify(x => x.GetEditionDays(editionId), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V1/EventControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V1/EventControllerTests.cs index 4cd5e4e..de698dc 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V1/EventControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V1/EventControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V1; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V1; using Xunit; namespace TaleEngine.Testing.Controllers.V1 @@ -96,4 +96,4 @@ public void GetCurrentOrLastEdition_Success() serviceMock.Verify(x => x.GetCurrentOrLastEdition(eventId), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V1/TimeSlotControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V1/TimeSlotControllerTests.cs index 208fd6d..f9d2041 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V1/TimeSlotControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V1/TimeSlotControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V1; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V1; using Xunit; namespace TaleEngine.Testing.Controllers.V1 @@ -93,4 +93,4 @@ public void GetAllTimeSlots_NullResult_Success() serviceMock.Verify(x => x.GetTimeSlots(), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityControllerTests.cs index 572595a..8418014 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityControllerTests.cs @@ -4,11 +4,11 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Dtos.Requests; using TaleEngine.Application.Contracts.Dtos.Results; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using TaleEngine.Fakes.Dtos; using Xunit; @@ -399,4 +399,4 @@ public void GetActivitiesFiltered_NullResult_Success() serviceMock.Verify(x => x.GetActiveActivitiesFiltered(request), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityStatusControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityStatusControllerTests.cs index a75c979..221df43 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityStatusControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityStatusControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using Xunit; namespace TaleEngine.Testing.Controllers.V2 @@ -93,4 +93,4 @@ public void GetActivityStatuses_NullResult_Success() serviceMock.Verify(x => x.GetActivityStatuses(), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityTypesControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityTypesControllerTests.cs index 088f1bd..5f60e6d 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityTypesControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/ActivityTypesControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using Xunit; namespace TaleEngine.Testing.Controllers.V2 @@ -93,4 +93,4 @@ public void GetActivityTypes_NullResult_Success() serviceMock.Verify(x => x.GetActivityTypes(), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/EditionControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/EditionControllerTests.cs index 7151add..1b3f565 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/EditionControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/EditionControllerTests.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using Xunit; namespace TaleEngine.Testing.Controllers.V2 @@ -68,4 +68,4 @@ public void GetEditionDays_NullResult_Success() serviceMock.Verify(x => x.GetEditionDays(editionId), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/EventControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/EventControllerTests.cs index f459eb9..9332061 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/EventControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/EventControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using Xunit; namespace TaleEngine.Testing.Controllers.V2 @@ -96,4 +96,4 @@ public void GetCurrentOrLastEdition_Success() serviceMock.Verify(x => x.GetCurrentOrLastEdition(eventId), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/RolesControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/RolesControllerTests.cs index a570d49..2c42245 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/RolesControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/RolesControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using Xunit; namespace TaleEngine.Testing.Controllers.V2 @@ -106,4 +106,4 @@ public void GetRole_Success() resultAsObjResult.StatusCode.Should().Be(StatusCodes.Status200OK); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/Controllers/V2/TimeSlotControllerTests.cs b/TaleEngine/TaleEngine.Testing/Controllers/V2/TimeSlotControllerTests.cs index 168bf9c..fba282b 100644 --- a/TaleEngine/TaleEngine.Testing/Controllers/V2/TimeSlotControllerTests.cs +++ b/TaleEngine/TaleEngine.Testing/Controllers/V2/TimeSlotControllerTests.cs @@ -4,9 +4,9 @@ using Moq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using TaleEngine.API.Controllers.V2; using TaleEngine.Application.Contracts.Dtos; using TaleEngine.Application.Contracts.Services; -using TaleEngine.Controllers.V2; using Xunit; namespace TaleEngine.Testing.Controllers.V2 @@ -93,4 +93,4 @@ public void GetAllTimeSlots_NullResult_Success() serviceMock.Verify(x => x.GetTimeSlots(), Times.Once); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine.Testing/TaleEngine.Testing.csproj b/TaleEngine/TaleEngine.Testing/TaleEngine.Testing.csproj index 21c65fe..01e8b27 100644 --- a/TaleEngine/TaleEngine.Testing/TaleEngine.Testing.csproj +++ b/TaleEngine/TaleEngine.Testing/TaleEngine.Testing.csproj @@ -16,7 +16,7 @@ - + all diff --git a/TaleEngine/TaleEngine.sln b/TaleEngine/TaleEngine.sln index ea230c6..83bc760 100644 --- a/TaleEngine/TaleEngine.sln +++ b/TaleEngine/TaleEngine.sln @@ -32,6 +32,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaleEngine.Business.Testing EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaleEngine.IntegrationTests", "TaleEngine.IntegrationTests\TaleEngine.IntegrationTests.csproj", "{42B926BC-2935-4CF4-B043-A2162B8E069B}" EndProject +Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{BC6C3ED2-9FFB-4909-B051-AE5AEB497195}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -90,6 +92,10 @@ Global {42B926BC-2935-4CF4-B043-A2162B8E069B}.Debug|Any CPU.Build.0 = Debug|Any CPU {42B926BC-2935-4CF4-B043-A2162B8E069B}.Release|Any CPU.ActiveCfg = Release|Any CPU {42B926BC-2935-4CF4-B043-A2162B8E069B}.Release|Any CPU.Build.0 = Release|Any CPU + {BC6C3ED2-9FFB-4909-B051-AE5AEB497195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC6C3ED2-9FFB-4909-B051-AE5AEB497195}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC6C3ED2-9FFB-4909-B051-AE5AEB497195}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC6C3ED2-9FFB-4909-B051-AE5AEB497195}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TaleEngine/TaleEngine/Controllers/V1/ActivityController.cs b/TaleEngine/TaleEngine/Controllers/V1/ActivityController.cs index 2d76b92..03e35c4 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/ActivityController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/ActivityController.cs @@ -4,7 +4,7 @@ using TaleEngine.Application.Contracts.Dtos.Requests; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { [ApiController] [Route("api/v1/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V1/ActivityStatusController.cs b/TaleEngine/TaleEngine/Controllers/V1/ActivityStatusController.cs index 6753c3d..661ab49 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/ActivityStatusController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/ActivityStatusController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { [ApiController] [Route("api/v1/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V1/ActivityTypeController.cs b/TaleEngine/TaleEngine/Controllers/V1/ActivityTypeController.cs index 3bfd763..94685c0 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/ActivityTypeController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/ActivityTypeController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { [ApiController] [Route("api/v1/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V1/EditionController.cs b/TaleEngine/TaleEngine/Controllers/V1/EditionController.cs index e891618..67ddd38 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/EditionController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/EditionController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { [ApiController] [Route("api/v1/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V1/EventController.cs b/TaleEngine/TaleEngine/Controllers/V1/EventController.cs index dc8c18f..ba30eff 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/EventController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/EventController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { [ApiController] [Route("api/v1/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V1/RolesController.cs b/TaleEngine/TaleEngine/Controllers/V1/RolesController.cs index 9f5b89d..4a862a9 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/RolesController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/RolesController.cs @@ -3,7 +3,7 @@ using System; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { /// /// Roles management diff --git a/TaleEngine/TaleEngine/Controllers/V1/TimeSlotController.cs b/TaleEngine/TaleEngine/Controllers/V1/TimeSlotController.cs index 0f5d508..c49f807 100644 --- a/TaleEngine/TaleEngine/Controllers/V1/TimeSlotController.cs +++ b/TaleEngine/TaleEngine/Controllers/V1/TimeSlotController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V1 +namespace TaleEngine.API.Controllers.V1 { [ApiController] [Route("api/v1/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V2/ActivityController.cs b/TaleEngine/TaleEngine/Controllers/V2/ActivityController.cs index 6b174ec..7c4b9ed 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/ActivityController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/ActivityController.cs @@ -4,7 +4,7 @@ using TaleEngine.Application.Contracts.Dtos.Requests; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { [ApiController] [Route("api/v2/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V2/ActivityStatusController.cs b/TaleEngine/TaleEngine/Controllers/V2/ActivityStatusController.cs index 180d59f..2305b55 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/ActivityStatusController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/ActivityStatusController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { [ApiController] [Route("api/v2/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V2/ActivityTypeController.cs b/TaleEngine/TaleEngine/Controllers/V2/ActivityTypeController.cs index a6b1504..6427397 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/ActivityTypeController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/ActivityTypeController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { [ApiController] [Route("api/v2/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V2/EditionController.cs b/TaleEngine/TaleEngine/Controllers/V2/EditionController.cs index 79855bc..779414b 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/EditionController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/EditionController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { [ApiController] [Route("api/v2/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V2/EventController.cs b/TaleEngine/TaleEngine/Controllers/V2/EventController.cs index 6f7ae64..66841cc 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/EventController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/EventController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { [ApiController] [Route("api/v2/[controller]")] diff --git a/TaleEngine/TaleEngine/Controllers/V2/RolesController.cs b/TaleEngine/TaleEngine/Controllers/V2/RolesController.cs index 033b438..4c06577 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/RolesController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/RolesController.cs @@ -3,7 +3,7 @@ using System; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { /// /// Roles management diff --git a/TaleEngine/TaleEngine/Controllers/V2/TimeSlotController.cs b/TaleEngine/TaleEngine/Controllers/V2/TimeSlotController.cs index d9d9b93..65c5a2a 100644 --- a/TaleEngine/TaleEngine/Controllers/V2/TimeSlotController.cs +++ b/TaleEngine/TaleEngine/Controllers/V2/TimeSlotController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using TaleEngine.Application.Contracts.Services; -namespace TaleEngine.Controllers.V2 +namespace TaleEngine.API.Controllers.V2 { [ApiController] [Route("api/v2/[controller]")] diff --git a/TaleEngine/TaleEngine/Dockerfile b/TaleEngine/TaleEngine/Dockerfile new file mode 100644 index 0000000..5ed53e6 --- /dev/null +++ b/TaleEngine/TaleEngine/Dockerfile @@ -0,0 +1,40 @@ +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build +WORKDIR /src + +# It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles +# to take advantage of Docker's build cache, to speed up local container builds +COPY "TaleEngine.sln" "TaleEngine.sln" + +COPY ["TaleEngine/TaleEngine.csproj", "TaleEngine/"] +COPY ["TaleEngine.Data.Contracts/TaleEngine.Data.Contracts.csproj", "TaleEngine.Data.Contracts/"] +COPY ["TaleEngine.Bussiness/TaleEngine.Bussiness.csproj", "TaleEngine.Bussiness/"] +COPY ["TaleEngine.Bussiness.Contracts/TaleEngine.Bussiness.Contracts.csproj", "TaleEngine.Bussiness.Contracts/"] +COPY ["TaleEngine.Application.Contracts/TaleEngine.Application.Contracts.csproj", "TaleEngine.Application.Contracts/"] +COPY ["TaleEngine.Application/TaleEngine.Application.csproj", "TaleEngine.Application/"] +COPY ["TaleEngine.Data/TaleEngine.Data.csproj", "TaleEngine.Data/"] + +COPY "docker-compose.dcproj" "docker-compose.dcproj" + +COPY "NuGet.config" "NuGet.config" + +RUN dotnet restore "TaleEngine.sln" + +COPY . . +WORKDIR "/src/TaleEngine" +RUN dotnet publish --no-restore -c Release -o /app + +FROM build as unittest +WORKDIR "/src/TaleEngine/TaleEngine.Testing" + +FROM build AS publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "TaleEngine.dll"] \ No newline at end of file diff --git a/TaleEngine/TaleEngine/Extensions/IServiceCollectionExtensions.cs b/TaleEngine/TaleEngine/Extensions/IServiceCollectionExtensions.cs new file mode 100644 index 0000000..3a6996f --- /dev/null +++ b/TaleEngine/TaleEngine/Extensions/IServiceCollectionExtensions.cs @@ -0,0 +1,104 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.OpenApi.Models; +using System; +using System.Reflection; +using TaleEngine.Data; + +namespace TaleEngine.API.Extensions +{ + public static class IServiceCollectionExtensions + { + public static IServiceCollection AddHealthChecks(this IServiceCollection services, IConfiguration configuration) + { + var hcBuilder = services.AddHealthChecks(); + + hcBuilder.AddCheck("self", () => HealthCheckResult.Healthy()); + + hcBuilder + .AddSqlServer( + configuration["ConnectionString"], + name: "TaleEngineDB-check", + tags: new string[] { "TaleEngine" }); + + return services; + } + + public static IServiceCollection AddCustomDbContext(this IServiceCollection services, IConfiguration configuration) + { + services.AddDbContext(options => + { + options.UseSqlServer(configuration["ConnectionString"], + sqlServerOptionsAction: sqlOptions => + { + sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); + sqlOptions.EnableRetryOnFailure(maxRetryCount: 15, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); + }); + }, + ServiceLifetime.Scoped //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request) + ); + + return services; + } + + public static IServiceCollection AddCustomSwagger(this IServiceCollection services, IConfiguration configuration) + { + services.AddSwaggerGen(config => + { + config.SwaggerDoc("v1", new OpenApiInfo + { + Title = "TaleEngine API v1", + Version = "v1", + Contact = new OpenApiContact + { + Name = "Elena G", + Email = "elena.guzbla@gmail.com", + Url = new Uri("https://beelzenef.github.io") + } + }); + config.SwaggerDoc("v2", new OpenApiInfo + { + Title = "TaleEngine API v2", + Version = "v2", + Contact = new OpenApiContact + { + Name = "Elena G", + Email = "elena.guzbla@gmail.com", + Url = new Uri("https://beelzenef.github.io") + } + }); + }); + + return services; + } + + public static IServiceCollection AddCustomConfiguration(this IServiceCollection services, IConfiguration configuration) + { + services.AddOptions(); + services.Configure(configuration); + services.Configure(options => + { + options.InvalidModelStateResponseFactory = context => + { + var problemDetails = new ValidationProblemDetails(context.ModelState) + { + Instance = context.HttpContext.Request.Path, + Status = StatusCodes.Status400BadRequest, + Detail = "Please refer to the errors property for additional details." + }; + + return new BadRequestObjectResult(problemDetails) + { + ContentTypes = { "application/problem+json", "application/problem+xml" } + }; + }; + }); + + return services; + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/Extensions/IWebHostExtensions.cs b/TaleEngine/TaleEngine/Extensions/IWebHostExtensions.cs new file mode 100644 index 0000000..d7c4aa1 --- /dev/null +++ b/TaleEngine/TaleEngine/Extensions/IWebHostExtensions.cs @@ -0,0 +1,80 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Polly; +using System; + +namespace TaleEngine.API.Extensions +{ + public static class IWebHostExtensions + { + public static bool IsInKubernetes(this IWebHost webHost) + { + var cfg = webHost.Services.GetService(); + var orchestratorType = cfg.GetValue("OrchestratorType"); + return orchestratorType?.ToUpper() == "K8S"; + } + + public static IWebHost MigrateDbContext(this IWebHost webHost, Action seeder) where TContext : DbContext + { + var underK8s = webHost.IsInKubernetes(); + + using (var scope = webHost.Services.CreateScope()) + { + var services = scope.ServiceProvider; + var logger = services.GetRequiredService>(); + var context = services.GetService(); + + try + { + logger.LogInformation("Migrating database associated with context {DbContextName}", typeof(TContext).Name); + + if (underK8s) + { + InvokeSeeder(seeder, context, services); + } + else + { + var retries = 10; + var retry = Policy.Handle() + .WaitAndRetry( + retryCount: retries, + sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), + onRetry: (exception, timeSpan, retry, ctx) => + { + logger.LogWarning(exception, "[{prefix}] Exception {ExceptionType} with message {Message} detected on attempt {retry} of {retries}", nameof(TContext), exception.GetType().Name, exception.Message, retry, retries); + }); + + //if the sql server container is not created on run docker compose this + //migration can't fail for network related exception. The retry options for DbContext only + //apply to transient exceptions + // Note that this is NOT applied when running some orchestrators (let the orchestrator to recreate the failing service) + retry.Execute(() => InvokeSeeder(seeder, context, services)); + } + + logger.LogInformation("Migrated database associated with context {DbContextName}", typeof(TContext).Name); + } + catch (Exception ex) + { + logger.LogError(ex, "An error occurred while migrating the database used on context {DbContextName}", typeof(TContext).Name); + if (underK8s) + { + throw; // Rethrow under k8s because we rely on k8s to re-run the pod + } + } + } + + return webHost; + } + + private static void InvokeSeeder(Action seeder, TContext context, IServiceProvider services) + where TContext : DbContext + { + context.Database.Migrate(); + seeder(context, services); + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/Helpers/GroupingByNamespaceConvention.cs b/TaleEngine/TaleEngine/Helpers/GroupingByNamespaceConvention.cs index 7b4c5cc..482147b 100644 --- a/TaleEngine/TaleEngine/Helpers/GroupingByNamespaceConvention.cs +++ b/TaleEngine/TaleEngine/Helpers/GroupingByNamespaceConvention.cs @@ -2,7 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; -namespace TaleEngine.Helpers +namespace TaleEngine.API.Helpers { [ExcludeFromCodeCoverage] public class GroupingByNamespaceConvention : IControllerModelConvention diff --git a/TaleEngine/TaleEngine/Infrastructure/AutofacModules/ApplicationModule.cs b/TaleEngine/TaleEngine/Infrastructure/AutofacModules/ApplicationModule.cs new file mode 100644 index 0000000..67c3ef0 --- /dev/null +++ b/TaleEngine/TaleEngine/Infrastructure/AutofacModules/ApplicationModule.cs @@ -0,0 +1,114 @@ +using Autofac; +using TaleEngine.Application.Contracts.Services; +using TaleEngine.Application.Services; +using TaleEngine.Bussiness.Contracts.DomainServices; +using TaleEngine.Bussiness.DomainServices; +using TaleEngine.Data.Contracts.Repositories; +using TaleEngine.Data.Repositories; + +namespace TaleEngine.API.Infrastructure.AutofacModules +{ + public class ApplicationModule + : Module + { + protected override void Load(ContainerBuilder builder) + { + RegisterServices(builder); + RegisterDomainServices(builder); + RegisterRepositories(builder); + } + + private static void RegisterServices(ContainerBuilder builder) + { + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } + + private void RegisterDomainServices(ContainerBuilder builder) + { + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } + + private static void RegisterRepositories(ContainerBuilder builder) + { + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/Infrastructure/TaleEngineContextSeed.cs b/TaleEngine/TaleEngine/Infrastructure/TaleEngineContextSeed.cs new file mode 100644 index 0000000..aaa0dba --- /dev/null +++ b/TaleEngine/TaleEngine/Infrastructure/TaleEngineContextSeed.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Polly; +using Polly.Retry; +using System; +using System.Threading.Tasks; +using TaleEngine.Data; + +namespace TaleEngine.API.Infrastructure +{ + public class TaleEngineContextSeed + { + public async Task SeedAsync(TaleEngineContext context, IWebHostEnvironment env, IOptions settings, ILogger logger) + { + var policy = CreatePolicy(logger, nameof(TaleEngineContextSeed)); + + await policy.ExecuteAsync(async () => + { + var contentRootPath = env.ContentRootPath; + + using (context) + { + context.Database.Migrate(); + + await context.SaveChangesAsync(); + } + }); + } + + private AsyncRetryPolicy CreatePolicy(ILogger logger, string prefix, int retries = 3) + { + return Policy.Handle(). + WaitAndRetryAsync( + retryCount: retries, + sleepDurationProvider: retry => TimeSpan.FromSeconds(5), + onRetry: (exception, timeSpan, retry, ctx) => + { + logger.LogWarning(exception, "[{prefix}] Exception {ExceptionType} with message {Message} detected on attempt {retry} of {retries}", prefix, exception.GetType().Name, exception.Message, retry, retries); + } + ); + } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/Pages/Error.cshtml.cs b/TaleEngine/TaleEngine/Pages/Error.cshtml.cs index 8619eb2..afe2807 100644 --- a/TaleEngine/TaleEngine/Pages/Error.cshtml.cs +++ b/TaleEngine/TaleEngine/Pages/Error.cshtml.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; -namespace TaleEngine.Pages +namespace TaleEngine.API.Pages { [ExcludeFromCodeCoverage] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] diff --git a/TaleEngine/TaleEngine/Pages/_ViewImports.cshtml b/TaleEngine/TaleEngine/Pages/_ViewImports.cshtml index 0721ac5..3ab430e 100644 --- a/TaleEngine/TaleEngine/Pages/_ViewImports.cshtml +++ b/TaleEngine/TaleEngine/Pages/_ViewImports.cshtml @@ -1,3 +1,3 @@ @using TaleEngine -@namespace TaleEngine.Pages +@namespace TaleEngine.API.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/TaleEngine/TaleEngine/Program.cs b/TaleEngine/TaleEngine/Program.cs index f2c3ad9..2803d73 100644 --- a/TaleEngine/TaleEngine/Program.cs +++ b/TaleEngine/TaleEngine/Program.cs @@ -1,20 +1,92 @@ +using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Serilog; +using System; +using System.IO; +using TaleEngine.API.Extensions; +using TaleEngine.API.Infrastructure; +using TaleEngine.Data; -namespace TaleEngine +namespace TaleEngine.API { public class Program { - public static void Main(string[] args) + public static readonly string Namespace = typeof(Program).Namespace; + public static readonly string AppName = Namespace.Substring(Namespace.LastIndexOf('.', Namespace.LastIndexOf('.') - 1) + 1); + + public static int Main(string[] args) + { + var configuration = GetConfiguration(); + + Log.Logger = CreateSerilogLogger(configuration); + + try + { + Log.Information("Configuring web host ({ApplicationContext})...", Program.AppName); + var host = BuildWebHost(configuration, args); + + Log.Information("Applying migrations ({ApplicationContext})...", Program.AppName); + host.MigrateDbContext((context, services) => + { + var env = services.GetService(); + var settings = services.GetService>(); + var logger = services.GetService>(); + + new TaleEngineContextSeed() + .SeedAsync(context, env, settings, logger) + .Wait(); + }); + + Log.Information("Starting web host ({ApplicationContext})...", Program.AppName); + host.Run(); + + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", Program.AppName); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } + + private static IWebHost BuildWebHost(IConfiguration configuration, string[] args) => + WebHost.CreateDefaultBuilder(args) + .CaptureStartupErrors(false) + .ConfigureAppConfiguration(x => x.AddConfiguration(configuration)) + .UseStartup() + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseSerilog() + .Build(); + + private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { - CreateHostBuilder(args).Build().Run(); + var seqServerUrl = configuration["Serilog:SeqServerUrl"]; + return new LoggerConfiguration() + .MinimumLevel.Verbose() + .Enrich.WithProperty("ApplicationContext", Program.AppName) + .Enrich.FromLogContext() + .WriteTo.Console() + .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .ReadFrom.Configuration(configuration) + .CreateLogger(); } - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); + private static IConfiguration GetConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddEnvironmentVariables(); + + return builder.Build(); + } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/Startup.cs b/TaleEngine/TaleEngine/Startup.cs index 31880d4..97c6708 100644 --- a/TaleEngine/TaleEngine/Startup.cs +++ b/TaleEngine/TaleEngine/Startup.cs @@ -1,22 +1,19 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; +using HealthChecks.UI.Client; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.OpenApi.Models; using System; -using TaleEngine.Application.Contracts.Services; -using TaleEngine.Application.Services; -using TaleEngine.Bussiness.Contracts; -using TaleEngine.Bussiness.Contracts.DomainServices; -using TaleEngine.Bussiness.DomainServices; -using TaleEngine.Data; -using TaleEngine.Data.Contracts; -using TaleEngine.Helpers; +using TaleEngine.API.Extensions; +using TaleEngine.API.Helpers; +using TaleEngine.API.Infrastructure.AutofacModules; -namespace TaleEngine +namespace TaleEngine.API { public class Startup { @@ -27,7 +24,7 @@ public Startup(IConfiguration configuration) public IConfiguration Configuration { get; } - public void ConfigureServices(IServiceCollection services) + public virtual IServiceProvider ConfigureServices(IServiceCollection services) { services.AddCors(c => { @@ -45,63 +42,29 @@ public void ConfigureServices(IServiceCollection services) config.UseApiBehavior = false; }); - services.AddSwaggerGen(config => - { - config.SwaggerDoc("v1", new OpenApiInfo - { - Title = "TaleEngine API v1", - Version = "v1", - Contact = new OpenApiContact - { - Name = "Elena G", - Email = "elena.guzbla@gmail.com", - Url = new Uri("https://beelzenef.github.io") - } - }); - config.SwaggerDoc("v2", new OpenApiInfo - { - Title = "TaleEngine API v2", - Version = "v2", - Contact = new OpenApiContact - { - Name = "Elena G", - Email = "elena.guzbla@gmail.com", - Url = new Uri("https://beelzenef.github.io") - } - }); - }); - - services.AddDbContext(item => - item.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); - services.AddDbContext(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddHealthChecks(Configuration) + .AddCustomDbContext(Configuration) + .AddCustomSwagger(Configuration) + .AddCustomConfiguration(Configuration); services.AddControllers(options => { options.Conventions.Add(new GroupingByNamespaceConvention()); }); + + //configure autofac + + var container = new ContainerBuilder(); + container.Populate(services); + + container.RegisterModule(new ApplicationModule()); + + return new AutofacServiceProvider(container.Build()); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - app.UseRouting(); - app.UseSwagger(options => options.RouteTemplate = "swagger/{documentName}/swagger.json"); app.UseSwaggerUI(options => { @@ -109,9 +72,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) options.SwaggerEndpoint($"/swagger/v1/swagger.json", $"v1"); options.SwaggerEndpoint($"/swagger/v2/swagger.json", $"v2"); }); - app.UseEndpoints(endpoints => endpoints.MapControllers()); - - app.Build(); if (env.IsDevelopment()) { @@ -123,11 +83,24 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseHsts(); } + app.UseRouting(); app.UseCors("AllowAll"); app.UseHttpsRedirection(); - app.UseRouting(); - app.UseEndpoints(endpoints => endpoints.MapControllers()); + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + + endpoints.MapHealthChecks("/hc", new HealthCheckOptions() + { + Predicate = _ => true, + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse + }); + endpoints.MapHealthChecks("/liveness", new HealthCheckOptions + { + Predicate = r => r.Name.Contains("self") + }); + }); } } -} +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/TaleEngine.csproj b/TaleEngine/TaleEngine/TaleEngine.csproj index 9897862..f5ee663 100644 --- a/TaleEngine/TaleEngine/TaleEngine.csproj +++ b/TaleEngine/TaleEngine/TaleEngine.csproj @@ -1,52 +1,61 @@  - - net5.0 - false + + net5.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + true + preview + - - false - + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TaleEngine/TaleEngine/TaleEngineSettings.cs b/TaleEngine/TaleEngine/TaleEngineSettings.cs new file mode 100644 index 0000000..ec70601 --- /dev/null +++ b/TaleEngine/TaleEngine/TaleEngineSettings.cs @@ -0,0 +1,7 @@ +namespace TaleEngine.API +{ + public class TaleEngineSettings + { + public string ConnectionString { get; set; } + } +} \ No newline at end of file diff --git a/TaleEngine/TaleEngine/appsettings.json b/TaleEngine/TaleEngine/appsettings.json index a0c09a1..d0a9469 100644 --- a/TaleEngine/TaleEngine/appsettings.json +++ b/TaleEngine/TaleEngine/appsettings.json @@ -1,11 +1,14 @@ { - "Logging": { - "LogLevel": { - "Default": "Warning" + "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=TaleEngine;User Id=sa;Password=Pass@word;", + "Serilog": { + "SeqServerUrl": null, + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.eShopOnContainers": "Information", + "System": "Warning" + } } - }, - "AllowedHosts": "*", - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=TaleEngine;Trusted_Connection=True;" } -} +} \ No newline at end of file diff --git a/TaleEngine/docker-compose.dcproj b/TaleEngine/docker-compose.dcproj new file mode 100644 index 0000000..dc31940 --- /dev/null +++ b/TaleEngine/docker-compose.dcproj @@ -0,0 +1,18 @@ + + + + 2.1 + Linux + bc6c3ed2-9ffb-4909-b051-ae5aeb497195 + LaunchBrowser + http://host.docker.internal:5100 + taleengine + + + + docker-compose.yml + + + + + \ No newline at end of file diff --git a/TaleEngine/docker-compose.override.yml b/TaleEngine/docker-compose.override.yml new file mode 100644 index 0000000..5b52544 --- /dev/null +++ b/TaleEngine/docker-compose.override.yml @@ -0,0 +1,31 @@ +version: '3.4' + +services: + + seq: + environment: + - ACCEPT_EULA=Y + ports: + - "5340:80" + + sqldata: + environment: + - SA_PASSWORD=Pass@word + - ACCEPT_EULA=Y + ports: + - "5433:1433" + volumes: + - taleengine-sqldata:/var/opt/mssql + + taleengine-api: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=http://0.0.0.0:80 + - ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sqldata;Database=TaleEngine;User Id=sa;Password=Pass@word} + ports: + - "5102:80" + - "9102:81" + +volumes: + taleengine-sqldata: + external: false \ No newline at end of file diff --git a/TaleEngine/docker-compose.yml b/TaleEngine/docker-compose.yml new file mode 100644 index 0000000..4d77537 --- /dev/null +++ b/TaleEngine/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3.4' + +services: + + seq: + image: datalust/seq:latest + + sqldata: + image: mcr.microsoft.com/mssql/server:2019-latest + + taleengine-api: + image: ${REGISTRY:-taleengine}/taleengine.api:${PLATFORM:-linux}-${TAG:-latest} + build: + context: . + dockerfile: TaleEngine/Dockerfile + depends_on: + - sqldata