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 SaveRoleCommandHandler( IRepository rep ) : IRequestHandler { private readonly IRepository rep = rep; /// public async Task Handle(SaveRoleCommand request, CancellationToken cancellationToken) { if (request.Id.HasValue) { var entity = await rep.AsQueryable() .Include(it => it.RoleMenus) .Include(it => it.RoleResources) .FirstOrDefaultAsync(it => it.Id == request.Id, cancellationToken); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "角色"); request.Adapt(entity); entity.RoleMenus = entity.RoleMenus.Where(it => request.MenuIds.Contains(it.MenuId)).ToList(); foreach (var menuId in request.MenuIds) { var entityRoleMenu = entity.RoleMenus.FirstOrDefault(it => it.MenuId == menuId); if (entityRoleMenu == null) { entityRoleMenu = new RoleMenu { MenuId = menuId }; entity.RoleMenus.Add(entityRoleMenu); } } entity.RoleResources = entity.RoleResources.Where(it => request.Resources.Any(r => r.ResourceId == it.ResourceId)).ToList(); foreach (var roleResource in entity.RoleResources) { var entityRoleResource = entity.RoleResources.FirstOrDefault(it => it.ResourceId == roleResource.ResourceId); if (entityRoleResource == null) { entityRoleResource = new RoleResource { ResourceId = roleResource.ResourceId, DataPower = roleResource.DataPower }; entity.RoleResources.Add(roleResource); } else { entityRoleResource.DataPower = roleResource.DataPower; } } await rep.UpdateAsync(entity); return entity.Id; } else { var entity = new Role(); request.Adapt(entity); entity.RoleMenus = request.MenuIds .Select(it => new RoleMenu { MenuId = it }) .ToList(); entity.RoleResources = request.Resources .Select(it => new RoleResource { ResourceId = it.ResourceId, DataPower = it.DataPower }) .ToList(); await rep.InsertAsync(entity); return entity.Id; } } } }