153 lines
6.0 KiB
C#
153 lines
6.0 KiB
C#
using Avalonia;
|
||
using Cowain.Base.DBContext;
|
||
using Cowain.Base.Helpers;
|
||
using Cowain.Base.IServices;
|
||
using Cowain.Base.Models;
|
||
using Cowain.Base.Models.Admins;
|
||
using Cowain.Base.Models.Menu;
|
||
using Cowain.Base.ViewModels;
|
||
using Ke.Bee.Localization.Localizer.Abstractions;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using System.Collections.Generic;
|
||
using System.Collections.ObjectModel;
|
||
using System.Text.Json;
|
||
using MenuItem = Cowain.Base.Models.Menu.MenuItem;
|
||
|
||
namespace Cowain.Base.Services;
|
||
|
||
public class UserRoleMenuService : BaseService, IUserRoleMenuService
|
||
{
|
||
/// <summary>
|
||
/// 菜单数据
|
||
/// </summary>
|
||
private readonly List<MenuItem> _menuItems;
|
||
private readonly PageViewMenuHelper _pageMenuHelper;
|
||
public UserRoleMenuService(IDbContextFactory<SqlDbContext> dbContextFactory, PageViewMenuHelper pageMenuHelper, MenuConfigurationContext menuContext) : base(dbContextFactory)
|
||
{
|
||
_menuItems = menuContext.Menus;
|
||
_pageMenuHelper = pageMenuHelper;
|
||
}
|
||
|
||
public async Task<List<UserRoleViewModel>> GetAllAsync()
|
||
{
|
||
using var dbContext = _dbContextFactory.CreateDbContext();
|
||
var userRoles = dbContext.GetDbSet<UserRoleDto>();
|
||
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
||
var jsonSerializerOptions = new JsonSerializerOptions
|
||
{
|
||
PropertyNameCaseInsensitive = true
|
||
};
|
||
var result = await (from ur in userRoles
|
||
join urm in userRoleMenus on ur.Id equals urm.RoleId into urms
|
||
select new UserRoleViewModel
|
||
{
|
||
RoleId = ur.Id,
|
||
RoleName = ur.RoleName,
|
||
IsValid = ur.IsValid,
|
||
Menus = new ObservableCollection<UserRoleMenuViewModel>(urms.Select(urm => new UserRoleMenuViewModel
|
||
{
|
||
Id = urm.Id,
|
||
RoleId = urm.RoleId,
|
||
MenuKey = urm.MenuKey,
|
||
MenuName = _pageMenuHelper.GetMenuName(urm.MenuKey),
|
||
MenuActions = new ObservableCollection<string>(JsonSerializer.Deserialize<List<string>>(urm.MenuActions ?? "[]", jsonSerializerOptions) ?? new List<string>())
|
||
}).ToList())
|
||
}).ToListAsync();
|
||
|
||
return result ?? new List<UserRoleViewModel>();
|
||
}
|
||
|
||
public async Task<ResultModel> EditUserRoleMenuAsync(UserRoleViewModel? userRole)
|
||
{
|
||
if (userRole == null)
|
||
{
|
||
return ResultModel.Error("UserRole cannot be null");
|
||
}
|
||
if (string.IsNullOrEmpty(userRole.RoleName))
|
||
{
|
||
return ResultModel.Error("UserRoleName cannot be null");
|
||
}
|
||
using var dbContext = _dbContextFactory.CreateDbContext();
|
||
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
||
|
||
// 删除旧的菜单
|
||
var oldMenus = userRoleMenus.Where(urm => urm.RoleId == userRole.RoleId);
|
||
dbContext.RemoveRange(oldMenus);
|
||
|
||
// 添加新的菜单
|
||
var newMenus = userRole.Menus?.Select(menu => new UserRoleMenuDto
|
||
{
|
||
RoleId = userRole.RoleId,
|
||
MenuKey = menu.MenuKey,
|
||
MenuActions = JsonSerializer.Serialize(menu.MenuActions)
|
||
}).ToList();
|
||
|
||
if (newMenus != null)
|
||
{
|
||
await userRoleMenus.AddRangeAsync(newMenus);
|
||
var ret = await dbContext.SaveChangesAsync();
|
||
// 添加完新的数据后,id需要告诉userRole的Menus
|
||
var addedMenus = await userRoleMenus.Where(urm => urm.RoleId == userRole.RoleId).ToListAsync();
|
||
if (userRole.Menus != null)
|
||
{
|
||
for (int i = 0; i < userRole.Menus.Count; i++)
|
||
{
|
||
userRole.Menus[i].Id = addedMenus[i].Id;
|
||
}
|
||
}
|
||
|
||
return ResultModel.Success($"UserRoleMenu updated successfully,count is {ret}");
|
||
}
|
||
else
|
||
{
|
||
var ret = await dbContext.SaveChangesAsync();
|
||
return ResultModel.Success($"UserRoleMenu updated successfully,count is {ret}");
|
||
}
|
||
}
|
||
|
||
|
||
public async Task<ResultModel> EditMenuActionsAsync(UserRoleMenuViewModel? userRoleMenu)
|
||
{
|
||
if (userRoleMenu == null)
|
||
{
|
||
return ResultModel.Error("UserRoleMenu cannot be null");
|
||
}
|
||
if (string.IsNullOrEmpty(userRoleMenu.MenuKey))
|
||
{
|
||
return ResultModel.Error("MenuKey cannot be null");
|
||
}
|
||
using var dbContext = _dbContextFactory.CreateDbContext();
|
||
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
||
var menu = await userRoleMenus.FirstOrDefaultAsync(urm => urm.Id == userRoleMenu.Id);
|
||
if (menu == null)
|
||
{
|
||
return ResultModel.Error("UserRoleMenu Actions not found");
|
||
}
|
||
menu.MenuActions = JsonSerializer.Serialize(userRoleMenu.MenuActions);
|
||
dbContext.Update(menu);
|
||
var ret = await dbContext.SaveChangesAsync();
|
||
return ResultModel.Success($"UserRoleMenu Actions updated successfully,count is {ret}");
|
||
}
|
||
|
||
public async Task<ResultModel> DeleteMenuActionsAsync(UserRoleMenuViewModel? userRoleMenu)
|
||
{
|
||
if (userRoleMenu == null)
|
||
{
|
||
return ResultModel.Error("UserRoleMenu cannot be null");
|
||
}
|
||
if (string.IsNullOrEmpty(userRoleMenu.MenuKey))
|
||
{
|
||
return ResultModel.Error("MenuKey cannot be null");
|
||
}
|
||
using var dbContext = _dbContextFactory.CreateDbContext();
|
||
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
||
var menu = await userRoleMenus.FirstOrDefaultAsync(urm => urm.Id == userRoleMenu.Id);
|
||
if (menu == null)
|
||
{
|
||
return ResultModel.Error("UserRoleMenu Actions not found");
|
||
}
|
||
var ret = await DeleteAsync<UserRoleMenuDto>(menu);
|
||
return ResultModel.Success($"UserRoleMenu Actions remove successfully,count is {ret}");
|
||
}
|
||
}
|