diff --git a/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs b/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs new file mode 100644 index 0000000..c79db7f --- /dev/null +++ b/VizhTalk.Gateway.BFF/Mappers/UploadMapper.cs @@ -0,0 +1,20 @@ +using Google.Protobuf; +using VizhTalk.Grpc.Learning; + +namespace VizhTalk.Gateway.Web.BFF.Mappers +{ + public static class UploadMapper + { + public static async Task AsFile(this IFile file) + { + MemoryStream stream = new MemoryStream(); + await file.CopyToAsync(stream); + return new UploadFile() + { + ContentType = file.ContentType, + File = ByteString.FromStream(stream), + Name = file.Name, + }; + } + } +} diff --git a/VizhTalk.Gateway.BFF/Models/IdRequest.cs b/VizhTalk.Gateway.BFF/Models/IdRequest.cs new file mode 100644 index 0000000..02f5de0 --- /dev/null +++ b/VizhTalk.Gateway.BFF/Models/IdRequest.cs @@ -0,0 +1,3 @@ +namespace VizhTalk.Gateway.Web.BFF.Models; + +public record IdRequest(string Value); \ No newline at end of file diff --git a/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs b/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs new file mode 100644 index 0000000..ab6e139 --- /dev/null +++ b/VizhTalk.Gateway.BFF/Models/LanguageRequests.cs @@ -0,0 +1,4 @@ +namespace VizhTalk.Gateway.Web.BFF.Models; + +public record CreateLanguageRequest(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 1ac1559..eda605b 100644 --- a/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs +++ b/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs @@ -1,4 +1,6 @@ -using VizhTalk.Grpc.Learning; +using VizhTalk.Gateway.Web.BFF.Mappers; +using VizhTalk.Gateway.Web.BFF.Models; +using VizhTalk.Grpc.Learning; using VizhTalk.Grpc.Learning.Language; namespace VizhTalk.Gateway.Web.BFF.Mutations; @@ -6,10 +8,23 @@ namespace VizhTalk.Gateway.Web.BFF.Mutations; public class LanguageMutation(LanguageGrpc.LanguageGrpcClient client) { [GraphQLName("CreateLanguage")] - public async Task CreateLanguage(CreateLanguageCommand request) - => await client.CreateAsync(request); + public async Task CreateLanguage(CreateLanguageRequest request) + { + return await client.CreateAsync(new CreateLanguageCommand() + { + Title = request.Title, + Icon = await request.Icon.AsFile() + }); + } [GraphQLName("UpdateLanguage")] - public async Task UpdateLanguage(UpdateLanguageCommand request) - => await client.UpdateAsync(request); + public async Task UpdateLanguage(UpdateLanguageRequest request) + { + return await client.UpdateAsync(new UpdateLanguageCommand() + { + Id = new Id(request.Id.Value), + Title = request.Title, + Icon = await request.Icon.AsFile() + }); + } } diff --git a/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs b/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs index 34210c0..f884645 100644 --- a/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs +++ b/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs @@ -5,8 +5,8 @@ namespace VizhTalk.Gateway.Web.BFF.Queries public class LanguageQuery(LanguageGrpc.LanguageGrpcClient client) { [GraphQLName("Languages")] - public async Task GetAllLanguage() - => await client.GetAllAsync(new GetAllLanguageQuery()); + public async Task GetAllLanguage(GetAllLanguageQuery request) + => await client.GetAllAsync(request); [GraphQLName("LanguageByTitle")] public async Task GetLanguageByTitle(GetLanguageByTitleQuery request) diff --git a/VizhTalk.Gateway.BFF/VizhTalk.Gateway.Web.BFF.csproj b/VizhTalk.Gateway.BFF/VizhTalk.Gateway.Web.BFF.csproj index bfd724f..c0dafaa 100644 --- a/VizhTalk.Gateway.BFF/VizhTalk.Gateway.Web.BFF.csproj +++ b/VizhTalk.Gateway.BFF/VizhTalk.Gateway.Web.BFF.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/VizhTalk.Grpc.CDN/Commands.proto b/VizhTalk.Grpc.CDN/Commands.proto index c7449ec..32d5c17 100644 --- a/VizhTalk.Grpc.CDN/Commands.proto +++ b/VizhTalk.Grpc.CDN/Commands.proto @@ -7,7 +7,7 @@ package greet; import "DTOs.proto"; message UploadFileCommand{ - bytes file = 1; + UploadFile file = 1; Id mediaGroupId = 2; string clientId = 3; string fileName = 4; @@ -16,4 +16,9 @@ message CreateMediaGroupCommand{ string key = 1; bool isSecure = 2; string title = 3; +} +message UploadFile{ + bytes file=1; + string name = 2; + string contentType = 3; } \ No newline at end of file diff --git a/VizhTalk.Grpc.Shared/VizhTalk.Grpc.Shared.csproj b/VizhTalk.Grpc.Shared/VizhTalk.Grpc.Shared.csproj new file mode 100644 index 0000000..6a6bdd3 --- /dev/null +++ b/VizhTalk.Grpc.Shared/VizhTalk.Grpc.Shared.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs b/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs index cea7655..9472dcd 100644 --- a/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs +++ b/VizhTalk.Learning.Application/CommandHandlers/LanguageCommandHandler.cs @@ -41,7 +41,12 @@ public class CreateLanguageCommandHandler(IUnitOfWork unitOfWork, } var upload = await cdnClient.UploadFileAsync(new UploadFileCommand() { - File = request.Icon, + File = new Grpc.CDN.UploadFile() + { + ContentType = request.Icon.ContentType, + File = request.Icon.File, + Name = request.Icon.Name, + }, FileName = title, MediaGroupId = fileGroup.MediaGroupId }, cancellationToken: cancellationToken); @@ -77,7 +82,12 @@ public class UpdateLanguageCommandHandler(IUnitOfWork unitOfWork, CDNGrpc.CDNGrp var upload = await cdnClient.UploadFileAsync(new UploadFileCommand() { - File = request.Icon, + File = new Grpc.CDN.UploadFile() + { + ContentType = request.Icon.ContentType, + File = request.Icon.File, + Name = request.Icon.Name, + }, FileName = request.Title, MediaGroupId = fileGroup.MediaGroupId }, cancellationToken: cancellationToken); diff --git a/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs b/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs index bae2988..0ca263c 100644 --- a/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs +++ b/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs @@ -10,8 +10,11 @@ public class GetAllLanguageQueryHandler(IGenericDapper languageDapp public async Task Handle(GetAllLanguageQuery request, CancellationToken cancellationToken) { var result = new GetAllLanguageDTO(); - var sql = $"select * from Learning.Languages"; - var language = await languageDapper.GetAllAsync(sql); + var sql = $"select * from Learning.Languages " + + $"where @Search is null or {nameof(LanguageDTO.Title)} like N'%@Search%' " + + $"order by createOn OFFSET {request.Pagination.Skip()} ROWS FETCH NEXT {request.Pagination.Take()} ROWS ONLY;"; + + var language = await languageDapper.GetAllAsync(sql, new { request.Pagination.Search }); result.Languages.AddRange(language); return result; } diff --git a/VizhTalk.Learning.Domain/Entities/Language.cs b/VizhTalk.Learning.Domain/Entities/Language.cs index 176c207..5266932 100644 --- a/VizhTalk.Learning.Domain/Entities/Language.cs +++ b/VizhTalk.Learning.Domain/Entities/Language.cs @@ -41,6 +41,18 @@ public class Language : Entity, IAggregateRoot public Course UpdateCourse(Course course) { var _course = _courses.FirstOrDefault(x => x.Id == course.Id) ?? throw new CourseNotFoundException(Title); - throw new Exception(); + if(course.Image != null) + _course.SetImage(course.Image); + _course.SetTitle(course.Title); + + if(_course.Order != course.Order) + { + var orderCourses = _courses.Where(x => x.Id != course.Id) + .OrderBy(x => x.Order) + .ToList(); + _course.SetOrder(_course.Order); + orderCourses.Insert(course.Order, _course); + } + return _course; } } diff --git a/VizhTalk.Learning.Infrastructure/EF/Configurations/CourseConfiguration.cs b/VizhTalk.Learning.Infrastructure/EF/Configurations/CourseConfiguration.cs new file mode 100644 index 0000000..9950c94 --- /dev/null +++ b/VizhTalk.Learning.Infrastructure/EF/Configurations/CourseConfiguration.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using VizhTalk.Learning.Domain.Entities; + +namespace VizhTalk.Learning.Infrastructure.EF.Configurations +{ + internal class CourseConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(name: nameof(Course), Schema.Learning); + builder.HasKey(x => x.Id); + + builder.Property(x => x.Id) + .ValueGeneratedOnAdd() + .HasConversion(x => x.Value, x => new Domain.TypeIds.CourseId(x)); + + builder.Property(x => x.Title) + .HasConversion(x => x.Value, x => new(x)); + + } + } +} diff --git a/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.Designer.cs b/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.Designer.cs new file mode 100644 index 0000000..28fdedb --- /dev/null +++ b/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.Designer.cs @@ -0,0 +1,245 @@ +// +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("20250907192005_Course")] + partial class Course + { + /// + 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.Course", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreateOn") + .HasColumnType("datetime2"); + + b.Property("ImageId") + .HasColumnType("uniqueidentifier"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LanguageId") + .HasColumnType("smallint"); + + b.Property("LastUpdate") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ImageId"); + + b.HasIndex("LanguageId"); + + b.ToTable("Courses", "Learning"); + }); + + 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.Course", b => + { + b.HasOne("VizhTalk.Learning.Domain.Entities.Media", "Image") + .WithMany() + .HasForeignKey("ImageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VizhTalk.Learning.Domain.Entities.Language", null) + .WithMany("Courses") + .HasForeignKey("LanguageId"); + + b.Navigation("Image"); + }); + + 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(); + }); + + modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Language", b => + { + b.Navigation("Courses"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.cs b/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.cs new file mode 100644 index 0000000..2064af4 --- /dev/null +++ b/VizhTalk.Learning.Infrastructure/Migrations/20250907192005_Course.cs @@ -0,0 +1,69 @@ +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/LearningDbContextModelSnapshot.cs b/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs index 7d6f536..a1cb65b 100644 --- a/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs +++ b/VizhTalk.Learning.Infrastructure/Migrations/LearningDbContextModelSnapshot.cs @@ -23,6 +23,48 @@ namespace VizhTalk.Learning.Infrastructure.Migrations SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Course", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreateOn") + .HasColumnType("datetime2"); + + b.Property("ImageId") + .HasColumnType("uniqueidentifier"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LanguageId") + .HasColumnType("smallint"); + + b.Property("LastUpdate") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ImageId"); + + b.HasIndex("LanguageId"); + + b.ToTable("Courses", "Learning"); + }); + modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.FileGroup", b => { b.Property("Id") @@ -134,6 +176,21 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.ToTable("Medias", "Learning"); }); + modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Course", b => + { + b.HasOne("VizhTalk.Learning.Domain.Entities.Media", "Image") + .WithMany() + .HasForeignKey("ImageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("VizhTalk.Learning.Domain.Entities.Language", null) + .WithMany("Courses") + .HasForeignKey("LanguageId"); + + b.Navigation("Image"); + }); + modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Language", b => { b.HasOne("VizhTalk.Learning.Domain.Entities.Media", "Icon") @@ -174,6 +231,11 @@ namespace VizhTalk.Learning.Infrastructure.Migrations b.Navigation("EntityType") .IsRequired(); }); + + modelBuilder.Entity("VizhTalk.Learning.Domain.Entities.Language", b => + { + b.Navigation("Courses"); + }); #pragma warning restore 612, 618 } } diff --git a/VizhTalk.Services.Grpc.Learning/Pagination.cs b/VizhTalk.Services.Grpc.Learning/Pagination.cs new file mode 100644 index 0000000..2e3b9d1 --- /dev/null +++ b/VizhTalk.Services.Grpc.Learning/Pagination.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VizhTalk.Grpc.Learning +{ + public sealed partial class Pagination + { + public int Skip() + => PageNumber * (PageSize == 0 ? 10 : PageSize); + public int Take() + => PageNumber; + } +} diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Commands.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Commands.proto new file mode 100644 index 0000000..47c08ed --- /dev/null +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Commands.proto @@ -0,0 +1,18 @@ +syntax="proto3"; + +option csharp_namespace="VizhTalk.Grpc.Learning.Course"; + +package greet; +import "Proto/Shared.proto"; + + +message CreateCourseCommand{ + string title = 1; + bytes icon = 2; +} + +message UpdateCourseCommand{ + Id Id = 1; + string title = 2; + optional bytes icon = 3; +} \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto new file mode 100644 index 0000000..e437f07 --- /dev/null +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto @@ -0,0 +1,17 @@ +syntax="proto3"; + +option csharp_namespace="VizhTalk.Grpc.Learning.Course"; + +package greet; +import "Proto/Shared.proto"; + +message CourseDTO { + Id Id = 1; + string title = 2; +} + + +message GetAllCourseDTO{ + repeated CourseDTO Courses =1; + int32 totalData = 2; +} \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto new file mode 100644 index 0000000..46860dd --- /dev/null +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto @@ -0,0 +1,18 @@ +syntax="proto3"; + +option csharp_namespace="VizhTalk.Grpc.Learning.Course"; + +package greet; + +import "Proto/Shared.proto"; + +message GetAllCourseQuery{ + Pagination pagination = 1; +} +message GetCourseByTitleQuery{ + string title = 1; +} + +message GetCourseByIdQuery{ + Id id=1; +} \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto new file mode 100644 index 0000000..b42454e --- /dev/null +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto @@ -0,0 +1,22 @@ +syntax="proto3"; + +option csharp_namespace="VizhTalk.Grpc.Learning.Course"; + +package greet; + +import "Proto/Courses/DTOs.proto"; +import "Proto/Courses/Queries.proto"; +import "Proto/Courses/Commands.proto"; +import "Proto/Shared.proto"; + + + + + +service CourseGrpc { + rpc Create (CreateCourseCommand) returns (CourseDTO); + rpc Update (UpdateCourseCommand) returns (CourseDTO); + rpc GetAll (GetAllCourseQuery) returns (GetAllCourseDTO); + rpc GetByTitle (GetCourseByTitleQuery) returns (CourseDTO); + rpc GetById (GetCourseByIdQuery) returns (CourseDTO); +} \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Languages/Commands.proto b/VizhTalk.Services.Grpc.Learning/Proto/Languages/Commands.proto index 46575e8..ef977c3 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Languages/Commands.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Languages/Commands.proto @@ -8,11 +8,11 @@ import "Proto/Shared.proto"; message CreateLanguageCommand{ string title = 1; - bytes icon = 2; + UploadFile icon = 2; } message UpdateLanguageCommand{ Id Id = 1; string title = 2; - optional bytes icon = 3; + optional UploadFile icon = 3; } \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Languages/DTOs.proto b/VizhTalk.Services.Grpc.Learning/Proto/Languages/DTOs.proto index c895ba8..44cd721 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Languages/DTOs.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Languages/DTOs.proto @@ -13,4 +13,5 @@ message LanguageDTO { message GetAllLanguageDTO{ repeated LanguageDTO languages =1; + int32 totalData = 2; } \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Languages/Queries.proto b/VizhTalk.Services.Grpc.Learning/Proto/Languages/Queries.proto index 3229a3f..60cacf2 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Languages/Queries.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Languages/Queries.proto @@ -7,6 +7,7 @@ package greet; import "Proto/Shared.proto"; message GetAllLanguageQuery{ + Pagination pagination = 1; } message GetLanguageByTitleQuery{ string title = 1; diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Shared.proto b/VizhTalk.Services.Grpc.Learning/Proto/Shared.proto index 3126306..2735baa 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Shared.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Shared.proto @@ -1,6 +1,7 @@ syntax="proto3"; option csharp_namespace="VizhTalk.Grpc.Learning"; +import "google/protobuf/wrappers.proto"; package greet; @@ -9,4 +10,14 @@ message Empty{ } message Id{ string value = 1; +} +message Pagination{ + int32 pageSize = 1; + int32 pageNumber = 2; + google.protobuf.StringValue search = 3; +} +message UploadFile{ + bytes file=1; + string name = 2; + string contentType = 3; } \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/VizhTalk.Grpc.Learning.csproj b/VizhTalk.Services.Grpc.Learning/VizhTalk.Grpc.Learning.csproj index b33986d..0a28364 100644 --- a/VizhTalk.Services.Grpc.Learning/VizhTalk.Grpc.Learning.csproj +++ b/VizhTalk.Services.Grpc.Learning/VizhTalk.Grpc.Learning.csproj @@ -5,6 +5,13 @@ enable enable + + + + + + + @@ -14,6 +21,10 @@ + + + + diff --git a/VizhTalk.sln b/VizhTalk.sln index c161eb8..d4a6fcc 100644 --- a/VizhTalk.sln +++ b/VizhTalk.sln @@ -49,7 +49,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VizhTalk.Gateway.Web.BFF", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vizhtalk.CDN.Presentation", "Vizhtalk.CDN.Presentation\Vizhtalk.CDN.Presentation.csproj", "{F6FDEF63-77D7-47AC-A5F5-2EB59D230158}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VizhTalk.Grpc.CDN", "VizhTalk.Grpc.CDN\VizhTalk.Grpc.CDN.csproj", "{312291A0-6180-4F89-97C5-8D327BE5DE09}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VizhTalk.Grpc.CDN", "VizhTalk.Grpc.CDN\VizhTalk.Grpc.CDN.csproj", "{312291A0-6180-4F89-97C5-8D327BE5DE09}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution