using FlexJobApi.Core;
using FlexJobApi.Core.Entities.Common;
using Furion.DatabaseAccessor;
using Furion.LinqBuilder;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.CommonServer.Application
{
///
/// 跟踪Id日志查询
///
public class GetTraceIdLogQueryHandler(
IRepository repResourceLog,
IRepository repExceptionLog,
IRepository repDbAuditLog,
IRepository repUser
) :
IRequestHandler
{
private readonly IRepository repResourceLog = repResourceLog;
private readonly IRepository repExceptionLog = repExceptionLog;
private readonly IRepository repDbAuditLog = repDbAuditLog;
private readonly IRepository repUser = repUser;
///
/// 跟踪Id日志查询
///
///
///
///
public async Task Handle(GetTraceIdLogQuery request, CancellationToken cancellationToken)
{
var result = new GetTraceIdLogQueryResult();
result.ResourceLogs = await repResourceLog.AsQueryable().AsNoTracking()
.Where(it => it.TraceId == request.TraceId)
.ProjectToType()
.ToListAsync();
result.ExceptionLogs = await repExceptionLog.AsQueryable().AsNoTracking()
.Where(it => it.TraceId == request.TraceId)
.ProjectToType()
.ToListAsync();
result.DbAuditLogs = await repDbAuditLog.AsQueryable().AsNoTracking()
.Where(it => it.TraceId == request.TraceId)
.ProjectToType()
.ToListAsync();
var userIds = result.ResourceLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId)
.Union(result.ExceptionLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId))
.Union(result.DbAuditLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId));
if (userIds.IsNullOrEmpty())
{
var users = await repUser.AsQueryable().AsNoTracking()
.Where(it => userIds.Contains(it.Id))
.ProjectToType()
.ToListAsync();
foreach (var log in result.ResourceLogs)
{
if (log.CreatedUserId.HasValue)
log.CreatedUser = users.FirstOrDefault(it => it.Id == log.CreatedUserId);
}
foreach (var log in result.ExceptionLogs)
{
if (log.CreatedUserId.HasValue)
log.CreatedUser = users.FirstOrDefault(it => it.Id == log.CreatedUserId);
}
foreach (var log in result.DbAuditLogs)
{
if (log.CreatedUserId.HasValue)
log.CreatedUser = users.FirstOrDefault(it => it.Id == log.CreatedUserId);
}
}
return result;
}
}
}