diff --git a/VizhTalk.Gateway.BFF/Models/CourseRequests.cs b/VizhTalk.Gateway.BFF/Models/CourseRequests.cs new file mode 100644 index 0000000..459132a --- /dev/null +++ b/VizhTalk.Gateway.BFF/Models/CourseRequests.cs @@ -0,0 +1,6 @@ +using VizhTalk.Grpc.Learning; + +namespace VizhTalk.Gateway.Web.BFF.Models; + +public record CreateCourseRequest(string title, string description, IFile image, Id languageid); +public record UpdateCourseRequest(Id id, string title, string description, Int32 order, IFile image, Id languageid); \ No newline at end of file diff --git a/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs b/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs deleted file mode 100644 index 49a3a4c..0000000 --- a/VizhTalk.Gateway.BFF/Mutations/LanguageMutation.cs +++ /dev/null @@ -1,38 +0,0 @@ -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; - -public class LanguageMutation(LanguageGrpc.LanguageGrpcClient client) -{ - [GraphQLName("CreateLanguage")] - 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(UpdateLanguageRequest request) - { - UploadFile file = null; - if(request.Icon != null) - { - file = await request.Icon.AsFile(); - } - return await client.UpdateAsync(new UpdateLanguageCommand() - { - Id = new Id() - { - Value = request.Id.Value - }, - Title = request.Title, - Icon = file - }); - } -} diff --git a/VizhTalk.Gateway.BFF/Mutations/Mutation.cs b/VizhTalk.Gateway.BFF/Mutations/Mutation.cs new file mode 100644 index 0000000..b96ec63 --- /dev/null +++ b/VizhTalk.Gateway.BFF/Mutations/Mutation.cs @@ -0,0 +1,74 @@ +using VizhTalk.Gateway.Web.BFF.Mappers; +using VizhTalk.Gateway.Web.BFF.Models; +using VizhTalk.Grpc.Learning; +using VizhTalk.Grpc.Learning.Course; +using VizhTalk.Grpc.Learning.Language; + +namespace VizhTalk.Gateway.Web.BFF.Mutations; + +public class Mutation(LanguageGrpc.LanguageGrpcClient languageClient, + CourseGrpc.CourseGrpcClient courseClient) +{ + [GraphQLName("CreateLanguage")] + public async Task CreateLanguage(CreateLanguageRequest request) + { + return await languageClient.CreateAsync(new CreateLanguageCommand() + { + Title = request.Title, + Icon = await request.Icon.AsFile() + }); + } + + [GraphQLName("UpdateLanguage")] + public async Task UpdateLanguage(UpdateLanguageRequest request) + { + UploadFile file = null; + if (request.Icon != null) + { + file = await request.Icon.AsFile(); + } + return await languageClient.UpdateAsync(new UpdateLanguageCommand() + { + Id = new Id() + { + Value = request.Id.Value + }, + Title = request.Title, + Icon = file + }); + } + + [GraphQLName("CreateCourse")] + public async Task CreateCourse(CreateCourseRequest input) + { + return await courseClient.CreateAsync(new CreateCourseCommand() + { + Title = input.title, + Image = await input.image.AsFile(), + Description = input.description, + Languageid = input.languageid + }); + } + + [GraphQLName("UpdateCourse")] + public async Task UpdateCourse(UpdateCourseRequest input) + { + UploadFile file = null; + if (input.image != null) + { + file = await input.image.AsFile(); + } + return await courseClient.UpdateAsync(new UpdateCourseCommand() + { + Id = new Id() + { + Value = input.id.Value + }, + Order = input.order, + Title = input.title, + Image = file, + Description = input.description, + Languageid = input.languageid + }); + } +} diff --git a/VizhTalk.Gateway.BFF/Program.cs b/VizhTalk.Gateway.BFF/Program.cs index 0b38f4b..aedb85a 100644 --- a/VizhTalk.Gateway.BFF/Program.cs +++ b/VizhTalk.Gateway.BFF/Program.cs @@ -1,5 +1,6 @@ using VizhTalk.Gateway.Web.BFF.Mutations; using VizhTalk.Gateway.Web.BFF.Queries; +using VizhTalk.Grpc.Learning.Course; using VizhTalk.Grpc.Learning.Language; var builder = WebApplication.CreateBuilder(args); @@ -8,12 +9,18 @@ builder.Services.AddGrpcClient(o => o.Address = new Uri("https://localhost:5000"); }); -builder.Services.AddScoped(); -builder.Services.AddScoped(); +builder.Services.AddGrpcClient(o => +{ + o.Address = new Uri("https://localhost:5000"); +}); + + +builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.AddGraphQL() - .AddQueryType() - .AddMutationType() + .AddQueryType() + .AddMutationType() .AddType() .AddMutationConventions(); diff --git a/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs b/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs deleted file mode 100644 index f884645..0000000 --- a/VizhTalk.Gateway.BFF/Queries/LanguageQuery.cs +++ /dev/null @@ -1,15 +0,0 @@ -using VizhTalk.Grpc.Learning.Language; - -namespace VizhTalk.Gateway.Web.BFF.Queries -{ - public class LanguageQuery(LanguageGrpc.LanguageGrpcClient client) - { - [GraphQLName("Languages")] - public async Task GetAllLanguage(GetAllLanguageQuery request) - => await client.GetAllAsync(request); - - [GraphQLName("LanguageByTitle")] - public async Task GetLanguageByTitle(GetLanguageByTitleQuery request) - => await client.GetByTitleAsync(request); - } -} diff --git a/VizhTalk.Gateway.BFF/Queries/Query.cs b/VizhTalk.Gateway.BFF/Queries/Query.cs new file mode 100644 index 0000000..0044454 --- /dev/null +++ b/VizhTalk.Gateway.BFF/Queries/Query.cs @@ -0,0 +1,14 @@ +using VizhTalk.Grpc.Learning.Language; + +namespace VizhTalk.Gateway.Web.BFF.Queries; + +public class Query(LanguageGrpc.LanguageGrpcClient client) +{ + [GraphQLName("Languages")] + public async Task GetAllLanguage(GetAllLanguageQuery request) + => await client.GetAllAsync(request); + + [GraphQLName("LanguageByTitle")] + public async Task GetLanguageByTitle(GetLanguageByTitleQuery request) + => await client.GetByTitleAsync(request); +} diff --git a/VizhTalk.Learning.Presentation/Services/CourseService.cs b/VizhTalk.Learning.Presentation/Services/CourseService.cs new file mode 100644 index 0000000..3f70880 --- /dev/null +++ b/VizhTalk.Learning.Presentation/Services/CourseService.cs @@ -0,0 +1,32 @@ +using Grpc.Core; +using VizhTalk.Grpc.Learning.Course; +using VizhTalk.Learning.Infrastructure.Configuration; + +namespace VizhTalk.Learning.Presentation.Services; + +public class CourseService(ILearningModule learningModule) : CourseGrpc.CourseGrpcBase +{ + public override async Task Create(CreateCourseCommand request, ServerCallContext context) + { + return await learningModule.Execute(request, context.CancellationToken); + } + public async override Task Update(UpdateCourseCommand request, ServerCallContext context) + { + return await learningModule.Execute(request, context.CancellationToken); + } + + public async override Task GetAll(GetAllCourseQuery request, ServerCallContext context) + { + return await learningModule.Execute(request, context.CancellationToken); + } + + public async override Task GetById(GetCourseByIdQuery request, ServerCallContext context) + { + return await learningModule.Execute(request, context.CancellationToken); + } + + public async override Task GetByTitle(GetCoursesByTitleQuery request, ServerCallContext context) + { + return await learningModule.Execute(request, context.CancellationToken); + } +} diff --git a/VizhTalk.Learning.Presentation/appsettings.json b/VizhTalk.Learning.Presentation/appsettings.json index 3be2392..082606d 100644 --- a/VizhTalk.Learning.Presentation/appsettings.json +++ b/VizhTalk.Learning.Presentation/appsettings.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "LearningDB": "Server=.; Database=VizhTalk.Learning; Trusted_Connection=True; MultipleActiveResultSets=true;TrustServerCertificate=True;" + "LearningDB": "Server=.\\SQLEXPRESS; Database=VizhTalk.Learning; Trusted_Connection=True; MultipleActiveResultSets=true;TrustServerCertificate=True;" }, "AllowedHosts": "*", "Kestrel": { diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto index 7db57af..f1595af 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/DTOs.proto @@ -10,6 +10,7 @@ message CourseDTO { Id languageId = 2; string title = 3; string image = 4; + string description = 5; } diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto index 46860dd..2599931 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Queries.proto @@ -9,7 +9,7 @@ import "Proto/Shared.proto"; message GetAllCourseQuery{ Pagination pagination = 1; } -message GetCourseByTitleQuery{ +message GetCoursesByTitleQuery{ string title = 1; } diff --git a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto index b42454e..84675ce 100644 --- a/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto +++ b/VizhTalk.Services.Grpc.Learning/Proto/Courses/Services.proto @@ -17,6 +17,6 @@ service CourseGrpc { rpc Create (CreateCourseCommand) returns (CourseDTO); rpc Update (UpdateCourseCommand) returns (CourseDTO); rpc GetAll (GetAllCourseQuery) returns (GetAllCourseDTO); - rpc GetByTitle (GetCourseByTitleQuery) returns (CourseDTO); + rpc GetByTitle (GetCoursesByTitleQuery) returns (CourseDTO); rpc GetById (GetCourseByIdQuery) returns (CourseDTO); } \ No newline at end of file diff --git a/VizhTalk.Services.Grpc.Learning/Queries/CourseQueries.cs b/VizhTalk.Services.Grpc.Learning/Queries/CourseQueries.cs new file mode 100644 index 0000000..b32453c --- /dev/null +++ b/VizhTalk.Services.Grpc.Learning/Queries/CourseQueries.cs @@ -0,0 +1,10 @@ +using VizhTalk.BuildingBlocks.Domain.Contract; + +namespace VizhTalk.Grpc.Learning.Course; + +public sealed partial class GetAllCourseQuery : IQuery; +public sealed partial class GetCoursesByTitleQuery : IQuery; +public sealed partial class GetCourseByIdQuery : IQuery; + + +