This commit is contained in:
2025-09-12 20:24:44 +04:30
parent c52cdc17a2
commit 54b10d0d02
6 changed files with 49 additions and 10 deletions
@@ -5,4 +5,5 @@ public interface IGenericDapper<T> : IDisposable
{ {
Task<T?> GetAsync(string sql, object? param = null); Task<T?> GetAsync(string sql, object? param = null);
Task<IEnumerable<T>> GetAllAsync(string sql, object? param = null); Task<IEnumerable<T>> GetAllAsync(string sql, object? param = null);
Task<int> CountAsync(string schema,string tableName, string where, object? param = null, string? alias = null);
} }
@@ -9,18 +9,23 @@ public class GetAllLanguageQueryHandler(IGenericDapper<LanguageDTO> languageDapp
{ {
public async Task<GetAllLanguageDTO> Handle(GetAllLanguageQuery request, CancellationToken cancellationToken) public async Task<GetAllLanguageDTO> Handle(GetAllLanguageQuery request, CancellationToken cancellationToken)
{ {
var where = $"@Search is null or lan.{nameof(LanguageDTO.Title)} like N'%@Search%' ";
var result = new GetAllLanguageDTO(); var result = new GetAllLanguageDTO();
var sql = $"select " + var sql = $"select " +
$"lan.{nameof(Language.Title)} as {nameof(LanguageDTO.Title)}," + $"lan.{nameof(Language.Title)} as {nameof(LanguageDTO.Title)}," +
$"lan.{nameof(Language.Id)} as {nameof(LanguageDTO.Id)}," + $"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 " + $" from Learning.Languages as lan " +
$"inner join Learning.Medias as m on m.{nameof(Media.Id)} = lan.iconId " + $"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%' " + $"where {where}" +
$"order by lan.{nameof(Language.CreateOn)} OFFSET {request.Pagination.Skip()} ROWS FETCH NEXT {request.Pagination.Take()} ROWS ONLY;"; $"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 }); var language = await languageDapper.GetAllAsync(sql, new { request.Pagination.Search });
result.Languages.AddRange(language); result.Languages.AddRange(language);
result.TotalData = await languageDapper.CountAsync("Learning", "Languages",
where,
new { request.Pagination.Search },"lan");
return result; return result;
} }
} }
@@ -31,10 +36,10 @@ public class GetLanguageByTitleQueryHandler(IGenericDapper<LanguageDTO> language
var sql = $"select " + var sql = $"select " +
$"lan.{nameof(Language.Title)} as {nameof(LanguageDTO.Title)}," + $"lan.{nameof(Language.Title)} as {nameof(LanguageDTO.Title)}," +
$"lan.{nameof(Language.Id)} as {nameof(LanguageDTO.Id)}," + $"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" + $" from Learning.Languages as lan " +
$" inner join Learning.Medias as m on {nameof(Media.Id)} = lan.iconId " + $"inner join Learning.Medias as m on m.{nameof(Media.Id)} = lan.iconId " +
$" where Title = @{nameof(Language.Title)}"; $"where lan.{nameof(Language.Title)} = @Title";
var language = await languageDapper.GetAsync(sql, new { request.Title }); var language = await languageDapper.GetAsync(sql, new { request.Title });
return language; return language;
@@ -21,10 +21,18 @@ public class GenericDapper<T> : IGenericDapper<T>
{ {
return await connection.QueryAsync<T>(sql, param); return await connection.QueryAsync<T>(sql, param);
} }
public async Task<int> 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<int>(query, param);
}
public void Dispose() public void Dispose()
{ {
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
connection.Dispose(); connection.Dispose();
} }
} }
@@ -0,0 +1,24 @@
using Grpc.Core.Interceptors;
using Grpc.Core;
namespace VizhTalk.Learning.Presentation.Interceptors;
public class ExceptionInterceptor : Interceptor
{
public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
TRequest request,
ServerCallContext context,
UnaryServerMethod<TRequest, TResponse> continuation)
{
try
{
return await continuation(request, context);
}
catch (Exception ex)
{
throw new RpcException(
new Status(StatusCode.Internal, "Unhandled exception: " + ex.Message)
);
}
}
}
+3 -1
View File
@@ -1,4 +1,5 @@
using VizhTalk.Learning.Infrastructure; using VizhTalk.Learning.Infrastructure;
using VizhTalk.Learning.Presentation.Interceptors;
using VizhTalk.Learning.Presentation.Services; using VizhTalk.Learning.Presentation.Services;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -9,9 +10,9 @@ builder.Services.AddGrpc(op =>
{ {
op.MaxReceiveMessageSize = 200 * 1024 * 1024; op.MaxReceiveMessageSize = 200 * 1024 * 1024;
op.MaxSendMessageSize = 200 * 1024 * 1024; op.MaxSendMessageSize = 200 * 1024 * 1024;
op.Interceptors.Add<ExceptionInterceptor>();
}); });
builder.Services.Initialize(connectionString); builder.Services.Initialize(connectionString);
var app = builder.Build(); var app = builder.Build();
@@ -19,4 +20,5 @@ var app = builder.Build();
app.MapGrpcService<LanguageService>(); app.MapGrpcService<LanguageService>();
app.UseLearningModule(); app.UseLearningModule();
app.Run(); app.Run();
@@ -17,7 +17,6 @@ public class LanguageService(ILearningModule learningModule) : LanguageGrpc.Lang
} }
public override async Task<LanguageDTO> GetByTitle(GetLanguageByTitleQuery request, ServerCallContext context) public override async Task<LanguageDTO> GetByTitle(GetLanguageByTitleQuery request, ServerCallContext context)
{ {
await Task.Delay(10000);
return await learningModule.Execute(request, context.CancellationToken); return await learningModule.Execute(request, context.CancellationToken);
} }
public override async Task<GetAllLanguageDTO> GetAll(GetAllLanguageQuery request, ServerCallContext context) public override async Task<GetAllLanguageDTO> GetAll(GetAllLanguageQuery request, ServerCallContext context)