public TimezBoardsUser(IBoardsUser boardsUser) { BoardId = boardsUser.BoardId; IsActive = boardsUser.IsActive; UserId = boardsUser.UserId; UserRole = boardsUser.UserRole; }
/// <summary> /// Проперка разрешений на доске /// </summary> /// <param name="boardId">ид доски</param> /// <param name="taskId">ид задачи</param> /// <param name="roles">требуемые привелегии</param> /// <param name="isArchive">архивность задачи, имеет значение при taskId != null</param> /// <param name="settings">имеющиеся права</param> /// <returns>true - требуемые разрешения есть</returns> public bool CheckUsersRoles(int boardId, int?taskId, bool?isArchive, IBoardsUser settings, UserRole roles) { bool?taskAccess = null; if (taskId.HasValue) { ITask task = isArchive.HasValue && isArchive.Value ? Utility.Tasks.GetFromArchive(taskId.Value) : Utility.Tasks.Get(boardId, taskId.Value); if (settings.UserRole.HasTheFlag((int)UserRole.Owner)) { taskAccess = true; } else if (((int)roles & settings.UserRole).HasTheFlag((int)UserRole.Customer)) { taskAccess = task.CreatorUserId == settings.UserId; } else if (((int)roles & settings.UserRole).HasTheFlag((int)UserRole.Executor)) { taskAccess = task.ExecutorUserId == settings.UserId; } else { taskAccess = false; } } return((!taskAccess.HasValue || taskAccess.Value) && settings.IsActive && settings.UserRole.HasTheFlag((int)roles)); }
/// <summary> /// Создание доски пользователем /// </summary> /// <param name="name"></param> /// <param name="description"></param> /// <param name="user">Кто создает доску</param> /// <param name="refreshPeriod"></param> /// <param name="organization"></param> /// <returns></returns> /// <exception cref="TariffException"></exception> public IBoard Create(string name, string description, IUser user, int?refreshPeriod = null, IOrganization organization = null) { CheckLimits(organization); using (TransactionScope scope = new TransactionScope()) { // Создаем IBoard board = Repository.Boards.Create( name, description, refreshPeriod , organization != null ? organization.Id : (int?)null); // Добавляем владельца IBoardsUser boardsUser = Repository.BoardsUsers.AddUserToBoard(board.Id, user.Id, UserRole.All); // Добавляем статусы поумолчанию Repository.TasksStatuses.Create(board.Id, "Беклог", true, false, null, null); Repository.TasksStatuses.Create(board.Id, "Сделать", false, true, 10, 480); Repository.TasksStatuses.Create(board.Id, "Делается сейчас", false, true, 2, null); Repository.TasksStatuses.Create(board.Id, "Отдано на тестирование", false, false, 10, null); // Цвета поумолчанию AddColor(board.Id, "Первоочередное", "#D8004B"); AddColor(board.Id, "Важное", "#FCD62D"); AddColor(board.Id, "Обычные задачи", "#7BB28A", true); AddColor(board.Id, "Не срочное", "#1FACE1"); // Создать проект Utility.Projects.Create(board.Id, "Проект", user); OnCreate.Invoke(new EventArgs <IBoardsUser>(boardsUser)); scope.Complete(); return(board); } }
/// <summary> /// Исключение пользователя с доски /// </summary> /// <exception cref="NeedAdminException">На доске должен оставаться хотя бы один админ</exception> public void RemoveUserFromBoard(IBoard board, int userId) { List <UserSettings> settings = GetParticipants(board.Id); UserSettings user = settings.FirstOrDefault(x => x.User.Id == userId); if (user != null) { if (user.Settings.UserRole.HasTheFlag((int)UserRole.Owner)) { int count = settings.Count(x => x.Settings.UserRole.HasTheFlag((int)UserRole.Owner)); if (count < 2) { throw new NeedAdminException("Доске \"" + board.Name + "\" требуется хотя бы один админ."); } } bool hasTasks = Repository.Tasks.HasTasks(board.Id, userId); if (hasTasks) { throw new TasksExistsException(user.User, board); } using (TransactionScope scope = new TransactionScope()) { IBoardsUser boardsUser = Repository.BoardsUsers.Delete(board.Id, userId); // TasksModel - Очистка кеша задач // BoardsModel - Очистка кеша досок OnRemoveUserFromBoard(boardsUser); scope.Complete(); } } }
IBoardsUser Delete(IBoardsUser boardUser) { // Заглушка с копией данных TimezBoardsUser dummy = new TimezBoardsUser(boardUser); _Context.BoardsUsers.DeleteOnSubmit((BoardsUser)boardUser); _Context.SubmitChanges(); return(dummy); }
public TaskFilter(int boardId, IBoardsUser settings , IEnumerable <int> allStatuses, IEnumerable <int> allUserIds , IEnumerable <int> allProjectIds, IEnumerable <int> allColorIds) { BoardId = boardId; _Settings = settings; _AllStatuses = allStatuses; _AllColorIds = allColorIds; _AllProjectIds = allProjectIds; _AllUserIds = allUserIds; }
/// <summary> /// Фильтр инициализированный идами полных коллекций /// </summary> public TaskFilter CreateFilter(int boardId) { int[] projects = Utility.Projects.GetByBoard(boardId).Select(x => x.Id).ToArray(); int[] users = Utility.Boards.GetAllExecutorsOnBoard(boardId).Select(x => x.Id).ToArray(); int[] colorsList = Utility.Boards.GetColors(boardId).Select(x => x.Id).ToArray(); int[] statusesList = Utility.Statuses.GetByBoard(boardId).Select(x => x.Id).ToArray(); IBoardsUser settings = Utility.Boards.GetUserSettings(boardId, Utility.Authentication.UserId).Settings; return(new TaskFilter(boardId, settings, statusesList, users, projects, colorsList)); }
/// <summary> /// При удалении пользователя с доски удаляются все связанные задачи в кеше /// </summary> /// <param name="userOnBoard"></param> void BoardsUtility_OnRemoveUserFromBoard(IBoardsUser userOnBoard) { using (new UpdateLock(userOnBoard.BoardId)) { HashSet <ITask> tasks = GetTasksCache(userOnBoard.BoardId); if (tasks != null) { tasks.RemoveWhere(t => t.ExecutorUserId == userOnBoard.UserId); } } }
/// <summary> /// Обновление настроек пользователя на досте /// </summary> /// <param name="boardId"></param> /// <param name="userId"></param> /// <param name="isActive">null = значение не меняется</param> public IBoardsUser UpdateUserOnBoard(int boardId, int userId, bool isActive) { using (var scope = new TransactionScope()) { IBoardsUser boardUser = Repository.BoardsUsers.GetBoardsUsers(boardId, userId); boardUser.IsActive = isActive; Repository.SubmitChanges(); OnUpdateUserOnBoard.Invoke(new EventArgs <IBoardsUser>(boardUser)); scope.Complete(); return(boardUser); } }
public void UpdateRole(int boardId, int userId, UserRole role) { IBoardsUser boardUser = Repository.BoardsUsers.GetBoardsUsers(boardId, userId); if (boardUser.UserRole != (int)role) { if (boardUser.UserRole.HasTheFlag((int)UserRole.Owner) && !role.HasTheFlag(UserRole.Owner)) { // Если пользователя лишают админских прав, нужно проверить, есть ли еще други админы if (Repository.BoardsUsers.AdminsCount(boardId) == 1) { throw new NeedAdminException("На доске должен быть хотя бы один администратор"); } } boardUser.UserRole = (int)role; Repository.SubmitChanges(); OnUpdateUserOnBoard.Invoke(new EventArgs <IBoardsUser>(boardUser)); } }