diff --git a/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs b/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs index 118170e..3b3cfcc 100644 --- a/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs +++ b/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs @@ -7,12 +7,10 @@ namespace VizhTalk.Gateway.Web.BFF.Mappers { public static async Task AsFile(this IFile file) { - using MemoryStream stream = new MemoryStream(); - await file.CopyToAsync(stream); return new UploadFile() { ContentType = file.ContentType, - File = ByteString.FromStream(stream), + File = ByteString.FromStream(file.OpenReadStream()), Name = file.Name, }; } diff --git a/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs b/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs index ab6e139..3c440a2 100644 --- a/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs +++ b/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs @@ -1,4 +1,4 @@ namespace VizhTalk.Gateway.Web.BFF.Models; public record CreateLanguageRequest(string Title,IFile Icon); -public record UpdateLanguageRequest(IdRequest Id, string Title,IFile Icon); +public record UpdateLanguageRequest(IdRequest Id, string Title, IFile? Icon); diff --git a/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs b/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs index eda605b..49a3a4c 100644 --- a/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs +++ b/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs @@ -20,11 +20,19 @@ public class LanguageMutation(LanguageGrpc.LanguageGrpcClient client) [GraphQLName("UpdateLanguage")] public async Task UpdateLanguage(UpdateLanguageRequest request) { + UploadFile file = null; + if(request.Icon != null) + { + file = await request.Icon.AsFile(); + } return await client.UpdateAsync(new UpdateLanguageCommand() { - Id = new Id(request.Id.Value), + Id = new Id() + { + Value = request.Id.Value + }, Title = request.Title, - Icon = await request.Icon.AsFile() + Icon = file }); } } diff --git a/VizhTalk.Gateway.BFF/Program.cs b/VizhTalk.Gateway.BFF/Program.cs index 3ba14ad..0b38f4b 100644 --- a/VizhTalk.Gateway.BFF/Program.cs +++ b/VizhTalk.Gateway.BFF/Program.cs @@ -14,7 +14,8 @@ builder.Services.AddScoped(); builder.AddGraphQL() .AddQueryType() .AddMutationType() - .AddType(); + .AddType() + .AddMutationConventions(); var app = builder.Build(); diff --git a/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs b/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs index c03f405..6b01168 100644 --- a/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs +++ b/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs @@ -51,12 +51,10 @@ public class CreateLanguageCommandHandler(IUnitOfWork unitOfWork, MediaGroupId = fileGroup.MediaGroupId }, cancellationToken: cancellationToken); - var language = Language.CreateNew(new LanguageTitle(title)); + var media = Media.CreateNew(title, upload.ContentType, upload.Size, upload.MediaGroupMediaId, new EntityType(EntityTypeEnum.Language)); + var language = Language.CreateNew(new LanguageTitle(title), media); await unitOfWork.Language.AddAsync(language, cancellationToken); await unitOfWork.SaveChangeAsync(cancellationToken); - var media = Media.CreateNew(title, upload.ContentType, upload.Size, new EntityType(language.Id.Value.ToString(), EntityTypeEnum.Language)); - await unitOfWork.Media.AddAsync(media, cancellationToken); - language.SetIcon(media); return language.Adapt(); } catch (Exception ex) @@ -76,7 +74,7 @@ public class UpdateLanguageCommandHandler(IUnitOfWork unitOfWork, CDNGrpc.CDNGrp throw new LanguageNotFoundException(); language.SetTitle(new LanguageTitle(request.Title)); - if(request.Icon != null) + if (request.Icon != null) { var fileGroup = await unitOfWork.FileGroup.GetByFileGroupKey(FileGroupKey.IconLanguage); @@ -92,7 +90,7 @@ public class UpdateLanguageCommandHandler(IUnitOfWork unitOfWork, CDNGrpc.CDNGrp MediaGroupId = fileGroup.MediaGroupId }, cancellationToken: cancellationToken); - var media = Media.CreateNew(request.Title, upload.ContentType, upload.Size, new EntityType(language.Id.Value.ToString(), EntityTypeEnum.Language)); + var media = Media.CreateNew(request.Title, upload.ContentType, upload.Size, upload.MediaGroupMediaId, new EntityType(EntityTypeEnum.Language)); language.SetIcon(media); } diff --git a/VizhTalk.Learning.Domain/Entities/FileGroup.cs b/VizhTalk.Learning.Domain/Entities/FileGroup.cs index 18e5272..eabf5dc 100644 --- a/VizhTalk.Learning.Domain/Entities/FileGroup.cs +++ b/VizhTalk.Learning.Domain/Entities/FileGroup.cs @@ -13,7 +13,7 @@ public class FileGroup : Entity private FileGroup(FileGroupKey key, FileGroupTitle title, bool isSecure, - long mediaGroupId) + Guid mediaGroupId) { Title = title; MediaGroupId = mediaGroupId; @@ -22,12 +22,12 @@ public class FileGroup : Entity } public FileGroupTitle Title { get; set; } public FileGroupKey Key { get; private set; } - public long MediaGroupId { get; private set; } + public Guid MediaGroupId { get; private set; } public bool IsSecure { get; set; } public static FileGroup CreateNew(FileGroupKey key, FileGroupTitle title, bool isSecure, - long mediaGroupId) + Guid mediaGroupId) => new(key,title, isSecure, mediaGroupId); } diff --git a/VizhTalk.Learning.Domain/Entities/Language.cs b/VizhTalk.Learning.Domain/Entities/Language.cs index 5266932..2d8f7d6 100644 --- a/VizhTalk.Learning.Domain/Entities/Language.cs +++ b/VizhTalk.Learning.Domain/Entities/Language.cs @@ -12,15 +12,16 @@ public class Language : Entity, IAggregateRoot { // only EF } - private Language(LanguageTitle title) + private Language(LanguageTitle title, Media icon) { Title = title; + Icon = icon; } public LanguageTitle Title { get; private set; } public Media Icon { get; private set; } public IReadOnlyList Courses => _courses; - public static Language CreateNew(LanguageTitle title) - => new(title); + public static Language CreateNew(LanguageTitle title,Media icon) + => new(title, icon); public void SetTitle(LanguageTitle title) => Title = title; diff --git a/VizhTalk.Learning.Domain/Entities/Media.cs b/VizhTalk.Learning.Domain/Entities/Media.cs index e20ba2a..2509abf 100644 --- a/VizhTalk.Learning.Domain/Entities/Media.cs +++ b/VizhTalk.Learning.Domain/Entities/Media.cs @@ -8,26 +8,30 @@ public class Media : Entity { private Media() { - + } private Media(string name, string contentType, int size, + Guid fileId, EntityType type) { Name = name; ContentType = contentType; Size = size; + FileId = fileId; EntityType = type; } public string Name { get; private set; } - public string ContentType { get; private set; } + public string ContentType { get; private set; } public int Size { get; private set; } + public Guid FileId { get; set; } public EntityType EntityType { get; private set; } public static Media CreateNew(string name, string contentType, int size, + Guid fileId, EntityType type) - => new(name, contentType, size, type); + => new(name, contentType, size, fileId, type); } diff --git a/VizhTalk.Learning.Domain/TypeIds/MediaId.cs b/VizhTalk.Learning.Domain/TypeIds/MediaId.cs index 06abcaf..2255152 100644 --- a/VizhTalk.Learning.Domain/TypeIds/MediaId.cs +++ b/VizhTalk.Learning.Domain/TypeIds/MediaId.cs @@ -2,9 +2,9 @@ namespace VizhTalk.Learning.Domain.TypeIds; -public class MediaId : TypeIdValueBase +public class MediaId : TypeIdValueBase { - public MediaId(Guid value) : base(value) + public MediaId(long value) : base(value) { } } diff --git a/VizhTalk.Learning.Domain/ValueObjects/EntityType.cs b/VizhTalk.Learning.Domain/ValueObjects/EntityType.cs index bc825a5..598cbae 100644 --- a/VizhTalk.Learning.Domain/ValueObjects/EntityType.cs +++ b/VizhTalk.Learning.Domain/ValueObjects/EntityType.cs @@ -4,12 +4,10 @@ namespace VizhTalk.Learning.Domain.ValueObjects; public class EntityType : ValueObject { - public EntityType(string entityId, EntityTypeEnum type) + public EntityType(EntityTypeEnum type) { - EntityId = entityId; Type = type; } - public string EntityId { get; private set; } public EntityTypeEnum Type { get; private set; } } public enum EntityTypeEnum diff --git a/VizhTalk.Learning.Domain/ValueObjects/FileGroupTitle.cs b/VizhTalk.Learning.Domain/ValueObjects/FileGroupTitle.cs index 8bcf126..4e24999 100644 --- a/VizhTalk.Learning.Domain/ValueObjects/FileGroupTitle.cs +++ b/VizhTalk.Learning.Domain/ValueObjects/FileGroupTitle.cs @@ -9,6 +9,7 @@ public class FileGroupTitle : ValueObject { Guard.NullOrEmpty(value, nameof(FileGroupTitle)); Guard.MaxLength(value, nameof(FileGroupTitle), 50); + Value = value; } public string Value { get; set; } } diff --git a/VizhTalk.Learning.Infrastructure/EF/Configurations/FileGroupConfiguration.cs b/VizhTalk.Learning.Infrastructure/EF/Configurations/FileGroupConfiguration.cs index 2bdfea2..e035cb2 100644 --- a/VizhTalk.Learning.Infrastructure/EF/Configurations/FileGroupConfiguration.cs +++ b/VizhTalk.Learning.Infrastructure/EF/Configurations/FileGroupConfiguration.cs @@ -15,6 +15,7 @@ internal class FileGroupConfiguration : IEntityTypeConfiguration builder.Property(x => x.Id) .ValueGeneratedOnAdd() .HasConversion(x => x.Value, x => new Domain.TypeIds.FileGroupId(x)); + builder.Property(x => x.Title) .HasColumnName("Title") .HasConversion(x => x.Value, x => new FileGroupTitle(x)); diff --git a/VizhTalk.Learning.Infrastructure/EF/Configurations/MediaConfiguration.cs b/VizhTalk.Learning.Infrastructure/EF/Configurations/MediaConfiguration.cs index e9e54e5..a10c752 100644 --- a/VizhTalk.Learning.Infrastructure/EF/Configurations/MediaConfiguration.cs +++ b/VizhTalk.Learning.Infrastructure/EF/Configurations/MediaConfiguration.cs @@ -12,7 +12,8 @@ internal class MediaConfiguration : IEntityTypeConfiguration builder.HasKey(x => x.Id); builder.Property(x => x.Id) - .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaId(x)); + .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaId(x)) + .ValueGeneratedOnAdd(); builder.Property(x => x.Name) .HasMaxLength(150); @@ -24,10 +25,6 @@ internal class MediaConfiguration : IEntityTypeConfiguration op.Property(x => x.Type) .HasColumnName("EntityType") .HasMaxLength(200); - - op.Property(x => x.EntityId) - .HasColumnName("EntityId") - .HasMaxLength(50); }); } } diff --git a/VizhTalk.Learning.Infrastructure/LearningStartup.cs b/VizhTalk.Learning.Infrastructure/LearningStartup.cs index 14ecd89..d430b6b 100644 --- a/VizhTalk.Learning.Infrastructure/LearningStartup.cs +++ b/VizhTalk.Learning.Infrastructure/LearningStartup.cs @@ -10,6 +10,7 @@ using VizhTalk.BuildingBlocks.Application.Outbox; using VizhTalk.BuildingBlocks.Infrastructure; using VizhTalk.BuildingBlocks.Infrastructure.DomainEventsDispatching; using VizhTalk.Grpc.CDN; +using VizhTalk.Grpc.Learning.Language; using VizhTalk.Learning.Application; using VizhTalk.Learning.Application.Mappers; using VizhTalk.Learning.Infrastructure.Configuration; @@ -29,6 +30,10 @@ public static class LearningStartup { op.UseSqlServer(connectionString); }); + services.AddGrpcClient(o => + { + o.Address = new Uri("https://localhost:5001"); + }); services.AddScoped(sp => sp.GetService()); services.AddScoped(); services.AddScoped(); diff --git a/VizhTalk.Learning.Infrastructure/Migrations/20250905153842_initial.Designer.cs b/VizhTalk.Learning.Infrastructure/Migrations/20250905153842_initial.Designer.cs deleted file mode 100644 index 9ee075e..0000000 --- a/VizhTalk.Learning.Infrastructure/Migrations/20250905153842_initial.Designer.cs +++ /dev/null @@ -1,183 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using VizhTalk.Learning.Infrastructure.EF; - -#nullable disable - -namespace VizhTalk.Learning.Infrastructure.Migrations -{ - [DbContext(typeof(LearningDbContext))] - [Migration("20250905153842_initial")] - partial class initial - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("Learning") - .HasAnnotation("ProductVersion", "8.0.19") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.FileGroup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("CreateOn") - .HasColumnType("datetime2"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("IsDeleted") - .HasColumnType("bit"); - - b.Property("IsSecure") - .HasColumnType("bit"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("nvarchar(150)") - .HasColumnName("Key"); - - b.Property("LastUpdate") - .HasColumnType("datetime2"); - - b.Property("MediaGroupId") - .HasColumnType("bigint"); - - b.Property("Title") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("Title"); - - b.HasKey("Id"); - - b.ToTable("FileGroups", "Attachment"); - }); - - modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Language", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("smallint"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("CreateOn") - .HasColumnType("datetime2"); - - b.Property("IconId") - .HasColumnType("uniqueidentifier"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("IsDeleted") - .HasColumnType("bit"); - - b.Property("LastUpdate") - .HasColumnType("datetime2"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(60) - .HasColumnType("nvarchar(60)"); - - b.HasKey("Id"); - - b.HasIndex("IconId"); - - b.ToTable("Languages", "Learning"); - }); - - modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Media", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ContentType") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("CreateOn") - .HasColumnType("datetime2"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("IsDeleted") - .HasColumnType("bit"); - - b.Property("LastUpdate") - .HasColumnType("datetime2"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("nvarchar(150)"); - - b.Property("Size") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("Medias", "Learning"); - }); - - modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Language", b => - { - b.HasOne("VizhTalk.Learning.Domain.Entities.Media", "Icon") - .WithMany() - .HasForeignKey("IconId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Icon"); - }); - - modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Media", b => - { - b.OwnsOne("VizhTalk.Learning.Domain.ValueObjects.EntityType", "EntityType", b1 => - { - b1.Property("MediaId") - .HasColumnType("uniqueidentifier"); - - b1.Property("EntityId") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)") - .HasColumnName("EntityId"); - - b1.Property("Type") - .HasMaxLength(200) - .HasColumnType("int") - .HasColumnName("EntityType"); - - b1.HasKey("MediaId"); - - b1.ToTable("Medias", "Learning"); - - b1.WithOwner() - .HasForeignKey("MediaId"); - }); - - b.Navigation("EntityType") - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.cs b/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.cs deleted file mode 100644 index 2064af4..0000000 --- a/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace VizhTalk.Learning.Infrastructure.Migrations -{ - /// - public partial class Course : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Courses", - schema: "Learning", - columns: table => new - { - Id = table.Column(type: "bigint", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - Title = table.Column(type: "nvarchar(max)", nullable: false), - ImageId = table.Column(type: "uniqueidentifier", nullable: false), - Order = table.Column(type: "int", nullable: false), - LanguageId = table.Column(type: "smallint", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false), - IsActive = table.Column(type: "bit", nullable: false), - CreateOn = table.Column(type: "datetime2", nullable: false), - LastUpdate = table.Column(type: "datetime2", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Courses", x => x.Id); - table.ForeignKey( - name: "FK_Courses_Languages_LanguageId", - column: x => x.LanguageId, - principalSchema: "Learning", - principalTable: "Languages", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Courses_Medias_ImageId", - column: x => x.ImageId, - principalSchema: "Learning", - principalTable: "Medias", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_Courses_ImageId", - schema: "Learning", - table: "Courses", - column: "ImageId"); - - migrationBuilder.CreateIndex( - name: "IX_Courses_LanguageId", - schema: "Learning", - table: "Courses", - column: "LanguageId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Courses", - schema: "Learning"); - } - } -} diff --git a/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.Designer.cs b/VizhTalk.Learning.Infrastructure/Migrations/20250912083328_initial.Designer.cs similarity index 91% rename from VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.Designer.cs rename to VizhTalk.Learning.Infrastructure/Migrations/20250912083328_initial.Designer.cs index 28fdedb..5a4b5f4 100644 --- a/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.Designer.cs +++ b/VizhTalk.Learning.Infrastructure/Migrations/20250912083328_initial.Designer.cs @@ -12,8 +12,8 @@ using VizhTalk.Learning.Infrastructure.EF; namespace VizhTalk.Learning.Infrastructure.Migrations { [DbContext(typeof(LearningDbContext))] - [Migration("20250907192005_Course")] - partial class Course + [Migration("20250912083328_initial")] + partial class initial { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -37,8 +37,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("CreateOn") .HasColumnType("datetime2"); - b.Property("ImageId") - .HasColumnType("uniqueidentifier"); + b.Property("ImageId") + .HasColumnType("bigint"); b.Property("IsActive") .HasColumnType("bit"); @@ -97,8 +97,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("LastUpdate") .HasColumnType("datetime2"); - b.Property("MediaGroupId") - .HasColumnType("bigint"); + b.Property("MediaGroupId") + .HasColumnType("uniqueidentifier"); b.Property("Title") .IsRequired() @@ -121,8 +121,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("CreateOn") .HasColumnType("datetime2"); - b.Property("IconId") - .HasColumnType("uniqueidentifier"); + b.Property("IconId") + .HasColumnType("bigint"); b.Property("IsActive") .HasColumnType("bit"); @@ -147,8 +147,11 @@ namespace VizhTalk.Learning.Infrastructure.Migrations modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Media", b => { - b.Property("Id") - .HasColumnType("uniqueidentifier"); + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("ContentType") .IsRequired() @@ -157,6 +160,9 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("CreateOn") .HasColumnType("datetime2"); + b.Property("FileId") + .HasColumnType("uniqueidentifier"); + b.Property("IsActive") .HasColumnType("bit"); @@ -209,14 +215,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations { b.OwnsOne("VizhTalk.Learning.Domain.ValueObjects.EntityType", "EntityType", b1 => { - b1.Property("MediaId") - .HasColumnType("uniqueidentifier"); - - b1.Property("EntityId") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)") - .HasColumnName("EntityId"); + b1.Property("MediaId") + .HasColumnType("bigint"); b1.Property("Type") .HasMaxLength(200) diff --git a/VizhTalk.Learning.Infrastructure/Migrations/20250905153842_initial.cs b/VizhTalk.Learning.Infrastructure/Migrations/20250912083328_initial.cs similarity index 62% rename from VizhTalk.Learning.Infrastructure/Migrations/20250905153842_initial.cs rename to VizhTalk.Learning.Infrastructure/Migrations/20250912083328_initial.cs index 5187e50..412f2f3 100644 --- a/VizhTalk.Learning.Infrastructure/Migrations/20250905153842_initial.cs +++ b/VizhTalk.Learning.Infrastructure/Migrations/20250912083328_initial.cs @@ -12,10 +12,10 @@ namespace VizhTalk.Learning.Infrastructure.Migrations protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.EnsureSchema( - name: "Attachment"); + name: "Learning"); migrationBuilder.EnsureSchema( - name: "Learning"); + name: "Attachment"); migrationBuilder.CreateTable( name: "FileGroups", @@ -26,7 +26,7 @@ namespace VizhTalk.Learning.Infrastructure.Migrations .Annotation("SqlServer:Identity", "1, 1"), Title = table.Column(type: "nvarchar(max)", nullable: false), Key = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), - MediaGroupId = table.Column(type: "bigint", nullable: false), + MediaGroupId = table.Column(type: "uniqueidentifier", nullable: false), IsSecure = table.Column(type: "bit", nullable: false), IsDeleted = table.Column(type: "bit", nullable: false), IsActive = table.Column(type: "bit", nullable: false), @@ -43,11 +43,12 @@ namespace VizhTalk.Learning.Infrastructure.Migrations schema: "Learning", columns: table => new { - Id = table.Column(type: "uniqueidentifier", nullable: false), + Id = table.Column(type: "bigint", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), Name = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false), ContentType = table.Column(type: "nvarchar(max)", nullable: false), Size = table.Column(type: "int", nullable: false), - EntityId = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + FileId = table.Column(type: "uniqueidentifier", nullable: false), EntityType = table.Column(type: "int", maxLength: 200, nullable: false), IsDeleted = table.Column(type: "bit", nullable: false), IsActive = table.Column(type: "bit", nullable: false), @@ -67,7 +68,7 @@ namespace VizhTalk.Learning.Infrastructure.Migrations Id = table.Column(type: "smallint", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Title = table.Column(type: "nvarchar(60)", maxLength: 60, nullable: false), - IconId = table.Column(type: "uniqueidentifier", nullable: false), + IconId = table.Column(type: "bigint", nullable: false), IsDeleted = table.Column(type: "bit", nullable: false), IsActive = table.Column(type: "bit", nullable: false), CreateOn = table.Column(type: "datetime2", nullable: false), @@ -85,6 +86,52 @@ namespace VizhTalk.Learning.Infrastructure.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "Courses", + schema: "Learning", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Title = table.Column(type: "nvarchar(max)", nullable: false), + ImageId = table.Column(type: "bigint", nullable: false), + Order = table.Column(type: "int", nullable: false), + LanguageId = table.Column(type: "smallint", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false), + IsActive = table.Column(type: "bit", nullable: false), + CreateOn = table.Column(type: "datetime2", nullable: false), + LastUpdate = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Courses", x => x.Id); + table.ForeignKey( + name: "FK_Courses_Languages_LanguageId", + column: x => x.LanguageId, + principalSchema: "Learning", + principalTable: "Languages", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_Courses_Medias_ImageId", + column: x => x.ImageId, + principalSchema: "Learning", + principalTable: "Medias", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Courses_ImageId", + schema: "Learning", + table: "Courses", + column: "ImageId"); + + migrationBuilder.CreateIndex( + name: "IX_Courses_LanguageId", + schema: "Learning", + table: "Courses", + column: "LanguageId"); + migrationBuilder.CreateIndex( name: "IX_Languages_IconId", schema: "Learning", @@ -95,6 +142,10 @@ namespace VizhTalk.Learning.Infrastructure.Migrations /// protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "Courses", + schema: "Learning"); + migrationBuilder.DropTable( name: "FileGroups", schema: "Attachment"); diff --git a/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs b/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs index a1cb65b..cd1f1c2 100644 --- a/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs +++ b/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs @@ -34,8 +34,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("CreateOn") .HasColumnType("datetime2"); - b.Property("ImageId") - .HasColumnType("uniqueidentifier"); + b.Property("ImageId") + .HasColumnType("bigint"); b.Property("IsActive") .HasColumnType("bit"); @@ -94,8 +94,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("LastUpdate") .HasColumnType("datetime2"); - b.Property("MediaGroupId") - .HasColumnType("bigint"); + b.Property("MediaGroupId") + .HasColumnType("uniqueidentifier"); b.Property("Title") .IsRequired() @@ -118,8 +118,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("CreateOn") .HasColumnType("datetime2"); - b.Property("IconId") - .HasColumnType("uniqueidentifier"); + b.Property("IconId") + .HasColumnType("bigint"); b.Property("IsActive") .HasColumnType("bit"); @@ -144,8 +144,11 @@ namespace VizhTalk.Learning.Infrastructure.Migrations modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Media", b => { - b.Property("Id") - .HasColumnType("uniqueidentifier"); + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("ContentType") .IsRequired() @@ -154,6 +157,9 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Property("CreateOn") .HasColumnType("datetime2"); + b.Property("FileId") + .HasColumnType("uniqueidentifier"); + b.Property("IsActive") .HasColumnType("bit"); @@ -206,14 +212,8 @@ namespace VizhTalk.Learning.Infrastructure.Migrations { b.OwnsOne("VizhTalk.Learning.Domain.ValueObjects.EntityType", "EntityType", b1 => { - b1.Property("MediaId") - .HasColumnType("uniqueidentifier"); - - b1.Property("EntityId") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)") - .HasColumnName("EntityId"); + b1.Property("MediaId") + .HasColumnType("bigint"); b1.Property("Type") .HasMaxLength(200) diff --git a/VizhTalk.Learning.Presentation/Program.cs b/VizhTalk.Learning.Presentation/Program.cs index c29871a..f048dd3 100644 --- a/VizhTalk.Learning.Presentation/Program.cs +++ b/VizhTalk.Learning.Presentation/Program.cs @@ -5,7 +5,11 @@ var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("LearningDB")!; // Add services to the container. -builder.Services.AddGrpc(); +builder.Services.AddGrpc(op => +{ + op.MaxReceiveMessageSize = 200 * 1024 * 1024; + op.MaxSendMessageSize = 200 * 1024 * 1024; +}); builder.Services.Initialize(connectionString); var app = builder.Build(); diff --git a/Vizhtalk.CDN.Presentation/Application/CommandHandlers/MediaCommandHandler.cs b/Vizhtalk.CDN.Presentation/Application/CommandHandlers/MediaCommandHandler.cs index 6186b28..f5717ac 100644 --- a/Vizhtalk.CDN.Presentation/Application/CommandHandlers/MediaCommandHandler.cs +++ b/Vizhtalk.CDN.Presentation/Application/CommandHandlers/MediaCommandHandler.cs @@ -14,25 +14,24 @@ using VizhTalk.Grpc.CDN; namespace Vizhtalk.CDN.Presentation.Application.CommandHandlers; -public class CreateMediaGroupCommandHandler(IUnitOfWork unitOfWork, CDNGrpc.CDNGrpcClient cdnClient) : ICommandHandler +public class CreateMediaGroupCommandHandler(IUnitOfWork unitOfWork) : ICommandHandler { public async Task Handle(CreateMediaGroupCommand request, CancellationToken cancellationToken) { var title = request.Title.Trim(); - - if (await unitOfWork.MediaGroup.ExistsAsync(a => a.Key == request.Key)) - throw new MediaGroupKeyAlreadyExistsException(); + var mediaGroup = await unitOfWork.MediaGroup.GetAsync(a => a.Key == request.Key); + if (mediaGroup != null) + return mediaGroup.Adapt(); - var mediaGroup = MediaGroup.CreateNew(title, request.Key, request.IsSecure); + mediaGroup = MediaGroup.CreateNew(title, request.Key, request.IsSecure); await unitOfWork.MediaGroup.AddAsync(mediaGroup, cancellationToken); await unitOfWork.SaveChangeAsync(cancellationToken); return mediaGroup.Adapt(); - } } -public class UploadFileCommandHandler(IUnitOfWork unitOfWork, CDNGrpc.CDNGrpcClient cdnClient, IFileManagerService fileManager) : ICommandHandler +public class UploadFileCommandHandler(IUnitOfWork unitOfWork, IFileManagerService fileManager) : ICommandHandler { public async Task Handle(UploadFileCommand request, CancellationToken cancellationToken) { @@ -57,11 +56,11 @@ public class UploadFileCommandHandler(IUnitOfWork unitOfWork, CDNGrpc.CDNGrpcCli var path = await fileManager.SaveFile(fileBytes, extension, mediaGroup.Id); media = Media.CreateNew(new ContentType(request.File.ContentType, fileBytes), fileBytes.Length, hash, path); } - var mediaGroupMedia = mediaGroup.AddMedia(new FileName(request.File.Name), media); + var mediaGroupMedia = mediaGroup.AddMedia(new FileName(request.File.Name), media); if (!string.IsNullOrEmpty(request.ClientId)) mediaGroupMedia.AddMediaPermission(media, Client.CreateNew(new ClientId(request.ClientId))); - await unitOfWork.MediaGroup.AddAsync(mediaGroup, cancellationToken); + await unitOfWork.MediaGroup.UpdateAsync(mediaGroup, cancellationToken); await unitOfWork.SaveChangeAsync(cancellationToken); return new UploadFileDTO() diff --git a/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs b/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs index c74b24e..486b85d 100644 --- a/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs +++ b/Vizhtalk.CDN.Presentation/Application/IUnitOfWork.cs @@ -7,7 +7,7 @@ namespace Vizhtalk.CDN.Presentation.Application { IMediaRepository Media { get; } IClientRepository Client { get; } - IMediaClientRepository MediaClient { get; } + IMediaPermissionRepository MediaClient { get; } IMediaGroupRepository MediaGroup{ get; } IMediaGroupMediaRepository MediaGroupMedia { get; } diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs index 6f7829b..4f6f2a0 100644 --- a/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/Media.cs @@ -7,10 +7,13 @@ namespace Vizhtalk.CDN.Presentation.Domain.Entities; public class Media : Entity { - - private Media(ContentType contentType, int size , string hash , string path) + private Media() { + } + private Media(ContentType contentType, int size , string hash , string path) + { + Id = new MediaId(Guid.NewGuid()); ContentType = contentType; Size = size; Hash = hash; diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs index 9d0815a..df7b1f0 100644 --- a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroup.cs @@ -6,9 +6,13 @@ namespace Vizhtalk.CDN.Presentation.Domain.Entities; public class MediaGroup : Entity { - + private MediaGroup() + { + + } private MediaGroup(MediaGroupTitle title, string key, bool isSecure) { + Id = new MediaGroupId(Guid.NewGuid()); Title = title; Key = key; IsSecure = isSecure; diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs index 7eeb83a..8df2ed2 100644 --- a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaGroupMedia.cs @@ -7,11 +7,15 @@ namespace Vizhtalk.CDN.Presentation.Domain.Entities; public class MediaGroupMedia : Entity { private List _mediaPermissions = new(); - + private MediaGroupMedia() + { + + } private MediaGroupMedia(FileName fileName, Media media, MediaGroup mediaGroup) { + Id = new MediaGroupMediaId(Guid.NewGuid()); Name = fileName; Media = media; MediaGroup = mediaGroup; diff --git a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaPermission.cs b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaPermission.cs index 58b4f33..7f65865 100644 --- a/Vizhtalk.CDN.Presentation/Domain/Entities/MediaPermission.cs +++ b/Vizhtalk.CDN.Presentation/Domain/Entities/MediaPermission.cs @@ -3,7 +3,7 @@ using VizhTalk.BuildingBlocks.Domain; namespace Vizhtalk.CDN.Presentation.Domain.Entities; -public class MediaPermission : Entity +public class MediaPermission : Entity { private MediaPermission() { @@ -11,6 +11,7 @@ public class MediaPermission : Entity } private MediaPermission(Media media, Client client, MediaGroupMedia mediaGroupMedia) { + Id = new MediaPermissionId(Guid.NewGuid()); Media = media; Client = client; MediaGroupMedia = mediaGroupMedia; diff --git a/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaPermissionRepository.cs similarity index 66% rename from Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs rename to Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaPermissionRepository.cs index 65494f3..00aadec 100644 --- a/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaClientRepository.cs +++ b/Vizhtalk.CDN.Presentation/Domain/Repositories/IMediaPermissionRepository.cs @@ -4,4 +4,4 @@ using VizhTalk.BuildingBlocks.Domain; namespace Vizhtalk.CDN.Presentation.Domain.Repositories; -public interface IMediaClientRepository : IRepositoryBase; +public interface IMediaPermissionRepository : IRepositoryBase; diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs index 5a0d08e..48e65a6 100644 --- a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaId.cs @@ -2,9 +2,9 @@ namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; -public class MediaId : TypeIdValueBase +public class MediaId : TypeIdValueBase { - public MediaId(long value) : base(value) + public MediaId(Guid value) : base(value) { } } diff --git a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaPermissionId.cs similarity index 50% rename from Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs rename to Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaPermissionId.cs index e63848b..83a78d8 100644 --- a/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaClientId.cs +++ b/Vizhtalk.CDN.Presentation/Domain/TypeIds/MediaPermissionId.cs @@ -2,9 +2,9 @@ namespace Vizhtalk.CDN.Presentation.Domain.TypeIds; -public class MediaClientId : TypeIdValueBase +public class MediaPermissionId : TypeIdValueBase { - public MediaClientId(long value) : base(value) + public MediaPermissionId(Guid value) : base(value) { } } diff --git a/Vizhtalk.CDN.Presentation/Files/43c185e5-d05e-4222-a17b-4a4dd544e01d/7355e439-17a9-4b78-b8c6-e1a038100357.jpg b/Vizhtalk.CDN.Presentation/Files/43c185e5-d05e-4222-a17b-4a4dd544e01d/7355e439-17a9-4b78-b8c6-e1a038100357.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/43c185e5-d05e-4222-a17b-4a4dd544e01d/7355e439-17a9-4b78-b8c6-e1a038100357.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/7c0b3fb9-8537-4898-b41c-8d7731596ffa.jpg b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/7c0b3fb9-8537-4898-b41c-8d7731596ffa.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/7c0b3fb9-8537-4898-b41c-8d7731596ffa.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/825f2831-c3b7-4b71-b70a-3157c1acfa78.jpg b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/825f2831-c3b7-4b71-b70a-3157c1acfa78.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/825f2831-c3b7-4b71-b70a-3157c1acfa78.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/8fbd8d03-d33a-4998-9326-44cb041397ca.jpg b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/8fbd8d03-d33a-4998-9326-44cb041397ca.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/8fbd8d03-d33a-4998-9326-44cb041397ca.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/a9e27453-f39c-47f2-8bc4-638ba1887abc.jpg b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/a9e27453-f39c-47f2-8bc4-638ba1887abc.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/a9e27453-f39c-47f2-8bc4-638ba1887abc.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/b0fcdcfe-570a-41cc-b30c-5120bcb625b2.jpg b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/b0fcdcfe-570a-41cc-b30c-5120bcb625b2.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/b0fcdcfe-570a-41cc-b30c-5120bcb625b2.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/bd631657-44e5-4805-a26f-c6266c579a4a.jpg b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/bd631657-44e5-4805-a26f-c6266c579a4a.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/a69c644d-a2ee-4da6-b38f-f3749f6c425c/bd631657-44e5-4805-a26f-c6266c579a4a.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Files/f028149c-f806-41ca-8a95-5878e147037b/129d412b-5cb2-4749-b284-dde8109cfa63.jpg b/Vizhtalk.CDN.Presentation/Files/f028149c-f806-41ca-8a95-5878e147037b/129d412b-5cb2-4749-b284-dde8109cfa63.jpg new file mode 100644 index 0000000..6056990 Binary files /dev/null and b/Vizhtalk.CDN.Presentation/Files/f028149c-f806-41ca-8a95-5878e147037b/129d412b-5cb2-4749-b284-dde8109cfa63.jpg differ diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs b/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs index 9fd7408..78479c9 100644 --- a/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs +++ b/Vizhtalk.CDN.Presentation/Infrastructure/CDNStartup.cs @@ -1,6 +1,8 @@ using Microsoft.EntityFrameworkCore; using MongoDB.Driver; using Vizhtalk.CDN.Presentation.Application; +using Vizhtalk.CDN.Presentation.Application.Mappers; +using Vizhtalk.CDN.Presentation.FileManagerServices; using Vizhtalk.CDN.Presentation.Infrastructure.Configuration; using Vizhtalk.CDN.Presentation.Infrastructure.EF; using VizhTalk.BuildingBlocks.Application; @@ -18,6 +20,9 @@ public static class CDNStartup { public static void Initialize(this IServiceCollection services, string connectionString, string databaseName) { + var domainNotificationsMap = new BiDictionary(); + + services.AddDbContext(options => { options.UseMongoDB(connectionString, databaseName); @@ -25,6 +30,46 @@ public static class CDNStartup services.AddScoped(sp => sp.GetService()); + services.Scan(scan => scan. + FromAssemblies(Assemblies.Application, Assemblies.Infrastructure) + .AddClasses(classes => classes.AssignableTo(typeof(ICommandHandler<>)), publicOnly: false) + .AsImplementedInterfaces() + .WithScopedLifetime() + .AddClasses(classes => classes.AssignableTo(typeof(ICommandHandler<,>)), publicOnly: false) + .AsImplementedInterfaces() + .WithScopedLifetime() + .AddClasses(classes => classes.AssignableTo(typeof(IQueryHandler<,>)), publicOnly: false) + .AsImplementedInterfaces() + .WithScopedLifetime() + .AddClasses(classes => classes.AssignableTo(typeof(ICommandHandler<>)), publicOnly: false) + .AsImplementedInterfaces() + .WithScopedLifetime()); + + services.AddScoped(); + services.AddScoped(sp => sp.GetService()); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(sp => domainNotificationsMap); + + MapperConfig.Process(); + services.AddScoped(sa => + { + var notifications = sa.GetServices(); + var notificationDic = new BiDictionary(); + foreach (var notification in notifications) + notificationDic.Add(notification!.ToString()!, notification!.GetType()); + + return notificationDic; + }); + + services.AddScoped(sa => + { + return null; // ToDo + }); } diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs index e139da9..867c083 100644 --- a/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/CDNDbContext.cs @@ -9,7 +9,7 @@ namespace Vizhtalk.CDN.Presentation.Infrastructure.EF public CDNDbContext(DbContextOptions options) : base(options) { - + Database.AutoTransactionBehavior = AutoTransactionBehavior.Never; } protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -19,6 +19,5 @@ namespace Vizhtalk.CDN.Presentation.Infrastructure.EF .ApplyConfigurationsFromAssembly(Assemblies.Infrastructure, x => x.FullName.Contains("EF.Configurations")) .PluralizeEntities(); } - } } diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs index 5d09af3..e1f3fff 100644 --- a/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs +++ b/Vizhtalk.CDN.Presentation/Infrastructure/EF/Configurations/MediaClientConfiguration.cs @@ -12,7 +12,7 @@ public class MediaClientConfiguration : IEntityTypeConfiguration x.Id); builder.Property(x => x.Id) - .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaClientId(x)); + .HasConversion(x => x.Value, x => new Domain.TypeIds.MediaPermissionId(x)); builder.Property(x => x.ClientId) diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/ClientRepository.cs b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/ClientRepository.cs new file mode 100644 index 0000000..adbc1de --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/ClientRepository.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using VizhTalk.BuildingBlocks.Infrastructure; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.Repositories +{ + public class ClientRepository : RepositoryBase, IClientRepository + { + public ClientRepository(CDNDbContext dbContext) : base(dbContext) + { + } + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaGroupMediaRepository.cs b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaGroupMediaRepository.cs new file mode 100644 index 0000000..e53315a --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaGroupMediaRepository.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using VizhTalk.BuildingBlocks.Infrastructure; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.Repositories +{ + public class MediaGroupMediaRepository : RepositoryBase, IMediaGroupMediaRepository + { + public MediaGroupMediaRepository(CDNDbContext dbContext) : base(dbContext) + { + } + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaGroupRepository.cs b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaGroupRepository.cs new file mode 100644 index 0000000..69eb9fb --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaGroupRepository.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using VizhTalk.BuildingBlocks.Infrastructure; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.Repositories +{ + public class MediaGroupRepository : RepositoryBase, IMediaGroupRepository + { + public MediaGroupRepository(CDNDbContext dbContext) : base(dbContext) + { + } + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaPermissionRepository.cs b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaPermissionRepository.cs new file mode 100644 index 0000000..db66500 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaPermissionRepository.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using VizhTalk.BuildingBlocks.Infrastructure; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.Repositories +{ + public class MediaPermissionRepository : RepositoryBase, IMediaPermissionRepository + { + public MediaPermissionRepository(CDNDbContext dbContext) : base(dbContext) + { + } + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaRepository.cs b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaRepository.cs new file mode 100644 index 0000000..10434e3 --- /dev/null +++ b/Vizhtalk.CDN.Presentation/Infrastructure/Repositories/MediaRepository.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Vizhtalk.CDN.Presentation.Domain.Entities; +using Vizhtalk.CDN.Presentation.Domain.Repositories; +using Vizhtalk.CDN.Presentation.Domain.TypeIds; +using Vizhtalk.CDN.Presentation.Infrastructure.EF; +using VizhTalk.BuildingBlocks.Infrastructure; + +namespace Vizhtalk.CDN.Presentation.Infrastructure.Repositories +{ + public class MediaRepository : RepositoryBase, IMediaRepository + { + public MediaRepository(CDNDbContext dbContext) : base(dbContext) + { + } + } +} diff --git a/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs b/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs index 6e4deb0..3638e69 100644 --- a/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs +++ b/Vizhtalk.CDN.Presentation/Infrastructure/UnitOfWork.cs @@ -3,21 +3,73 @@ using Vizhtalk.CDN.Presentation.Infrastructure.EF; using Vizhtalk.CDN.Presentation.Domain.Repositories; using VizhTalk.BuildingBlocks.Infrastructure; using VizhTalk.BuildingBlocks.Infrastructure.DomainEventsDispatching; +using Vizhtalk.CDN.Presentation.Infrastructure.Repositories; namespace Vizhtalk.CDN.Presentation.Infrastructure { public class UnitOfWork(CDNDbContext cdnDbContext, IDomainEventsDispatcher domainEventsDispatcher) - : UnitOfWorkBase(cdnDbContext, domainEventsDispatcher) + : UnitOfWorkBase(cdnDbContext, domainEventsDispatcher), IUnitOfWork { - public IMediaRepository Media => throw new NotImplementedException(); + private IMediaRepository _mediaRepository; + public IMediaRepository Media + { + get + { + if (_mediaRepository == null) + _mediaRepository = new MediaRepository(cdnDbContext); - public IClientRepository Client => throw new NotImplementedException(); + return _mediaRepository; + } + } - public IMediaClientRepository MediaClient => throw new NotImplementedException(); + private IClientRepository _clientRepository; + public IClientRepository Client + { + get + { + if(_clientRepository == null) + _clientRepository = new ClientRepository(cdnDbContext); + return _clientRepository; + } + } - public IMediaGroupRepository MediaGroup => throw new NotImplementedException(); + private IMediaPermissionRepository _mediaPermissionRepository; + public IMediaPermissionRepository MediaClient + { + get + { + if( _mediaPermissionRepository == null) + _mediaPermissionRepository = new MediaPermissionRepository(cdnDbContext); - public IMediaGroupMediaRepository MediaGroupMedia => throw new NotImplementedException(); + return _mediaPermissionRepository; + } + } + private IMediaGroupRepository _mediaGroupRepository; + public IMediaGroupRepository MediaGroup + { + get + { + if(_mediaGroupRepository == null) + _mediaGroupRepository = new MediaGroupRepository(cdnDbContext); + + return _mediaGroupRepository; + } + } + + private IMediaGroupMediaRepository _mediaGroupMediaRepository; + public IMediaGroupMediaRepository MediaGroupMedia + { + get + { + if(_mediaGroupMediaRepository == null) + _mediaGroupMediaRepository = new MediaGroupMediaRepository(cdnDbContext); + + return _mediaGroupMediaRepository; + } + } + + public async Task SaveChangeAsync(CancellationToken cancellationToken = default) + => await cdnDbContext.SaveChangesAsync(cancellationToken); } } diff --git a/Vizhtalk.CDN.Presentation/Program.cs b/Vizhtalk.CDN.Presentation/Program.cs index 1c71bd1..8b31ab0 100644 --- a/Vizhtalk.CDN.Presentation/Program.cs +++ b/Vizhtalk.CDN.Presentation/Program.cs @@ -8,9 +8,11 @@ var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("VizhTalk.CDN")!; var databaseName = builder.Configuration.GetConnectionString("VizhTalk.CDN.DatabaseName")!; -builder.Services.AddScoped(); builder.Services.Initialize(connectionString, databaseName); -builder.Services.AddGrpc(); +builder.Services.AddGrpc(op => +{ + op.MaxReceiveMessageSize = 500 * 1024 * 1024; +}); var app = builder.Build(); diff --git a/Vizhtalk.CDN.Presentation/appsettings.json b/Vizhtalk.CDN.Presentation/appsettings.json index 0eff2bd..b18730b 100644 --- a/Vizhtalk.CDN.Presentation/appsettings.json +++ b/Vizhtalk.CDN.Presentation/appsettings.json @@ -7,7 +7,7 @@ }, "ConnectionStrings": { "VizhTalk.CDN": "mongodb://localhost:27017", - "VizhTalk.CDN.DatabaseName": "VizhTalk.CDN" + "VizhTalk.CDN.DatabaseName": "VizhTalk_CDN" }, "AllowedHosts": "*" }