public async Task <ActionResult> AddPermission([FromBody] CheckPermissionDto permissionDto) { if (!IsAvailableOperation() || permissionDto.UserIds.Count() == 0 && permissionDto.ClientIds.Count() == 0 && permissionDto.GroupIds.Count() == 0) { return(BadRequest()); } var result = await _fileStorageService.CheckPermission(permissionDto, UserId, ClientId); AddLog(LogType.Create, LogMessage.CreatePermissionMessage(permissionDto.FileStorageId, LogMessage.CreateVerb, UserId)); foreach (var recipient in result.Recipients) { var message = MessageUtil.GetMessage(permissionDto.Type, recipient, result.Storage, result.Sender); try { await _emailSender.Send(EmailType.Notification, new MailAddress(recipient.Email, recipient.UserName), message.Subject, message.MessageBody); await _notificationService.Add(recipient.Id, result.Storage.Id, message.Subject, message.MessageBody, Enums.NotificationType.Success); } catch (Exception) { await _notificationService.Add(recipient.Id, result.Storage.Id, message.Subject, message.MessageBody, Enums.NotificationType.NotSent); } } return(Ok()); }
public async Task <CheckPermissionResultDto> CheckPermission(CheckPermissionDto permissionDto, int userId, int clientId) { var fileStorageRepository = DataContextManager.CreateRepository <IFileStorageRepository>(); var fileStorage = await fileStorageRepository.GetById(permissionDto.FileStorageId, userId, clientId); var isAvailableToChange = await fileStorageRepository.IsAvailableToChange(fileStorage.Id, userId, clientId); if (!isAvailableToChange) { throw new UnavailableOperationException("update permission", "Permission", fileStorage.Id, userId); } var sender = await _userService.GetById(userId); var users = await GetUsers(permissionDto.ClientIds, permissionDto.GroupIds, permissionDto.UserIds, sender.Id); var parentFileStorages = await fileStorageRepository.GetParents(fileStorage.ParentFileStorageId, sender.Id, clientId); var recipients = new List <CheckPermissionResultDto.RecipientDto>(); fileStorage.Permissions.Where(x => users.Select(s => s.Id).Contains(x.RecipientId) && !x.EndDate.HasValue) .ToList() .ForEach(perm => { perm.Type = permissionDto.Type; recipients.Add(new CheckPermissionResultDto.RecipientDto { Id = perm.Recipient.Id, UserName = perm.Recipient.UserName, Email = perm.Recipient.Email, Type = CheckPermissionResultDto.UpdateType.Update }); }); users.Where(x => !fileStorage.Permissions.Any(y => y.RecipientId == x.Id && !y.EndDate.HasValue)) .ToList() .ForEach(user => { fileStorage.Permissions.Add(new FileStoragePermission { RecipientId = user.Id, SenderId = sender.Id, Type = permissionDto.Type, StartDate = DateTime.UtcNow }); recipients.Add(new CheckPermissionResultDto.RecipientDto { Id = user.Id, UserName = user.UserName, Email = user.Email, Type = CheckPermissionResultDto.UpdateType.Add }); }); fileStorage.Permissions.Where(x => !users.Select(s => s.Id).Contains(x.RecipientId) && !x.EndDate.HasValue) .ToList() .ForEach(perm => { perm.EndDate = DateTime.UtcNow; recipients.Add(new CheckPermissionResultDto.RecipientDto { Id = perm.Recipient.Id, UserName = perm.Recipient.UserName, Email = perm.Recipient.Email, Type = CheckPermissionResultDto.UpdateType.Remove }); }); if (!fileStorage.ClientId.HasValue && !fileStorage.OwnerId.HasValue || fileStorage.ClientId.HasValue && !fileStorage.OwnerId.HasValue) { parentFileStorages.ToList() .ForEach(storage => { storage.Permissions.Where(x => users.Select(s => s.Id).Contains(x.RecipientId) && !x.EndDate.HasValue) .ToList() .ForEach(perm => { perm.Type = permissionDto.Type; recipients.Add(new CheckPermissionResultDto.RecipientDto { Id = perm.Recipient.Id, UserName = perm.Recipient.UserName, Email = perm.Recipient.Email, Type = CheckPermissionResultDto.UpdateType.Update }); }); users.Where(x => !storage.Permissions.Any(y => y.RecipientId == x.Id && !y.EndDate.HasValue)) .ToList() .ForEach(user => { storage.Permissions.Add(new FileStoragePermission { RecipientId = user.Id, SenderId = sender.Id, Type = permissionDto.Type, StartDate = DateTime.UtcNow }); recipients.Add(new CheckPermissionResultDto.RecipientDto { Id = user.Id, UserName = user.UserName, Email = user.Email, Type = CheckPermissionResultDto.UpdateType.Add }); }); storage.Permissions.Where(x => !users.Select(s => s.Id).Contains(x.RecipientId) && !x.EndDate.HasValue) .ToList() .ForEach(perm => { perm.EndDate = DateTime.UtcNow; recipients.Add(new CheckPermissionResultDto.RecipientDto { Id = perm.Recipient.Id, UserName = perm.Recipient.UserName, Email = perm.Recipient.Email, Type = CheckPermissionResultDto.UpdateType.Remove }); }); }); } await SaveChanges(fileStorageRepository, fileStorage, parentFileStorages); return(new CheckPermissionResultDto { Storage = MapperFactory.CreateMapper <IFileStorageMapper>().MapToModel(fileStorage), Sender = sender, Recipients = recipients }); }