public MenuResult UpdateMenu(AuthIdentity identity, Guid? menuId, Guid[] recipesAdd, Guid[] recipesRemove, MenuMove[] recipesMove, bool clear, string newName = null) { var ret = new MenuResult(); ret.MenuUpdated = true; // TODO: Verify actual changes were made before setting MenuUpdated to true using (var session = GetSession()) { using (var transaction = session.BeginTransaction()) { Models.Menus dbMenu = null; IList<Favorites> dbRecipes = null; if (menuId.HasValue) { dbMenu = session.QueryOver<Models.Menus>() .Fetch(prop => prop.Recipes).Eager .Where(p => p.MenuId == menuId) .SingleOrDefault(); if (dbMenu == null) throw new MenuNotFoundException(); if (dbMenu.UserId != identity.UserId) // User does not have access to modify this menu throw new UserDoesNotOwnMenuException(); if (!String.IsNullOrWhiteSpace(newName) && dbMenu != null) // Rename menu dbMenu.Title = newName.Trim(); dbRecipes = dbMenu.Recipes; } else { dbRecipes = session.QueryOver<Favorites>() .Where(p => p.UserId == identity.UserId) .Where(p => p.Menu == null) .List(); } if (recipesAdd.Any()) // Add recipes to menu { var existing = (from r in dbRecipes select r.Recipe.RecipeId); recipesAdd = recipesAdd.Except(existing).ToArray(); //Remove dupes foreach (var rid in recipesAdd) { var fav = new Favorites { UserId = identity.UserId, Recipe = new Models.Recipes() {RecipeId = rid}, Menu = dbMenu }; session.Save(fav); } } if (recipesRemove.Any()) // Remove recipes from menu { var toDelete = (from r in dbRecipes where recipesRemove.Contains(r.Recipe.RecipeId) select r); toDelete.ForEach(session.Delete); } if (clear) // Remove every recipe from menu { dbRecipes.ForEach(session.Delete); } if (recipesMove.Any()) // Move items to another menu { foreach (var moveAction in recipesMove) { Models.Menus dbTarget = null; if (moveAction.TargetMenu.HasValue) { dbTarget = session.QueryOver<Models.Menus>() .Where(p => p.MenuId == moveAction.TargetMenu.Value) .Where(p => p.UserId == identity.UserId) .SingleOrDefault(); if (dbTarget == null) throw new MenuNotFoundException(moveAction.TargetMenu.Value); } var rToMove = (moveAction.MoveAll ? dbRecipes : dbRecipes.Where(r => moveAction.RecipesToMove.Contains(r.Recipe.RecipeId))); rToMove.ForEach(a => a.Menu = dbTarget); } } transaction.Commit(); } } return ret; }
private static void AddRecipesToMenu( AuthorIdentity identity, Guid[] recipesAdd, IList<Favorites> databaseRecipes, Menus databaseMenu, ISession session) { var existing = from r in databaseRecipes select r.Recipe.RecipeId; recipesAdd = recipesAdd.Except(existing).ToArray(); // Remove duplicates foreach (var recipeId in recipesAdd) { var fav = new Favorites { UserId = identity.UserId, Recipe = new Recipes { RecipeId = recipeId }, Menu = databaseMenu }; session.Save(fav); } }
/// <summary> /// Updates a specified menu owned by the current user. /// </summary> /// <param name="menuId">The Menu ID to update, or null to update the Favorites menu.</param> /// <param name="recipesAdd">A list of recipe IDs to add to the menu. Duplicates will be ignored.</param> /// <param name="recipesRemove">A list of recipe IDs to remove from the menu.</param> /// <param name="recipesMove">A list of items to move from this menu to another menu.</param> /// <param name="clear">If true, all recipes will be removed from this menu.</param> /// <param name="newName">An optional new name for this menu. Note, the favorites menu cannot be renamed.</param> /// <returns></returns> public MenuResult UpdateMenu(Guid? menuId, Guid[] recipesAdd, Guid[] recipesRemove, MenuMove[] recipesMove, bool clear, string newName = null) { var ret = new MenuResult(); ret.IsMenuUpdated = true; // TODO: Verify actual changes were made before setting MenuUpdated to true Menus dbMenu = null; if (menuId.HasValue) { dbMenu = store.Menus.SingleOrDefault(p => p.MenuId == menuId); if (dbMenu == null) throw new MenuNotFoundException(); if (dbMenu.UserId != Identity.UserId) // User does not have access to modify this menu throw new UserDoesNotOwnMenuException(); } var dbFavorites = store.Favorites .Where(p => p.MenuId == menuId) .ToList(); if (!string.IsNullOrWhiteSpace(newName) && dbMenu != null) // Rename menu dbMenu.Title = newName.Trim(); if (recipesAdd.Any()) // Add recipes to menu { var existing = dbFavorites.Select(f => f.RecipeId); recipesAdd = recipesAdd.Except(existing).ToArray(); //Remove dupes foreach (var rid in recipesAdd) { var fav = new Favorites { FavoriteId = Guid.NewGuid(), UserId = Identity.UserId, RecipeId = rid, MenuId = menuId }; store.Favorites.Add(fav); } } if (recipesRemove.Any()) // Remove recipes from menu { var toDelete = (from r in dbFavorites where recipesRemove.Contains(r.RecipeId) select r); toDelete.ForEach(r => store.Favorites.Remove(r)); } if (clear) // Remove every recipe from menu { store.Favorites.RemoveAll(dbFavorites.Contains); } if (recipesMove.Any()) // Move items to another menu { foreach (var moveAction in recipesMove) { Menus dbTarget = null; if (moveAction.TargetMenu.HasValue) { dbTarget = store.Menus .Where(p => p.UserId == Identity.UserId) .SingleOrDefault(p => p.MenuId == moveAction.TargetMenu); if (dbTarget == null) throw new MenuNotFoundException(moveAction.TargetMenu.Value); } var rToMove = (moveAction.AllMoved ? dbFavorites : dbFavorites.Where(r => moveAction.RecipesToMove.Contains(r.RecipeId))); rToMove.ForEach(a => a.MenuId = dbTarget != null ? (Guid?) dbTarget.MenuId : null); } } return ret; }
/// <summary> /// 设置角色功能 /// </summary> /// <param name="roleId">角色Id</param> /// <param name="functionIds">功能Id集合</param> /// <returns>业务操作结果</returns> public async Task<OperationResult> SetRoleFunctions(int roleId, Guid[] functionIds) { SysRole role = await RoleRepository.GetByKeyAsync(roleId); if (role == null) { return new OperationResult(OperationResultType.QueryNull, "指定编号的角色信息不存在"); } Guid[] existIds = FunctionRoleMapRepository.Entities.Where(m => m.Role.Id == roleId).Select(m => m.Function.Id).ToArray(); Guid[] addIds = functionIds.Except(existIds).ToArray(); Guid[] removeIds = existIds.Except(functionIds).ToArray(); FunctionRoleMapRepository.UnitOfWork.TransactionEnabled = true; foreach (Guid addId in addIds) { Function function = await FunctionRepository.GetByKeyAsync(addId); if (function == null) { return new OperationResult(OperationResultType.QueryNull, "指定编号的功能信息不存在"); } FunctionRoleMap map = new FunctionRoleMap() { Function = function, Role = role, BeginTime = DateTime.Now }; await FunctionRoleMapRepository.InsertAsync(map); } await FunctionRoleMapRepository.DeleteAsync(m => m.Role.Id == roleId && removeIds.Contains(m.Function.Id)); return await FunctionRoleMapRepository.UnitOfWork.SaveChangesAsync() > 0 ? new OperationResult(OperationResultType.Success, "角色“{0}”指派功能操作成功".FormatWith(role.Name)) : OperationResult.NoChanged; }