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.UserServer.Application
|
{
|
/// <summary>
|
/// 保存角色
|
/// </summary>
|
public class SaveRoleCommandHandler(
|
IRepository<Role> rep
|
) : IRequestHandler<SaveRoleCommand, Guid>
|
{
|
private readonly IRepository<Role> rep = rep;
|
|
/// <inheritdoc/>
|
public async Task<Guid> 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 request.Resources)
|
{
|
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(entityRoleResource);
|
}
|
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;
|
}
|
}
|
}
|
}
|