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());
        }
Beispiel #2
0
        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
            });
        }