From e4e0fcf47a0b65a971acf4a584a41f69b1877ea4 Mon Sep 17 00:00:00 2001 From: pns-hassanzadeh Date: Fri, 5 Sep 2025 19:17:19 +0330 Subject: [PATCH] . --- .../Configuration/Assemblies.cs | 13 +++---- .../Application/IUnitOfWork.cs | 17 +++++++++ .../Controllers/FileController.cs | 2 +- .../Domain/Entities/Client.cs | 9 +++++ .../Domain/Entities/Media.cs | 14 +++++++ .../Domain/Entities/MediaClient.cs | 13 +++++++ .../Domain/Entities/MediaGroup.cs | 13 +++++++ .../Domain/Entities/MediaGroupMedia.cs | 11 ++++++ .../Domain/Repositories/IClientRepository.cs | 7 ++++ .../Repositories/IMediaClientRepository.cs | 7 ++++ .../IMediaGroupMediaRepository.cs | 7 ++++ .../Repositories/IMediaGroupRepository.cs | 7 ++++ .../Domain/Repositories/IMediaRepository.cs | 7 ++++ .../Domain/TypeIds/ClientId.cs | 10 +++++ .../Domain/TypeIds/MediaClientId.cs | 10 +++++ .../Domain/TypeIds/MediaGroupId.cs | 10 +++++ .../Domain/TypeIds/MediaGroupMediaId.cs | 10 +++++ .../Domain/TypeIds/MediaId.cs | 10 +++++ .../Domain/ValueObjects/ContentType.cs | 15 ++++++++ .../ValueObjects/MediaClientName.cs | 6 +-- .../ValueObjects/MediaGroupTitle.cs | 6 +-- .../Rules/ValidContentTypeRule.cs | 4 +- Vizhtalk.CDN.Presentation/Entities/Client.cs | 10 ----- Vizhtalk.CDN.Presentation/Entities/Media.cs | 15 -------- .../Entities/MediaClient.cs | 14 ------- .../Entities/MediaGroup.cs | 14 ------- .../Entities/MediaGroupMedia.cs | 12 ------ .../Infrastructure/CDNStartup.cs | 38 +++++++++++++++++++ .../Configuration/Assemblies.cs | 12 ++++++ .../Infrastructure/EF/CDNDbContext.cs | 24 ++++++++++++ .../EF/Configurations/ClientConfiguration.cs | 17 +++++++++ .../MediaClientConfiguration.cs | 17 +++++++++ .../EF/Configurations/MediaConfiguration.cs | 19 ++++++++++ .../Configurations/MediaGroupConfiguration.cs | 16 ++++++++ .../MediaGroupMediaConfiguration.cs | 16 ++++++++ .../Infrastructure/UnitOfWork.cs | 23 +++++++++++ Vizhtalk.CDN.Presentation/Program.cs | 10 +++++ Vizhtalk.CDN.Presentation/TypeIds/ClientId.cs | 11 ------ .../TypeIds/MediaClientId.cs | 11 ------ .../TypeIds/MediaGroupId.cs | 11 ------ .../TypeIds/MediaGroupMediaId.cs | 11 ------ Vizhtalk.CDN.Presentation/TypeIds/MediaId.cs | 11 ------ .../ValueObjects/ContentType.cs | 16 -------- .../Vizhtalk.CDN.Presentation.csproj | 9 ++++- Vizhtalk.CDN.Presentation/appsettings.json | 2 +- 45 files changed, 392 insertions(+), 155 deletions(-) create mode 100644 Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Entities/Client.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Entities/MediaClient.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Repositories/IClientRepository.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupMediaRepository.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupRepository.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaRepository.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/TypeIds/ClientId.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupId.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupMediaId.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs create mode 100644 Vizhtalk.CDN.Presentation/Domain/ValueObjects/ContentType.cs rename Vizhtalk.CDN.Presentation/{ => Domain}/ValueObjects/MediaClientName.cs (61%) rename Vizhtalk.CDN.Presentation/{ => Domain}/ValueObjects/MediaGroupTitle.cs (59%) rename Vizhtalk.CDN.Presentation/{ => Domain}/ValueObjects/Rules/ValidContentTypeRule.cs (94%) delete mode 100644 Vizhtalk.CDN.Presentation/Entities/Client.cs delete mode 100644 Vizhtalk.CDN.Presentation/Entities/Media.cs delete mode 100644 Vizhtalk.CDN.Presentation/Entities/MediaClient.cs delete mode 100644 Vizhtalk.CDN.Presentation/Entities/MediaGroup.cs delete mode 100644 Vizhtalk.CDN.Presentation/Entities/MediaGroupMedia.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/Configuration/Assemblies.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/ClientConfiguration.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaConfiguration.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupConfiguration.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupMediaConfiguration.cs create mode 100644 Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs delete mode 100644 Vizhtalk.CDN.Presentation/TypeIds/ClientId.cs delete mode 100644 Vizhtalk.CDN.Presentation/TypeIds/MediaClientId.cs delete mode 100644 Vizhtalk.CDN.Presentation/TypeIds/MediaGroupId.cs delete mode 100644 Vizhtalk.CDN.Presentation/TypeIds/MediaGroupMediaId.cs delete mode 100644 Vizhtalk.CDN.Presentation/TypeIds/MediaId.cs delete mode 100644 Vizhtalk.CDN.Presentation/ValueObjects/ContentType.cs diff --git a/VizhTalk.Learning.Infrastructure/Configuration/Assemblies.cs b/VizhTalk.Learning.Infrastructure/Configuration/Assemblies.cs index a458a78..19811f4 100644 --- a/VizhTalk.Learning.Infrastructure/Configuration/Assemblies.cs +++ b/VizhTalk.Learning.Infrastructure/Configuration/Assemblies.cs @@ -7,12 +7,11 @@ using System.Threading.Tasks; using VizhTalk.Learning.Application; using VizhTalk.Learning.Domain.Entities; -namespace VizhTalk.Learning.Infrastructure.Configuration +namespace VizhTalk.Learning.Infrastructure.Configuration; + +public static class Assemblies { - public static class Assemblies - { - public static Assembly Infrastructure = typeof(LearningStartup).Assembly; - public static Assembly Application = typeof(ILearningModule).Assembly; - public static Assembly Domain = typeof(Language).Assembly; - } + public static Assembly Infrastructure = typeof(LearningStartup).Assembly; + public static Assembly Application = typeof(ILearningModule).Assembly; + public static Assembly Domain = typeof(Language).Assembly; } diff --git a/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs b/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs new file mode 100644 index 0000000..90312a6 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs @@ -0,0 +1,17 @@ +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using VizhTalk.BuildingBlocks.Application; + +namespace Vizhtalk.CDN.Presentation.Application +{ + internal interface IUnitOfWork : IUnitOfWorkBase + { + IMediaRepository Media { get; } + IClientRepository Client { get; } + IMediaClientRepository MediaClient { get; } + IMediaGroupRepository MediaGroup{ get; } + IMediaGroupMediaRepository MediaGroupMedia { get; } + + Task SaveChangeAsync(CancellationToken cancellationToken = default); + } + +} diff --git a/Vizhtalk.CDN.Presentation/Controllers/FileController.cs b/Vizhtalk.CDN.Presentation/Controllers/FileController.cs index a56ecbf..525c01b 100644 --- a/Vizhtalk.CDN.Presentation/Controllers/FileController.cs +++ b/Vizhtalk.CDN.Presentation/Controllers/FileController.cs @@ -1,5 +1,5 @@ using Microsoft.AspNetCore.Mvc; -using Vizhtalk.CDN.Presentation.TypeIds; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; namespace Vizhtalk.CDN.Presentation.Controllers { diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/Client.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/Client.cs new file mode 100644 index 0000000..872c254 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/Client.cs @@ -0,0 +1,9 @@ +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Entities; + +public class Client : Entity +{ + +} diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs new file mode 100644 index 0000000..78250c1 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs @@ -0,0 +1,14 @@ +using VizhTalk.BuildingBlocks.Domain; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Domain.ValueObjects; + +namespace Vizhtalk.CDN.Presentation.Domain.Entities; + +public class Media : Entity +{ + public ContentType ContentType { get; private set; } + public int Size { get; set; } + public string Path { get; private set; } + public string Hash { get; set; } + public List MediaGroupMedias { get; set; } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaClient.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaClient.cs new file mode 100644 index 0000000..911c975 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaClient.cs @@ -0,0 +1,13 @@ +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Domain.ValueObjects; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Entities; + +public class MediaClient : Entity +{ + public MediaClientName Name { get; set; } + public MediaId MediaId { get; set; } + public ClientId ClientId { get; set; } + public MediaGroupMediaId MediaGroup { get; set; } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs new file mode 100644 index 0000000..f52184b --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs @@ -0,0 +1,13 @@ +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Domain.ValueObjects; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Entities; + +public class MediaGroup : Entity +{ + public bool IsSecure { get; set; } + public MediaGroupTitle Title { get; set; } + public string Key { get; set; } + public List MediaGroupMedias { get; set; } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs new file mode 100644 index 0000000..14859b5 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs @@ -0,0 +1,11 @@ +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Entities; + +public class MediaGroupMedia : Entity +{ + public MediaId MediaId { get; set; } + public MediaGroupId MediaGroupId { get; set; } + public List MediaClients { get; set; } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/Repositories/IClientRepository.cs b/Vizhtalk.CDN.Presentation/Domain/Repositories/IClientRepository.cs new file mode 100644 index 0000000..89e9af0 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Repositories/IClientRepository.cs @@ -0,0 +1,7 @@ +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Repositories; + +public interface IClientRepository : IRepositoryBase; diff --git a/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs new file mode 100644 index 0000000..2e30964 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs @@ -0,0 +1,7 @@ +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Repositories; + +public interface IMediaClientRepository : IRepositoryBase; diff --git a/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupMediaRepository.cs b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupMediaRepository.cs new file mode 100644 index 0000000..fb21569 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupMediaRepository.cs @@ -0,0 +1,7 @@ +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Repositories; + +public interface IMediaGroupMediaRepository : IRepositoryBase; diff --git a/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupRepository.cs b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupRepository.cs new file mode 100644 index 0000000..0a3e18f --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaGroupRepository.cs @@ -0,0 +1,7 @@ +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Repositories; + +public interface IMediaGroupRepository : IRepositoryBase; diff --git a/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaRepository.cs b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaRepository.cs new file mode 100644 index 0000000..6cab604 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaRepository.cs @@ -0,0 +1,7 @@ +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.Repositories; + +public interface IMediaRepository : IRepositoryBase; diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/ClientId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/ClientId.cs new file mode 100644 index 0000000..db83b70 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/ClientId.cs @@ -0,0 +1,10 @@ +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; + +public class ClientId : TypedIdValueBase +{ + public ClientId(string value) : base(value) + { + } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs new file mode 100644 index 0000000..110be1b --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs @@ -0,0 +1,10 @@ +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; + +public class MediaClientId : TypedIdValueBase +{ + public MediaClientId(long value) : base(value) + { + } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupId.cs new file mode 100644 index 0000000..75f5100 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupId.cs @@ -0,0 +1,10 @@ +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; + +public class MediaGroupId : TypedIdValueBase +{ + public MediaGroupId(long value) : base(value) + { + } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupMediaId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupMediaId.cs new file mode 100644 index 0000000..adcd676 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaGroupMediaId.cs @@ -0,0 +1,10 @@ +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; + +public class MediaGroupMediaId : TypedIdValueBase +{ + public MediaGroupMediaId(Guid value) : base(value) + { + } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs new file mode 100644 index 0000000..40fd700 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs @@ -0,0 +1,10 @@ +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; + +public class MediaId : TypedIdValueBase +{ + public MediaId(long value) : base(value) + { + } +} diff --git a/Vizhtalk.CDN.Presentation/Domain/ValueObjects/ContentType.cs b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/ContentType.cs new file mode 100644 index 0000000..f2d136c --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/ContentType.cs @@ -0,0 +1,15 @@ +using Vizhtalk.CDN.Presentation.Domain.ValueObjects.Rules; +using VizhTalk.BuildingBlocks.Domain; + +namespace Vizhtalk.CDN.Presentation.Domain.ValueObjects; + +public class ContentType : ValueObject +{ + public ContentType(string contentType, byte[] fileBytes) + { + CheckRule(new ValidContentTypeRule(contentType, fileBytes)); + + Value = contentType; + } + public string Value { get; set; } +} diff --git a/Vizhtalk.CDN.Presentation/ValueObjects/MediaClientName.cs b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/MediaClientName.cs similarity index 61% rename from Vizhtalk.CDN.Presentation/ValueObjects/MediaClientName.cs rename to Vizhtalk.CDN.Presentation/Domain/ValueObjects/MediaClientName.cs index c48723a..85657f0 100644 --- a/Vizhtalk.CDN.Presentation/ValueObjects/MediaClientName.cs +++ b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/MediaClientName.cs @@ -1,14 +1,14 @@ using VizhTalk.BuildingBlocks.Domain; using VizhTalk.BuildingBlocks.Domain.Guards; -namespace Vizhtalk.CDN.Presentation.ValueObjects +namespace Vizhtalk.CDN.Presentation.Domain.ValueObjects { public class MediaClientName : ValueObject { public MediaClientName(string value) { - Guard.NullOrEmpty(value, nameof(MediaClientName)); - Guard.MaxLength(value, nameof(MediaClientName), 150); + value.NullOrEmpty(nameof(MediaClientName)); + value.MaxLength(nameof(MediaClientName), 150); Value = value; } diff --git a/Vizhtalk.CDN.Presentation/ValueObjects/MediaGroupTitle.cs b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/MediaGroupTitle.cs similarity index 59% rename from Vizhtalk.CDN.Presentation/ValueObjects/MediaGroupTitle.cs rename to Vizhtalk.CDN.Presentation/Domain/ValueObjects/MediaGroupTitle.cs index a820031..553e3f6 100644 --- a/Vizhtalk.CDN.Presentation/ValueObjects/MediaGroupTitle.cs +++ b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/MediaGroupTitle.cs @@ -1,14 +1,14 @@ using VizhTalk.BuildingBlocks.Domain; using VizhTalk.BuildingBlocks.Domain.Guards; -namespace Vizhtalk.CDN.Presentation.ValueObjects; +namespace Vizhtalk.CDN.Presentation.Domain.ValueObjects; public class MediaGroupTitle : ValueObject { public MediaGroupTitle(string value) { - Guard.NullOrEmpty(value, nameof(MediaGroupTitle)); - Guard.MaxLength(value, nameof(MediaGroupTitle),150); + value.NullOrEmpty(nameof(MediaGroupTitle)); + value.MaxLength(nameof(MediaGroupTitle),150); Value = value; } diff --git a/Vizhtalk.CDN.Presentation/ValueObjects/Rules/ValidContentTypeRule.cs b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/Rules/ValidContentTypeRule.cs similarity index 94% rename from Vizhtalk.CDN.Presentation/ValueObjects/Rules/ValidContentTypeRule.cs rename to Vizhtalk.CDN.Presentation/Domain/ValueObjects/Rules/ValidContentTypeRule.cs index 24cdd70..0beb6c7 100644 --- a/Vizhtalk.CDN.Presentation/ValueObjects/Rules/ValidContentTypeRule.cs +++ b/Vizhtalk.CDN.Presentation/Domain/ValueObjects/Rules/ValidContentTypeRule.cs @@ -2,7 +2,7 @@ using System.Text; using VizhTalk.BuildingBlocks.Domain.Exceptions; -namespace Vizhtalk.CDN.Presentation.ValueObjects.Rules; +namespace Vizhtalk.CDN.Presentation.Domain.ValueObjects.Rules; public class ValidContentTypeRule(string contentType, byte[] fileBytes) : IBusinessRule { @@ -81,7 +81,7 @@ public class ValidContentTypeRule(string contentType, byte[] fileBytes) : IBusin return true; if (contentType == "audio/mpeg" && (fileBytes.Take(3).SequenceEqual(new byte[] { 0x49, 0x44, 0x33 }) // ID3 - || (fileBytes[0] == 0xFF && (fileBytes[1] & 0xE0) == 0xE0))) // MPEG frame + || fileBytes[0] == 0xFF && (fileBytes[1] & 0xE0) == 0xE0)) // MPEG frame return true; if (contentType == "image/svg+xml") diff --git a/Vizhtalk.CDN.Presentation/Entities/Client.cs b/Vizhtalk.CDN.Presentation/Entities/Client.cs deleted file mode 100644 index 37d7a3c..0000000 --- a/Vizhtalk.CDN.Presentation/Entities/Client.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Vizhtalk.CDN.Presentation.TypeIds; -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.Entities -{ - public class Client : Entity - { - - } -} diff --git a/Vizhtalk.CDN.Presentation/Entities/Media.cs b/Vizhtalk.CDN.Presentation/Entities/Media.cs deleted file mode 100644 index bdaf33c..0000000 --- a/Vizhtalk.CDN.Presentation/Entities/Media.cs +++ /dev/null @@ -1,15 +0,0 @@ -using VizhTalk.BuildingBlocks.Domain; -using Vizhtalk.CDN.Presentation.TypeIds; -using Vizhtalk.CDN.Presentation.ValueObjects; - -namespace Vizhtalk.CDN.Presentation.Entities -{ - public class Media : Entity - { - public ContentType ContentType { get; private set; } - public int Size { get; set; } - public string Path { get; private set; } - public string Hash { get; set; } - public List MediaGroupMedias { get; set; } - } -} diff --git a/Vizhtalk.CDN.Presentation/Entities/MediaClient.cs b/Vizhtalk.CDN.Presentation/Entities/MediaClient.cs deleted file mode 100644 index ce52191..0000000 --- a/Vizhtalk.CDN.Presentation/Entities/MediaClient.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Vizhtalk.CDN.Presentation.TypeIds; -using Vizhtalk.CDN.Presentation.ValueObjects; -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.Entities -{ - public class MediaClient : Entity - { - public MediaClientName Name { get; set; } - public MediaId MediaId { get; set; } - public ClientId ClientId { get; set; } - public MediaGroupMediaId MediaGroup { get; set; } - } -} diff --git a/Vizhtalk.CDN.Presentation/Entities/MediaGroup.cs b/Vizhtalk.CDN.Presentation/Entities/MediaGroup.cs deleted file mode 100644 index 3d399e6..0000000 --- a/Vizhtalk.CDN.Presentation/Entities/MediaGroup.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Vizhtalk.CDN.Presentation.TypeIds; -using Vizhtalk.CDN.Presentation.ValueObjects; -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.Entities -{ - public class MediaGroup : Entity - { - public bool IsSecure { get; set; } - public MediaGroupTitle Title { get; set; } - public string Key { get; set; } - public List MediaGroupMedias { get; set; } - } -} diff --git a/Vizhtalk.CDN.Presentation/Entities/MediaGroupMedia.cs b/Vizhtalk.CDN.Presentation/Entities/MediaGroupMedia.cs deleted file mode 100644 index 08418f4..0000000 --- a/Vizhtalk.CDN.Presentation/Entities/MediaGroupMedia.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Vizhtalk.CDN.Presentation.TypeIds; -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.Entities -{ - public class MediaGroupMedia : Entity - { - public MediaId MediaId { get; set; } - public MediaGroupId MediaGroupId { get; set; } - public List MediaClients { get; set; } - } -} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs b/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs new file mode 100644 index 0000000..cea0495 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore; +using MongoDB.Driver; +using Vizhtalk.CDN.Presentation.Application; +using Vizhtalk.CDN.Presentation.Infrastructure.Configuration; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using VizhTalk.BuildingBlocks.Application; +using VizhTalk.BuildingBlocks.Application.Configuration.Commnad; +using VizhTalk.BuildingBlocks.Application.Configuration.Query; +using VizhTalk.BuildingBlocks.Application.Data; +using VizhTalk.BuildingBlocks.Application.Events; +using VizhTalk.BuildingBlocks.Application.Outbox; +using VizhTalk.BuildingBlocks.Infrastructure; +using VizhTalk.BuildingBlocks.Infrastructure.DomainEventsDispatching; + +namespace Vizhtalk.CDN.Presentation.Infrastructure; + +public static class CDNStartup +{ + public static void Initialize(this IServiceCollection services, string connectionString) + { + var domainNotificationsMap = new BiDictionary(); + + services.AddDbContext(op => + { + op.UseMongoDB(connectionString); + }); + services.AddScoped(sp => sp.GetService()); + } + + + + public static void UseCDNModule(this IApplicationBuilder app) + { + using var scope = app.ApplicationServices.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + db.Database.Migrate(); + } +} \ No newline at end of file diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/Configuration/Assemblies.cs b/Vizhtalk.CDN.Presentation/Infrastructure/Configuration/Assemblies.cs new file mode 100644 index 0000000..7b49b39 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/Configuration/Assemblies.cs @@ -0,0 +1,12 @@ +using System.Reflection; +using Vizhtalk.CDN.Presentation.Application; +using Vizhtalk.CDN.Presentation.Domain.Entities; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.Configuration; + +public static class Assemblies +{ + public static Assembly Infrastructure = typeof(UnitOfWork).Assembly; + public static Assembly Application = typeof(IUnitOfWork).Assembly; + public static Assembly Domain = typeof(Media).Assembly; +} \ No newline at end of file diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs new file mode 100644 index 0000000..e139da9 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore; +using Vizhtalk.CDN.Presentation.Infrastructure.Configuration; +using VizhTalk.BuildingBlocks.Infrastructure.EF.Helpers; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.EF +{ + public class CDNDbContext : DbContext + { + + public CDNDbContext(DbContextOptions options) : base(options) + { + + } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.FindEntities(Assemblies.Domain) + .ApplyConfigurationsFromAssembly(Assemblies.Infrastructure, x => x.FullName.Contains("EF.Configurations")) + .PluralizeEntities(); + } + + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/ClientConfiguration.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/ClientConfiguration.cs new file mode 100644 index 0000000..b066548 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/ClientConfiguration.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Vizhtalk.CDN.Presentation.Domain.Entities; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.EF.Configurations; + +public class ClientConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Client)); + builder.HasKey(x => x.Id); + + builder.Property(x => x.Id) + .HasConversion(x => x.Value, x => new Domain.TypeIds.ClientId(x)); + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs new file mode 100644 index 0000000..4b99f32 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Vizhtalk.CDN.Presentation.Domain.Entities; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.EF.Configurations; + +public class MediaClientConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(MediaClient)); + builder.HasKey(x => x.Id); + + builder.Property(x => x.Id) + .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaClientId(x)); + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaConfiguration.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaConfiguration.cs new file mode 100644 index 0000000..e4150ff --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaConfiguration.cs @@ -0,0 +1,19 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Vizhtalk.CDN.Presentation.Domain.Entities; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.EF.Configurations; + +public class MediaConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(Media)); + builder.HasKey(x => x.Id); + builder.Property(x => x.Id) + .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaId(x)); + + builder.HasIndex(x => x.Hash); + + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupConfiguration.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupConfiguration.cs new file mode 100644 index 0000000..70bece1 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupConfiguration.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Vizhtalk.CDN.Presentation.Domain.Entities; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.EF.Configurations; + +public class MediaGroupConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(MediaGroup)); + builder.HasKey(x => x.Id); + builder.Property(x => x.Id) + .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaGroupId(x)); + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupMediaConfiguration.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupMediaConfiguration.cs new file mode 100644 index 0000000..2061c75 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaGroupMediaConfiguration.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Vizhtalk.CDN.Presentation.Domain.Entities; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.EF.Configurations; + +public class MediaGroupMediaConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(nameof(MediaGroupMedia)); + builder.HasKey(x => x.Id); + builder.Property(x => x.Id) + .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaGroupMediaId(x)); + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs b/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs new file mode 100644 index 0000000..6e4deb0 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs @@ -0,0 +1,23 @@ +using Vizhtalk.CDN.Presentation.Application; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using VizhTalk.BuildingBlocks.Infrastructure; +using VizhTalk.BuildingBlocks.Infrastructure.DomainEventsDispatching; + +namespace Vizhtalk.CDN.Presentation.Infrastructure +{ + public class UnitOfWork(CDNDbContext cdnDbContext, IDomainEventsDispatcher domainEventsDispatcher) + : UnitOfWorkBase(cdnDbContext, domainEventsDispatcher) + { + public IMediaRepository Media => throw new NotImplementedException(); + + public IClientRepository Client => throw new NotImplementedException(); + + public IMediaClientRepository MediaClient => throw new NotImplementedException(); + + public IMediaGroupRepository MediaGroup => throw new NotImplementedException(); + + public IMediaGroupMediaRepository MediaGroupMedia => throw new NotImplementedException(); + + } +} diff --git a/Vizhtalk.CDN.Presentation/Program.cs b/Vizhtalk.CDN.Presentation/Program.cs index 3c95eda..f2048f4 100644 --- a/Vizhtalk.CDN.Presentation/Program.cs +++ b/Vizhtalk.CDN.Presentation/Program.cs @@ -1,13 +1,23 @@ +using MongoDB.Driver.Core.Configuration; +using Vizhtalk.CDN.Presentation.Infrastructure; using Vizhtalk.CDN.Presentation.Services; var builder = WebApplication.CreateBuilder(args); +var connectionString = builder.Configuration.GetConnectionString("VizhTalk.CDN")!; + + +builder.Services.Initialize(connectionString); builder.Services.AddGrpc(); + var app = builder.Build(); + + app.MapGet("/", () => "Hello World!"); app.MapGrpcService(); +app.UseCDNModule(); app.Run(); diff --git a/Vizhtalk.CDN.Presentation/TypeIds/ClientId.cs b/Vizhtalk.CDN.Presentation/TypeIds/ClientId.cs deleted file mode 100644 index 332c195..0000000 --- a/Vizhtalk.CDN.Presentation/TypeIds/ClientId.cs +++ /dev/null @@ -1,11 +0,0 @@ -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.TypeIds -{ - public class ClientId : TypedIdValueBase - { - public ClientId(string value) : base(value) - { - } - } -} diff --git a/Vizhtalk.CDN.Presentation/TypeIds/MediaClientId.cs b/Vizhtalk.CDN.Presentation/TypeIds/MediaClientId.cs deleted file mode 100644 index 84f1fce..0000000 --- a/Vizhtalk.CDN.Presentation/TypeIds/MediaClientId.cs +++ /dev/null @@ -1,11 +0,0 @@ -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.TypeIds -{ - public class MediaClientId : TypedIdValueBase - { - public MediaClientId(long value) : base(value) - { - } - } -} diff --git a/Vizhtalk.CDN.Presentation/TypeIds/MediaGroupId.cs b/Vizhtalk.CDN.Presentation/TypeIds/MediaGroupId.cs deleted file mode 100644 index a64914e..0000000 --- a/Vizhtalk.CDN.Presentation/TypeIds/MediaGroupId.cs +++ /dev/null @@ -1,11 +0,0 @@ -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.TypeIds -{ - public class MediaGroupId : TypedIdValueBase - { - public MediaGroupId(long value) : base(value) - { - } - } -} diff --git a/Vizhtalk.CDN.Presentation/TypeIds/MediaGroupMediaId.cs b/Vizhtalk.CDN.Presentation/TypeIds/MediaGroupMediaId.cs deleted file mode 100644 index 5ed43ec..0000000 --- a/Vizhtalk.CDN.Presentation/TypeIds/MediaGroupMediaId.cs +++ /dev/null @@ -1,11 +0,0 @@ -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.TypeIds -{ - public class MediaGroupMediaId : TypedIdValueBase - { - public MediaGroupMediaId(Guid value) : base(value) - { - } - } -} diff --git a/Vizhtalk.CDN.Presentation/TypeIds/MediaId.cs b/Vizhtalk.CDN.Presentation/TypeIds/MediaId.cs deleted file mode 100644 index 5e4e85a..0000000 --- a/Vizhtalk.CDN.Presentation/TypeIds/MediaId.cs +++ /dev/null @@ -1,11 +0,0 @@ -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.TypeIds -{ - public class MediaId : TypedIdValueBase - { - public MediaId(long value) : base(value) - { - } - } -} diff --git a/Vizhtalk.CDN.Presentation/ValueObjects/ContentType.cs b/Vizhtalk.CDN.Presentation/ValueObjects/ContentType.cs deleted file mode 100644 index 16a7ac4..0000000 --- a/Vizhtalk.CDN.Presentation/ValueObjects/ContentType.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Vizhtalk.CDN.Presentation.ValueObjects.Rules; -using VizhTalk.BuildingBlocks.Domain; - -namespace Vizhtalk.CDN.Presentation.ValueObjects -{ - public class ContentType : ValueObject - { - public ContentType(string contentType, byte[] fileBytes) - { - CheckRule(new ValidContentTypeRule(contentType, fileBytes)); - - Value = contentType; - } - public string Value { get; set; } - } -} diff --git a/Vizhtalk.CDN.Presentation/Vizhtalk.CDN.Presentation.csproj b/Vizhtalk.CDN.Presentation/Vizhtalk.CDN.Presentation.csproj index 789b51e..0dd4562 100644 --- a/Vizhtalk.CDN.Presentation/Vizhtalk.CDN.Presentation.csproj +++ b/Vizhtalk.CDN.Presentation/Vizhtalk.CDN.Presentation.csproj @@ -8,13 +8,18 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - - + + diff --git a/Vizhtalk.CDN.Presentation/appsettings.json b/Vizhtalk.CDN.Presentation/appsettings.json index 5844145..77f87d0 100644 --- a/Vizhtalk.CDN.Presentation/appsettings.json +++ b/Vizhtalk.CDN.Presentation/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "VizhTalk.CDN": "mongodb://localhost:27017/VizhTalk.CDN" + "VizhTalk.CDN": "mongodb://localhost:27017/VizhTalk_CDN" }, "AllowedHosts": "*" }