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 { /// /// 菜单数据 /// private readonly List _menuItems; private readonly PageViewMenuHelper _pageMenuHelper; public UserRoleMenuService(IDbContextFactory dbContextFactory, PageViewMenuHelper pageMenuHelper, MenuConfigurationContext menuContext) : base(dbContextFactory) { _menuItems = menuContext.Menus; _pageMenuHelper = pageMenuHelper; } public async Task> GetAllAsync() { using var dbContext = _dbContextFactory.CreateDbContext(); var userRoles = dbContext.GetDbSet(); var userRoleMenus = dbContext.GetDbSet(); 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(urms.Select(urm => new UserRoleMenuViewModel { Id = urm.Id, RoleId = urm.RoleId, MenuKey = urm.MenuKey, MenuName = _pageMenuHelper.GetMenuName(urm.MenuKey), MenuActions = new ObservableCollection(JsonSerializer.Deserialize>(urm.MenuActions ?? "[]", jsonSerializerOptions) ?? new List()) }).ToList()) }).ToListAsync(); return result ?? new List(); } public async Task 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(); // 删除旧的菜单 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 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(); 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 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(); var menu = await userRoleMenus.FirstOrDefaultAsync(urm => urm.Id == userRoleMenu.Id); if (menu == null) { return ResultModel.Error("UserRoleMenu Actions not found"); } var ret = await DeleteAsync(menu); return ResultModel.Success($"UserRoleMenu Actions remove successfully,count is {ret}"); } }