public async Task <ActionResult> DeleteFileAsync(ObjectIdRequest request)
        {
            var userId = Tools.AuthenticationManager.GetUserId(User);

            #region Get file from db
            DatabaseModule.Entities.File file;
            try
            {
                file = await _filesRepository.FindByIdAsync(request.Id);
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest("File not found"));
            }
            #endregion

            if (!FileFolderManager.CanDeleteFile(userId, file))
            {
                return(BadRequest("You can't delete file or it doesn't exist"));
            }

            #region Get bucket from db
            DatabaseModule.Entities.Bucket bucket;
            try
            {
                bucket = await _bucketsRepository.FindByIdAsync(file.BucketId.ToString());
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest("Bucket not found"));
            }
            #endregion


            var serviceConfig        = bucket.BucketConfigData;
            var googleBucketUploader = new RequestHandlerGoogleBucket(serviceConfig.ConfigData, serviceConfig.SelectedBucket);
            var result = googleBucketUploader.DeleteFile(request.Id);

            if (!result)
            {
                return(BadRequest("Error while deleting your file"));
            }

            #region Delete file from db
            try
            {
                await _filesRepository.DeleteByIdAsync(request.Id);
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest("Deletion file from db failed"));
            }
            #endregion

            return(Ok());
        }
        public async Task <ActionResult> DownloadFileAsync(string fileId)
        {
            var userId = Tools.AuthenticationManager.GetUserId(User);

            #region
            DatabaseModule.Entities.File file;
            try
            {
                file = await _filesRepository.FindByIdAsync(fileId);
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest("File not found"));
            }
            #endregion

            if (!FileFolderManager.CanAccessFile(userId, file))
            {
                return(BadRequest("User doesn't have access to file"));
            }

            #region Get file from db
            DatabaseModule.Entities.Bucket bucket;
            try
            {
                bucket = await _bucketsRepository.FindByIdAsync(file.BucketId.ToString());
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest("Bucket not found"));
            }
            #endregion

            var serviceConfig        = bucket.BucketConfigData;
            var googleBucketUploader = new RequestHandlerGoogleBucket(serviceConfig.ConfigData, serviceConfig.SelectedBucket);
            var result = googleBucketUploader.DownloadFile(file);


            return(File(result, file.FileType, file.FileName));
        }
        public async Task <ActionResult> DeleteFolder(DTO.Request.ObjectIdRequest request)
        {
            var userId = AuthenticationManager.GetUserId(User);

            if (!await FileFolderManager.CanDeleteFolder(userId, new ObjectId(request.Id), _foldersRepository))
            {
                return(BadRequest("You don't have right to delete folder, or it doesn't exist"));
            }
            var foldersTree = await FileFolderManager.GetFolderTree(new ObjectId(request.Id), _foldersRepository);


            var buckets = (await _bucketsRepository.FilterByAsync(bucket => bucket.OwnerId == null || bucket.OwnerId == userId)).ToList();

            var files = (await _filesRepository.FilterByAsync(file => foldersTree.Contains(file.FolderId))).ToList();

            if (files.Count() != 0)
            {
                foreach (var file in files)
                {
                    var bucket = buckets.First(b => b.Id == file.BucketId);

                    var serviceConfig        = bucket.BucketConfigData;
                    var googleBucketUploader = new RequestHandlerGoogleBucket(serviceConfig.ConfigData, serviceConfig.SelectedBucket);
                    var result = googleBucketUploader.DeleteFile(file.Id.ToString());

                    if (!result)
                    {
                        _logger.LogError("Error while deleting file " + file.Id + " during deletion folder " + request.Id);
                    }
                }
                var filesIds = files.Select(f_ => f_.Id);
                await _filesRepository.DeleteManyAsync(f => filesIds.Contains(f.Id));
            }

            await _foldersRepository.DeleteManyAsync(folder => foldersTree.Contains(folder.Id));

            return(Ok());
        }
        public async Task <ActionResult <string> > SendFileAsync(IFormFile fileUpload, bool compressed, bool encrypted, bool favourite, string folderId)
        {
            var formData = HttpContext.Request.Form;
            var files    = HttpContext.Request.Form.Files;

            var file = files.First();

            ObjectId _folderId = new ObjectId(folderId);
            bool     available = await FileFolderManager.CanAccessFolder(Tools.AuthenticationManager.GetUserId(User), _folderId, _foldersRepository);

            if (!available)
            {
                return(BadRequest("Folder not available or doesn't exist"));
            }


            var user = await _usersRepository.FindOneAsync(x => x.Id == new ObjectId(User.FindFirst("id").Value));

            if (user.Buckets.Count() == 0)
            {
                return(BadRequest("You have not linked any cloud storage"));
            }

            ObjectId fileId               = ObjectId.GenerateNewId();
            var      serviceConfig        = user.CurrentBucket.BucketConfigData;
            var      googleBucketUploader = new RequestHandlerGoogleBucket(serviceConfig.ConfigData, serviceConfig.SelectedBucket);
            var      result               = googleBucketUploader.UploadFile(file, fileId.ToString(), encrypted, compressed);

            if (!result.Success)
            {
                return(BadRequest("Error while uploading your file!"));
            }

            var newFile = new DatabaseModule.Entities.File()
            {
                Id            = fileId,
                FileName      = file.FileName,
                FileType      = file.ContentType,
                FileSize      = file.Length,
                OwnerId       = Tools.AuthenticationManager.GetUserId(User),
                FolderId      = _folderId,
                Compressed    = compressed,
                Encrypted     = encrypted,
                EncryptionKey = result.EncryptionKey,
                IV            = result.IV,
                Favourite     = favourite,
                BucketId      = user.CurrentBucket.Id,
                AllowedUsers  = new List <ObjectId>()
            };
            await _filesRepository.InsertOneAsync(newFile);


            return(Ok(JsonSerializer.Serialize(
                          new UserFilesInfoFile(newFile),
                          new JsonSerializerOptions()
            {
                Converters =
                {
                    new UserFilesInfoFileSerializer()
                }
            })));
        }