using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.FriendlyException; 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.User.Application { /// /// 获取当前登录用户菜单详情 /// public class GetCurrentLogierMenuQueryHandler( IRepository repMenu, IRepository repRoleMenu, IRepository repUserInfoRole ) : IRequestHandler { private readonly IRepository repMenu = repMenu; private readonly IRepository repRoleMenu = repRoleMenu; private readonly IRepository repUserInfoRole = repUserInfoRole; /// public async Task Handle(GetCurrentLogierMenuQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var model = await repMenu.AsQueryable().AsNoTracking() .Where(it => it.Id == request.Id) .ProjectToType() .FirstOrDefaultAsync(cancellationToken); if (model == null) throw Oops.Oh(EnumErrorCodeType.s404, "该菜单"); var items = await (from m in repMenu.AsQueryable().AsNoTracking() join rm in repRoleMenu.AsQueryable().AsNoTracking() on m.Id equals rm.MenuId into rmg from rmgi in rmg.DefaultIfEmpty() join ur in repUserInfoRole.AsQueryable().AsNoTracking() on rmgi.RoleId equals ur.RoleId into urg from urgi in urg.DefaultIfEmpty() where m.ParentId == request.Id && (logier.Level == 999 || urgi.UserInfoId == logier.UserInfoId) && !m.IsDisabled && (m.Type == EnumMenuType.Button || m.Type == EnumMenuType.Field) select m).ProjectToType().ToListAsync(cancellationToken); model.Groups = items.GroupBy(it => it.Group ?? "default") .Select(it => new GetMenuQueryResultGroup { Group = it.Key, ButtonLocations = it .Where(l => l.Type == EnumMenuType.Button) .GroupBy(l => l.Location ?? "default") .Select(l => new GetMenuQueryResultButtonLocation { Location = l.Key, Buttons = l .ToList() .Adapt>() }) .ToList(), Fields = it .Where(f => f.Type == EnumMenuType.Field) .ToList() .Adapt>() }) .ToList(); return model; } } }