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
{
///
/// 保存角色
///
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 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;
}
}
}
}