public async Task Execute(ReassignEmployeeOperationRequest request) { if (request.EmployeeId == request.ManagerId) { throw new ApplicationException("An employee can't manage himself."); } bool isAuthorizedToReassign = await _authorizationContext.IsAuthorizedForEmployee(request.EmployeeId) && await _authorizationContext.IsAuthorizedForEmployee(request.ManagerId); if (!isAuthorizedToReassign) { throw new ApplicationException($"Not authorized to reassign employee {request.EmployeeId}"); } var employeeToAssign = await _employeeRepository.GetByIdAsync(request.EmployeeId); var myTeamTree = await _authorizationContext.GetTeamTree(); var reassignedEmployeeTeamTree = myTeamTree .FindAnyOrDefault( team => team.Employees.Select(employee => employee.ManagedTeam), team => team.Manager.Id == employeeToAssign.Id); var subordinates = reassignedEmployeeTeamTree?.GetAllEmployees() ?? new List <Domain.Entity.LearningCalendar.Employee>(); bool isNewManagerASubordinate = subordinates.Any(subordinate => subordinate.Id == request.ManagerId); if (isNewManagerASubordinate) { throw new ApplicationException("Can't reassign an employee to his subordinate"); } var ensureNewManagerHasTeamRequest = new EnsureManagerHasTeamRequest { ManagerId = request.ManagerId }; await _ensureManagerHasTeamOperation.Execute(ensureNewManagerHasTeamRequest); var newManager = await _employeeRepository.GetByIdAsync(request.ManagerId); employeeToAssign.Team = newManager.ManagedTeam; await _employeeRepository.UpdateAsync(employeeToAssign); }
public async Task <IActionResult> UpdateEmployee(ReassignEmployeeModel model) { var request = new ReassignEmployeeOperationRequest { EmployeeId = model.EmployeeId, ManagerId = model.ManagerId }; try { await _reassignEmployeeOperation.Execute(request); } catch (ApplicationException ex) { return(BadRequest(new ErrorModel(ex.Message))); } return(Ok()); }