2019-06-21 09:07:49 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using ASC.Api.Core;
|
|
|
|
|
using ASC.Api.Utils;
|
|
|
|
|
using ASC.Common.Web;
|
|
|
|
|
using ASC.Core;
|
2019-08-09 12:28:19 +00:00
|
|
|
|
using ASC.Core.Tenants;
|
2019-06-21 09:07:49 +00:00
|
|
|
|
using ASC.Core.Users;
|
|
|
|
|
using ASC.MessagingSystem;
|
|
|
|
|
using ASC.Web.Api.Models;
|
|
|
|
|
using ASC.Web.Api.Routing;
|
2019-09-09 12:56:33 +00:00
|
|
|
|
using ASC.Web.Core.Users;
|
2019-06-21 09:07:49 +00:00
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using SecurityContext = ASC.Core.SecurityContext;
|
|
|
|
|
|
|
|
|
|
namespace ASC.Employee.Core.Controllers
|
|
|
|
|
{
|
|
|
|
|
[DefaultRoute]
|
|
|
|
|
[ApiController]
|
|
|
|
|
public class GroupController : ControllerBase
|
|
|
|
|
{
|
|
|
|
|
public Common.Logging.LogManager LogManager { get; }
|
2019-08-08 09:26:58 +00:00
|
|
|
|
public ApiContext ApiContext { get; }
|
2019-08-09 12:28:19 +00:00
|
|
|
|
public Tenant Tenant { get { return ApiContext.Tenant; } }
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public MessageService MessageService { get; }
|
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
public UserManager UserManager { get; }
|
|
|
|
|
public UserPhotoManager UserPhotoManager { get; }
|
|
|
|
|
public SecurityContext SecurityContext { get; }
|
|
|
|
|
public PermissionContext PermissionContext { get; }
|
|
|
|
|
|
|
|
|
|
public GroupController(
|
|
|
|
|
Common.Logging.LogManager logManager,
|
|
|
|
|
MessageService messageService,
|
|
|
|
|
ApiContext apiContext,
|
|
|
|
|
UserManager userManager,
|
|
|
|
|
UserPhotoManager userPhotoManager,
|
|
|
|
|
SecurityContext securityContext,
|
|
|
|
|
PermissionContext permissionContext)
|
2019-06-21 09:07:49 +00:00
|
|
|
|
{
|
|
|
|
|
LogManager = logManager;
|
|
|
|
|
MessageService = messageService;
|
2019-08-08 09:26:58 +00:00
|
|
|
|
ApiContext = apiContext;
|
2019-09-09 12:56:33 +00:00
|
|
|
|
UserManager = userManager;
|
|
|
|
|
UserPhotoManager = userPhotoManager;
|
|
|
|
|
SecurityContext = securityContext;
|
|
|
|
|
PermissionContext = permissionContext;
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Read]
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public IEnumerable<GroupWrapperSummary> GetAll()
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
return UserManager.GetDepartments(Tenant.TenantId).Select(x => new GroupWrapperSummary(x, ApiContext, UserManager));
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("{groupid}")]
|
|
|
|
|
public GroupWrapperFull GetById(Guid groupid)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
return new GroupWrapperFull(GetGroupInfo(groupid), true, ApiContext, UserManager, UserPhotoManager);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("user/{userid}")]
|
|
|
|
|
public IEnumerable<GroupWrapperSummary> GetByUserId(Guid userid)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
return UserManager.GetUserGroups(Tenant, userid).Select(x => new GroupWrapperSummary(x, ApiContext, UserManager));
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Create]
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public GroupWrapperFull AddGroup(Guid groupManager, string groupName, IEnumerable<Guid> members)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
PermissionContext.DemandPermissions(Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var group = UserManager.SaveGroupInfo(Tenant, new GroupInfo { Name = groupName });
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
|
|
|
|
TransferUserToDepartment(groupManager, @group, true);
|
|
|
|
|
if (members != null)
|
|
|
|
|
{
|
|
|
|
|
foreach (var member in members)
|
|
|
|
|
{
|
|
|
|
|
TransferUserToDepartment(member, group, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MessageService.Send(MessageAction.GroupCreated, MessageTarget.Create(group.ID), group.Name);
|
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
return new GroupWrapperFull(group, true, ApiContext, UserManager, UserPhotoManager);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{groupid}")]
|
|
|
|
|
public GroupWrapperFull UpdateGroup(Guid groupid, Guid groupManager, string groupName, IEnumerable<Guid> members)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
PermissionContext.DemandPermissions(Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
|
|
|
|
var group = UserManager.GetGroups(Tenant.TenantId).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");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
group.Name = groupName ?? group.Name;
|
2019-09-09 12:56:33 +00:00
|
|
|
|
UserManager.SaveGroupInfo(Tenant, group);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
RemoveMembersFrom(groupid, UserManager.GetUsersByGroup(Tenant, groupid, EmployeeStatus.All).Select(u => u.ID).Where(id => !members.Contains(id)));
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
|
|
|
|
TransferUserToDepartment(groupManager, @group, true);
|
|
|
|
|
if (members != null)
|
|
|
|
|
{
|
|
|
|
|
foreach (var member in members)
|
|
|
|
|
{
|
|
|
|
|
TransferUserToDepartment(member, group, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MessageService.Send(MessageAction.GroupUpdated, MessageTarget.Create(group.ID), group.Name);
|
|
|
|
|
|
|
|
|
|
return GetById(groupid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Delete("{groupid}")]
|
|
|
|
|
public GroupWrapperFull DeleteGroup(Guid groupid)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
PermissionContext.DemandPermissions(Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
var @group = GetGroupInfo(groupid);
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var groupWrapperFull = new GroupWrapperFull(group, false, ApiContext, UserManager, UserPhotoManager);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
UserManager.DeleteGroup(Tenant, 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
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var group = UserManager.GetGroups(Tenant.TenantId).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}")]
|
|
|
|
|
public GroupWrapperFull TransferMembersTo(Guid groupid, Guid newgroupid)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
PermissionContext.DemandPermissions(Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
var oldgroup = GetGroupInfo(groupid);
|
|
|
|
|
|
|
|
|
|
var newgroup = GetGroupInfo(newgroupid);
|
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var users = UserManager.GetUsersByGroup(Tenant, oldgroup.ID);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
foreach (var userInfo in users)
|
|
|
|
|
{
|
|
|
|
|
TransferUserToDepartment(userInfo.ID, newgroup, false);
|
|
|
|
|
}
|
|
|
|
|
return GetById(newgroupid);
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Create("{groupid}/members")]
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public GroupWrapperFull SetMembersTo(Guid groupid, IEnumerable<Guid> members)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
RemoveMembersFrom(groupid, UserManager.GetUsersByGroup(Tenant, groupid).Select(x => x.ID));
|
2019-06-21 09:07:49 +00:00
|
|
|
|
AddMembersTo(groupid, members);
|
|
|
|
|
return GetById(groupid);
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Update("{groupid}/members")]
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public GroupWrapperFull AddMembersTo(Guid groupid, IEnumerable<Guid> members)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
PermissionContext.DemandPermissions(Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
var group = GetGroupInfo(groupid);
|
|
|
|
|
|
|
|
|
|
foreach (var userId in members)
|
|
|
|
|
{
|
|
|
|
|
TransferUserToDepartment(userId, group, false);
|
|
|
|
|
}
|
|
|
|
|
return GetById(group.ID);
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Update("{groupid}/manager")]
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public GroupWrapperFull SetManager(Guid groupid, Guid userid)
|
|
|
|
|
{
|
|
|
|
|
var group = GetGroupInfo(groupid);
|
2019-09-09 12:56:33 +00:00
|
|
|
|
if (UserManager.UserExists(Tenant.TenantId, userid))
|
2019-06-21 09:07:49 +00:00
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
UserManager.SetDepartmentManager(Tenant.TenantId, group.ID, userid);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw new ItemNotFoundException("user not found");
|
|
|
|
|
}
|
|
|
|
|
return GetById(groupid);
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Delete("{groupid}/members")]
|
2019-06-21 09:07:49 +00:00
|
|
|
|
public GroupWrapperFull RemoveMembersFrom(Guid groupid, IEnumerable<Guid> members)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
PermissionContext.DemandPermissions(Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
var group = GetGroupInfo(groupid);
|
|
|
|
|
|
|
|
|
|
foreach (var userId in members)
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
if (!UserManager.UserExists(Tenant.TenantId, userId)) return;
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var user = UserManager.GetUsers(Tenant.TenantId, userId);
|
|
|
|
|
UserManager.RemoveUserFromGroup(Tenant, user.ID, @group.ID);
|
|
|
|
|
UserManager.SaveUserInfo(Tenant, 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
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
if (!UserManager.UserExists(Tenant.TenantId, userId) && userId != Guid.Empty) return;
|
2019-06-21 09:07:49 +00:00
|
|
|
|
|
|
|
|
|
if (setAsManager)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
UserManager.SetDepartmentManager(Tenant.TenantId, @group.ID, userId);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
2019-09-09 12:56:33 +00:00
|
|
|
|
UserManager.AddUserIntoGroup(Tenant, userId, @group.ID);
|
2019-06-21 09:07:49 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|