DocSpace-client/products/ASC.People/Server/Api/GroupController.cs

295 lines
11 KiB
C#
Raw Normal View History

2022-01-29 22:13:42 +00:00
namespace ASC.Employee.Core.Controllers
2019-06-21 09:07:49 +00:00
{
2020-10-19 15:53:15 +00:00
[Scope]
2019-06-21 09:07:49 +00:00
[DefaultRoute]
[ApiController]
public class GroupController : ControllerBase
{
2020-11-24 13:13:49 +00:00
public ApiContext ApiContext { get; }
2020-08-12 09:58:08 +00:00
private MessageService MessageService { get; }
2019-06-21 09:07:49 +00:00
2020-08-12 09:58:08 +00:00
private UserManager UserManager { get; }
private PermissionContext PermissionContext { get; }
private MessageTarget MessageTarget { get; }
private GroupWraperFullHelper GroupWraperFullHelper { get; }
2019-09-09 12:56:33 +00:00
public GroupController(
2020-11-24 13:13:49 +00:00
ApiContext apiContext,
2019-09-09 12:56:33 +00:00
MessageService messageService,
UserManager userManager,
2019-09-19 15:55:44 +00:00
PermissionContext permissionContext,
MessageTarget messageTarget,
GroupWraperFullHelper groupWraperFullHelper)
2019-06-21 09:07:49 +00:00
{
2020-11-24 13:13:49 +00:00
ApiContext = apiContext;
2019-06-21 09:07:49 +00:00
MessageService = messageService;
2019-09-09 12:56:33 +00:00
UserManager = userManager;
PermissionContext = permissionContext;
2019-10-22 11:21:44 +00:00
MessageTarget = messageTarget;
GroupWraperFullHelper = groupWraperFullHelper;
2019-06-21 09:07:49 +00:00
}
2019-06-25 10:46:10 +00:00
[Read]
2022-02-28 18:54:08 +00:00
public IEnumerable<GroupSummaryDto> GetAll()
2019-06-21 09:07:49 +00:00
{
2020-11-24 13:13:49 +00:00
var result = UserManager.GetDepartments().Select(r => r);
if (!string.IsNullOrEmpty(ApiContext.FilterValue))
{
2020-12-07 16:56:59 +00:00
result = result.Where(r => r.Name.Contains(ApiContext.FilterValue, StringComparison.InvariantCultureIgnoreCase));
2020-11-24 13:13:49 +00:00
}
2022-02-28 18:54:08 +00:00
return result.Select(x => new GroupSummaryDto(x, UserManager));
2019-06-21 09:07:49 +00:00
}
[Read("full")]
2022-02-28 18:36:40 +00:00
public IEnumerable<GroupDto> GetAllWithMembers()
{
var result = UserManager.GetDepartments().Select(r => r);
if (!string.IsNullOrEmpty(ApiContext.FilterValue))
{
result = result.Where(r => r.Name.Contains(ApiContext.FilterValue, StringComparison.InvariantCultureIgnoreCase));
}
return result.Select(r=> GroupWraperFullHelper.Get(r, true));
}
2019-06-21 09:07:49 +00:00
[Read("{groupid}")]
2022-02-28 18:36:40 +00:00
public GroupDto GetById(Guid groupid)
2019-06-21 09:07:49 +00:00
{
return GroupWraperFullHelper.Get(GetGroupInfo(groupid), true);
2019-06-21 09:07:49 +00:00
}
[Read("user/{userid}")]
2022-02-28 18:54:08 +00:00
public IEnumerable<GroupSummaryDto> GetByUserId(Guid userid)
2019-06-21 09:07:49 +00:00
{
2022-02-28 18:54:08 +00:00
return UserManager.GetUserGroups(userid).Select(x => new GroupSummaryDto(x, UserManager));
2019-06-21 09:07:49 +00:00
}
2019-06-25 10:46:10 +00:00
[Create]
2022-02-28 18:36:40 +00:00
public GroupDto AddGroupFromBody([FromBody]GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return AddGroup(groupModel);
}
[Create]
[Consumes("application/x-www-form-urlencoded")]
2022-02-28 18:36:40 +00:00
public GroupDto AddGroupFromForm([FromForm] GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return AddGroup(groupModel);
}
2022-02-28 18:36:40 +00:00
private GroupDto AddGroup(GroupRequestDto groupModel)
2019-06-21 09:07:49 +00:00
{
PermissionContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
2019-06-21 09:07:49 +00:00
var group = UserManager.SaveGroupInfo(new GroupInfo { Name = groupModel.GroupName });
2019-06-21 09:07:49 +00:00
2019-09-20 10:43:13 +00:00
TransferUserToDepartment(groupModel.GroupManager, @group, true);
if (groupModel.Members != null)
2019-06-21 09:07:49 +00:00
{
2019-09-20 10:43:13 +00:00
foreach (var member in groupModel.Members)
2019-06-21 09:07:49 +00:00
{
TransferUserToDepartment(member, group, false);
}
}
MessageService.Send(MessageAction.GroupCreated, MessageTarget.Create(group.ID), group.Name);
return GroupWraperFullHelper.Get(group, true);
2019-06-21 09:07:49 +00:00
}
[Update("{groupid}")]
2022-02-28 18:36:40 +00:00
public GroupDto UpdateGroupFromBody(Guid groupid, [FromBody]GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return UpdateGroup(groupid, groupModel);
}
[Update("{groupid}")]
[Consumes("application/x-www-form-urlencoded")]
2022-02-28 18:36:40 +00:00
public GroupDto UpdateGroupFromForm(Guid groupid, [FromForm] GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return UpdateGroup(groupid, groupModel);
}
2022-02-28 18:36:40 +00:00
private GroupDto UpdateGroup(Guid groupid, GroupRequestDto groupModel)
2019-06-21 09:07:49 +00:00
{
PermissionContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var group = UserManager.GetGroups().SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
2019-09-23 12:46:42 +00:00
if (groupid == Constants.LostGroupInfo.ID)
2019-06-21 09:07:49 +00:00
{
throw new ItemNotFoundException("group not found");
}
2019-09-20 10:43:13 +00:00
group.Name = groupModel.GroupName ?? group.Name;
UserManager.SaveGroupInfo(group);
2019-06-21 09:07:49 +00:00
2022-02-28 18:36:40 +00:00
RemoveMembersFrom(groupid, new GroupRequestDto {Members = UserManager.GetUsersByGroup(groupid, EmployeeStatus.All).Select(u => u.ID).Where(id => !groupModel.Members.Contains(id)) });
2019-06-21 09:07:49 +00:00
2019-09-20 10:43:13 +00:00
TransferUserToDepartment(groupModel.GroupManager, @group, true);
if (groupModel.Members != null)
2019-06-21 09:07:49 +00:00
{
2019-09-20 10:43:13 +00:00
foreach (var member in groupModel.Members)
2019-06-21 09:07:49 +00:00
{
TransferUserToDepartment(member, group, false);
}
}
2019-09-23 12:46:42 +00:00
MessageService.Send(MessageAction.GroupUpdated, MessageTarget.Create(groupid), group.Name);
2019-06-21 09:07:49 +00:00
2020-11-06 09:03:49 +00:00
return GetById(groupid);
2019-06-21 09:07:49 +00:00
}
[Delete("{groupid}")]
2022-02-28 18:36:40 +00:00
public GroupDto DeleteGroup(Guid groupid)
2019-06-21 09:07:49 +00:00
{
PermissionContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
2019-06-21 09:07:49 +00:00
var @group = GetGroupInfo(groupid);
var groupWrapperFull = GroupWraperFullHelper.Get(group, false);
2019-06-21 09:07:49 +00:00
UserManager.DeleteGroup(groupid);
2019-06-21 09:07:49 +00:00
MessageService.Send(MessageAction.GroupDeleted, MessageTarget.Create(group.ID), group.Name);
return groupWrapperFull;
}
2019-08-08 09:26:58 +00:00
private GroupInfo GetGroupInfo(Guid groupid)
2019-06-21 09:07:49 +00:00
{
var group = UserManager.GetGroups().SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
2019-06-21 09:07:49 +00:00
if (group.ID == Constants.LostGroupInfo.ID)
throw new ItemNotFoundException("group not found");
return @group;
}
[Update("{groupid}/members/{newgroupid}")]
2022-02-28 18:36:40 +00:00
public GroupDto TransferMembersTo(Guid groupid, Guid newgroupid)
2019-06-21 09:07:49 +00:00
{
PermissionContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
2020-11-06 09:03:49 +00:00
var oldgroup = GetGroupInfo(groupid);
2019-06-21 09:07:49 +00:00
2020-11-06 09:03:49 +00:00
var newgroup = GetGroupInfo(newgroupid);
2019-06-21 09:07:49 +00:00
var users = UserManager.GetUsersByGroup(oldgroup.ID);
2019-06-21 09:07:49 +00:00
foreach (var userInfo in users)
{
TransferUserToDepartment(userInfo.ID, newgroup, false);
}
2020-11-06 09:03:49 +00:00
return GetById(newgroupid);
}
[Create("{groupid}/members")]
2022-02-28 18:36:40 +00:00
public GroupDto SetMembersToFromBody(Guid groupid, [FromBody]GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return SetMembersTo(groupid, groupModel);
2019-06-21 09:07:49 +00:00
}
2019-06-25 10:46:10 +00:00
[Create("{groupid}/members")]
2020-11-06 09:03:49 +00:00
[Consumes("application/x-www-form-urlencoded")]
2022-02-28 18:36:40 +00:00
public GroupDto SetMembersToFromForm(Guid groupid, [FromForm] GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return SetMembersTo(groupid, groupModel);
}
2022-02-28 18:36:40 +00:00
private GroupDto SetMembersTo(Guid groupid, GroupRequestDto groupModel)
2019-06-21 09:07:49 +00:00
{
2022-02-28 18:36:40 +00:00
RemoveMembersFrom(groupid, new GroupRequestDto {Members = UserManager.GetUsersByGroup(groupid).Select(x => x.ID) });
2020-11-06 09:03:49 +00:00
AddMembersTo(groupid, groupModel);
return GetById(groupid);
2019-06-21 09:07:49 +00:00
}
2019-06-25 10:46:10 +00:00
[Update("{groupid}/members")]
2022-02-28 18:36:40 +00:00
public GroupDto AddMembersToFromBody(Guid groupid, [FromBody]GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return AddMembersTo(groupid, groupModel);
}
[Update("{groupid}/members")]
[Consumes("application/x-www-form-urlencoded")]
2022-02-28 18:36:40 +00:00
public GroupDto AddMembersToFromForm(Guid groupid, [FromForm] GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return AddMembersTo(groupid, groupModel);
}
2022-02-28 18:36:40 +00:00
private GroupDto AddMembersTo(Guid groupid, GroupRequestDto groupModel)
2019-06-21 09:07:49 +00:00
{
PermissionContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
2020-11-06 09:03:49 +00:00
var group = GetGroupInfo(groupid);
2019-06-21 09:07:49 +00:00
2019-09-20 10:43:13 +00:00
foreach (var userId in groupModel.Members)
2019-06-21 09:07:49 +00:00
{
TransferUserToDepartment(userId, group, false);
}
return GetById(group.ID);
}
2019-06-25 10:46:10 +00:00
[Update("{groupid}/manager")]
2022-02-28 18:36:40 +00:00
public GroupDto SetManagerFromBody(Guid groupid, [FromBody]SetManagerRequestDto setManagerModel)
2020-11-06 09:03:49 +00:00
{
return SetManager(groupid, setManagerModel);
}
[Update("{groupid}/manager")]
[Consumes("application/x-www-form-urlencoded")]
2022-02-28 18:36:40 +00:00
public GroupDto SetManagerFromForm(Guid groupid, [FromForm] SetManagerRequestDto setManagerModel)
2019-06-21 09:07:49 +00:00
{
2020-11-06 09:03:49 +00:00
return SetManager(groupid, setManagerModel);
}
2022-02-28 18:36:40 +00:00
private GroupDto SetManager(Guid groupid, SetManagerRequestDto setManagerModel)
2020-11-06 09:03:49 +00:00
{
var group = GetGroupInfo(groupid);
if (UserManager.UserExists(setManagerModel.UserId))
2019-06-21 09:07:49 +00:00
{
UserManager.SetDepartmentManager(group.ID, setManagerModel.UserId);
2019-06-21 09:07:49 +00:00
}
else
{
throw new ItemNotFoundException("user not found");
}
2020-11-06 09:03:49 +00:00
return GetById(groupid);
}
[Delete("{groupid}/members")]
2022-02-28 18:36:40 +00:00
public GroupDto RemoveMembersFromFromBody(Guid groupid, [FromBody]GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return RemoveMembersFrom(groupid, groupModel);
2019-06-21 09:07:49 +00:00
}
2019-06-25 10:46:10 +00:00
[Delete("{groupid}/members")]
2020-11-06 09:03:49 +00:00
[Consumes("application/x-www-form-urlencoded")]
2022-02-28 18:36:40 +00:00
public GroupDto RemoveMembersFromFromForm(Guid groupid, [FromForm] GroupRequestDto groupModel)
2020-11-06 09:03:49 +00:00
{
return RemoveMembersFrom(groupid, groupModel);
}
2022-02-28 18:36:40 +00:00
private GroupDto RemoveMembersFrom(Guid groupid, GroupRequestDto groupModel)
2019-06-21 09:07:49 +00:00
{
PermissionContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
2020-11-06 09:03:49 +00:00
var group = GetGroupInfo(groupid);
2019-06-21 09:07:49 +00:00
2019-09-20 10:43:13 +00:00
foreach (var userId in groupModel.Members)
2019-06-21 09:07:49 +00:00
{
RemoveUserFromDepartment(userId, group);
}
return GetById(group.ID);
}
2019-08-08 09:26:58 +00:00
private void RemoveUserFromDepartment(Guid userId, GroupInfo @group)
2019-06-21 09:07:49 +00:00
{
if (!UserManager.UserExists(userId)) return;
2019-06-21 09:07:49 +00:00
var user = UserManager.GetUsers(userId);
UserManager.RemoveUserFromGroup(user.ID, @group.ID);
UserManager.SaveUserInfo(user);
2019-06-21 09:07:49 +00:00
}
2019-08-08 09:26:58 +00:00
private void TransferUserToDepartment(Guid userId, GroupInfo group, bool setAsManager)
2019-06-21 09:07:49 +00:00
{
if (!UserManager.UserExists(userId) && userId != Guid.Empty) return;
2019-06-21 09:07:49 +00:00
if (setAsManager)
{
UserManager.SetDepartmentManager(@group.ID, userId);
2019-06-21 09:07:49 +00:00
}
UserManager.AddUserIntoGroup(userId, @group.ID);
2019-06-21 09:07:49 +00:00
}
}
}