.
This commit is contained in:
@@ -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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user