From 54b10d0d02564510fd15aac882628b31ecf83cc5 Mon Sep 17 00:00:00 2001 From: HosseinJavadi Date: Fri, 12 Sep 2025 20:24:44 +0430 Subject: [PATCH] . --- .../Data/IGenericDapper.cs | 1 + .../QueryHandlers/LanguageQueryHandler.cs | 19 +++++++++------ .../Dapper/GenericDapper.cs | 10 +++++++- .../Interceptors/ExceptionInterceptor.cs | 24 +++++++++++++++++++ VizhTalk.Learning.Presentation/Program.cs | 4 +++- .../Services/LanguageService.cs | 1 - 6 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 VizhTalk.Learning.Presentation/Interceptors/ExceptionInterceptor.cs diff --git a/VizhTalk.BuildingBlocks.Application/Data/IGenericDapper.cs b/VizhTalk.BuildingBlocks.Application/Data/IGenericDapper.cs index 4530abd..65c09e9 100644 --- a/VizhTalk.BuildingBlocks.Application/Data/IGenericDapper.cs +++ b/VizhTalk.BuildingBlocks.Application/Data/IGenericDapper.cs @@ -5,4 +5,5 @@ public interface IGenericDapper : IDisposable { Task GetAsync(string sql, object? param = null); Task> GetAllAsync(string sql, object? param = null); + Task CountAsync(string schema,string tableName, string where, object? param = null, string? alias = null); } diff --git a/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs b/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs index f987ccf..c48865c 100644 --- a/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs +++ b/VizhTalk.Learning.Application/QueryHandlers/LanguageQueryHandler.cs @@ -9,18 +9,23 @@ public class GetAllLanguageQueryHandler(IGenericDapper languageDapp { public async Task Handle(GetAllLanguageQuery request, CancellationToken cancellationToken) { + var where = $"@Search is null or lan.{nameof(LanguageDTO.Title)} like N'%@Search%' "; var result = new GetAllLanguageDTO(); var sql = $"select " + $"lan.{nameof(Language.Title)} as {nameof(LanguageDTO.Title)}," + $"lan.{nameof(Language.Id)} as {nameof(LanguageDTO.Id)}," + - $"m.FileId as {nameof(LanguageDTO.Icon)}" + + $"CONVERT(nvarchar(max),m.FileId) as {nameof(LanguageDTO.Icon)}" + $" from Learning.Languages as lan " + $"inner join Learning.Medias as m on m.{nameof(Media.Id)} = lan.iconId " + - $"where @Search is null or lan.{nameof(LanguageDTO.Title)} like N'%@Search%' " + - $"order by lan.{nameof(Language.CreateOn)} OFFSET {request.Pagination.Skip()} ROWS FETCH NEXT {request.Pagination.Take()} ROWS ONLY;"; + $"where {where}" + + $"order by lan.{nameof(Language.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); + result.TotalData = await languageDapper.CountAsync("Learning", "Languages", + where, + new { request.Pagination.Search },"lan"); + return result; } } @@ -31,10 +36,10 @@ public class GetLanguageByTitleQueryHandler(IGenericDapper language var sql = $"select " + $"lan.{nameof(Language.Title)} as {nameof(LanguageDTO.Title)}," + $"lan.{nameof(Language.Id)} as {nameof(LanguageDTO.Id)}," + - $"m.FileId as {nameof(LanguageDTO.Icon)}" + - $" from Learning.Languages" + - $" inner join Learning.Medias as m on {nameof(Media.Id)} = lan.iconId " + - $" where Title = @{nameof(Language.Title)}"; + $"CONVERT(nvarchar(max),m.FileId) as {nameof(LanguageDTO.Icon)}" + + $" from Learning.Languages as lan " + + $"inner join Learning.Medias as m on m.{nameof(Media.Id)} = lan.iconId " + + $"where lan.{nameof(Language.Title)} = @Title"; var language = await languageDapper.GetAsync(sql, new { request.Title }); return language; diff --git a/VizhTalk.Learning.Infrastructure/Dapper/GenericDapper.cs b/VizhTalk.Learning.Infrastructure/Dapper/GenericDapper.cs index 209704f..6818f80 100644 --- a/VizhTalk.Learning.Infrastructure/Dapper/GenericDapper.cs +++ b/VizhTalk.Learning.Infrastructure/Dapper/GenericDapper.cs @@ -21,10 +21,18 @@ public class GenericDapper : IGenericDapper { return await connection.QueryAsync(sql, param); } - + public async Task CountAsync(string schema,string tableName, string where, object? param = null, string? alias = null) + { + string query = $"select count(1) as count from {schema}.{tableName} " + + (string.IsNullOrEmpty(alias) ? "" : $"as {alias}") + + $" where {where}"; + return await connection.QueryFirstAsync(query, param); + } public void Dispose() { GC.SuppressFinalize(this); connection.Dispose(); } + + } \ No newline at end of file diff --git a/VizhTalk.Learning.Presentation/Interceptors/ExceptionInterceptor.cs b/VizhTalk.Learning.Presentation/Interceptors/ExceptionInterceptor.cs new file mode 100644 index 0000000..cc684f1 --- /dev/null +++ b/VizhTalk.Learning.Presentation/Interceptors/ExceptionInterceptor.cs @@ -0,0 +1,24 @@ +using Grpc.Core.Interceptors; +using Grpc.Core; + +namespace VizhTalk.Learning.Presentation.Interceptors; + +public class ExceptionInterceptor : Interceptor +{ + public override async Task UnaryServerHandler( + TRequest request, + ServerCallContext context, + UnaryServerMethod continuation) + { + try + { + return await continuation(request, context); + } + catch (Exception ex) + { + throw new RpcException( + new Status(StatusCode.Internal, "Unhandled exception: " + ex.Message) + ); + } + } +} diff --git a/VizhTalk.Learning.Presentation/Program.cs b/VizhTalk.Learning.Presentation/Program.cs index f048dd3..be999d5 100644 --- a/VizhTalk.Learning.Presentation/Program.cs +++ b/VizhTalk.Learning.Presentation/Program.cs @@ -1,4 +1,5 @@ using VizhTalk.Learning.Infrastructure; +using VizhTalk.Learning.Presentation.Interceptors; using VizhTalk.Learning.Presentation.Services; var builder = WebApplication.CreateBuilder(args); @@ -9,9 +10,9 @@ builder.Services.AddGrpc(op => { op.MaxReceiveMessageSize = 200 * 1024 * 1024; op.MaxSendMessageSize = 200 * 1024 * 1024; + op.Interceptors.Add(); }); builder.Services.Initialize(connectionString); - var app = builder.Build(); @@ -19,4 +20,5 @@ var app = builder.Build(); app.MapGrpcService(); app.UseLearningModule(); + app.Run(); diff --git a/VizhTalk.Learning.Presentation/Services/LanguageService.cs b/VizhTalk.Learning.Presentation/Services/LanguageService.cs index ae869e8..657ef32 100644 --- a/VizhTalk.Learning.Presentation/Services/LanguageService.cs +++ b/VizhTalk.Learning.Presentation/Services/LanguageService.cs @@ -17,7 +17,6 @@ public class LanguageService(ILearningModule learningModule) : LanguageGrpc.Lang } public override async Task GetByTitle(GetLanguageByTitleQuery request, ServerCallContext context) { - await Task.Delay(10000); return await learningModule.Execute(request, context.CancellationToken); } public override async Task GetAll(GetAllLanguageQuery request, ServerCallContext context)