public static ApiResponse <string> IsValidFormFileApiResponse(this IFormFileCollection formFiles, Func <IFormFile, bool> FormBlob, FormFileRules formFileRules)
        {
            if (formFileRules.AllowedBlobMaxLength <= 0)
            {
                throw new ArgumentException("The AllowedBlobMaxLength can't be zero or less.");
            }
            if (formFileRules.AllowedMinimunFiles <= 0)
            {
                throw new ArgumentException("The AllowedMinimunFiles can't be zero or less.");
            }
            if (formFileRules.AllowedMaximunFiles <= 0)
            {
                throw new ArgumentException("The AllowedMaximunFiles can't be zero or less.");
            }
            var blobs = FormBlob == null ? formFiles : formFiles.Where(FormBlob);

            if (!blobs.Any())
            {
                return(new ApiResponse <string>()
                {
                    Status = ApiResponseStatus.Failed, Message = "FileUploadRequired"
                });
            }
            else
            {
                if (blobs.Count() < formFileRules.AllowedMinimunFiles)
                {
                    return(new ApiResponse <string>()
                    {
                        Status = ApiResponseStatus.Failed, Message = "TheCountOfFilesUploadedHasExceededTheMaximunAllowedFiles"
                    });
                }
                if (blobs.Count() > formFileRules.AllowedMaximunFiles)
                {
                    return(new ApiResponse <string>()
                    {
                        Status = ApiResponseStatus.Failed, Message = "TheCountOfFilesUploadedIsLessThanTheMinimunAllowedFiles"
                    });
                }
                foreach (var blob in blobs)
                {
                    if (blob == null || blob.Length == 0)
                    {
                        return(new ApiResponse <string>()
                        {
                            Status = ApiResponseStatus.Failed, Message = "FileUploadRequired", Data = blob.Name
                        });
                    }
                    else if (blob.Length > formFileRules.AllowedBlobMaxLength)
                    {
                        return(new ApiResponse <string>()
                        {
                            Status = ApiResponseStatus.Failed, Message = "TheFileHasExceededTheLargestSizeAllowed", Data = blob.Name
                        });
                    }
                    else if (formFileRules.AllowedContentTypes != null && formFileRules.AllowedContentTypes.Any() && !formFileRules.AllowedContentTypes.Contains(blob.ContentType))
                    {
                        return(new ApiResponse <string>()
                        {
                            Status = ApiResponseStatus.Failed, Message = "TheFileDoesNotHaveTheExpectedContentType", Data = blob.Name
                        });
                    }
                    else if (formFileRules.AllowedExtensions != null && formFileRules.AllowedExtensions.Any() && !formFileRules.AllowedExtensions.Contains(Path.GetExtension(blob.FileName)))
                    {
                        return(new ApiResponse <string>()
                        {
                            Status = ApiResponseStatus.Failed, Message = "TheFileDoesNotHaveTheExpectedExtension", Data = blob.Name
                        });
                    }
                    else if (formFileRules.AllowedContentDispositions != null && formFileRules.AllowedContentDispositions.Any() && !formFileRules.AllowedContentDispositions.Contains(blob.ContentDisposition))
                    {
                        return(new ApiResponse <string>()
                        {
                            Status = ApiResponseStatus.Failed, Message = "TheFileDoesNotHaveTheExpectedContentDisposition", Data = blob.Name
                        });
                    }
                }
            }
            return(new ApiResponse <string>()
            {
                Status = ApiResponseStatus.Succeeded
            });
        }
 public static bool IsValidFormFile(this IFormFileCollection formFiles, Func <IFormFile, bool> FormBlob, FormFileRules formFileRules)
 {
     return(IsValidFormFileApiResponse(formFiles, FormBlob, formFileRules).Status == ApiResponseStatus.Succeeded);
 }
 public static ApiResponse <string> IsValidFormFileApiResponse(this IFormFileCollection formFiles, FormFileRules formFileRules)
 {
     return(IsValidFormFileApiResponse(formFiles, null, formFileRules));
 }
Example #4
0
        /// <summary>
        /// Check if a expected file is uploaded with specified file rules if any
        /// </summary>
        /// <param name="predicate"></param>
        /// <param name="formFileRules"></param>
        /// <returns></returns>
        public static async Task <IApiResponse <bool> > IsFormFileUploadedAsync(this BaseDbContext <AuditTrails, ExceptionLogs, UserBlobs> dbContext, IFormFileCollection files, Func <IFormFile, bool> predicate, FormFileRules formFileRules, string userId, string controllerName = null, string actionName = null, string remoteIpAddress = null)
        {
            var any = predicate == null?files.Any() : files.Any(predicate);

            if (!any)
            {
                await dbContext.CreateAuditrailsAsync(new UserBlobs(), "No file uploaded", userId, controllerName, actionName, remoteIpAddress);

                return(new ApiResponse <bool>()
                {
                    Status = ApiResponseStatus.Failed, Message = "FileIsNullOrEmpty", Data = false
                });
            }
            if (any && formFileRules != null)
            {
                var isValidFormFileApiResponse = files.IsValidFormFileApiResponse(predicate, formFileRules);
                if (isValidFormFileApiResponse.Status == ApiResponseStatus.Failed)
                {
                    return(new ApiResponse <bool>()
                    {
                        Status = ApiResponseStatus.Failed, Message = isValidFormFileApiResponse.Message, Data = false
                    });
                }
            }
            return(new ApiResponse <bool>()
            {
                Status = ApiResponseStatus.Succeeded, Data = true
            });
        }
 public static bool IsValidFormFile(this IFormFileCollection formFiles, FormFileRules formFileRules)
 {
     return(IsValidFormFile(formFiles, null, formFileRules));
 }
        /// <summary>
        /// Adds file/s from the http request
        /// </summary>
        /// <param name="predicate">Set this param if you want to read a file from a specific form field name.</param>
        /// <param name="formFileRules">The rules to apply to the file uploaded.</param>
        /// <returns></returns>
        public static async Task <IApiResponse <IEnumerable <UserBlobs> > > CreateRangeUserBlobsAsync(this BaseDbContext <AuditTrails, ExceptionLogs, UserBlobs> dbContext, IFormFileCollection files, Func <IFormFile, bool> predicate, FormFileRules formFileRules, IBlobStorage blobStorage, string userId, string tableName, string controllerName = null, string actionName = null, string remoteIpAddress = null)
        {
            var any = predicate == null?files.Any() : files.Any(predicate);

            if (any)
            {
                await dbContext.CreateAuditrailsAsync(new UserBlobs(), "No file/s uploaded", userId, controllerName, actionName, remoteIpAddress);

                return(new ApiResponse <IEnumerable <UserBlobs> >()
                {
                    Status = ApiResponseStatus.Failed, Message = "FileIsNullOrEmpty"
                });
            }
            if (any && formFileRules != null)
            {
                var isValidFormFileApiResponse = files.IsValidFormFileApiResponse(predicate, formFileRules);
                if (isValidFormFileApiResponse.Status == ApiResponseStatus.Failed)
                {
                    return(new ApiResponse <IEnumerable <UserBlobs> >()
                    {
                        Status = ApiResponseStatus.Failed, Message = isValidFormFileApiResponse.Message
                    });
                }
            }
            var createdOn = DateTime.Now;
            IEnumerable <IFormFile> formFiles = predicate == null?files.ToList() : files.Where(predicate);

            IList <UserBlobs> uploadedUserBlobs = new List <UserBlobs>();

            foreach (var file in formFiles)
            {
                var fileExtension  = Path.GetExtension(file.FileName);
                var uniqueFileName = Guid.NewGuid().ToString("N") + string.Empty.NewNumericIdentifier().ToString();
                var filename       = $"{uniqueFileName}{fileExtension}";
                await blobStorage.WriteAsync(filename, file.OpenReadStream());

                var userBlob = new UserBlobs().AutoMap(file);
                userBlob.FilePath  = filename;
                userBlob.CreatedBy = userId;
                userBlob.CreatedOn = createdOn;
                userBlob.TableName = tableName;
                uploadedUserBlobs.Add(userBlob);
                await dbContext.AddAuditedAsync(userBlob, "File was uploaded", userId, controllerName, actionName, remoteIpAddress);
            }
            var result = await dbContext.SaveChangesAsync();

            return(result.TransactionResultApiResponse(uploadedUserBlobs.AsEnumerable()));
        }
        /// <summary>
        /// This is a helper method which tryies to upload a file/s and bind the userblob to the model property name
        /// </summary>
        /// <param name="model">The model to bind the result</param>
        /// <param name="propertyName">The property name of the model to bind</param>
        /// <param name="predicate">The form file field name</param>
        /// <param name="formFileRules">The rules for the files</param>
        /// <returns></returns>
        public static async Task <IApiResponse <IEnumerable <UserBlobs> > > CreateRangeAndBindUserBlobsAsync(this BaseDbContext <AuditTrails, ExceptionLogs, UserBlobs> dbContext, object model, string propertyName, IFormFileCollection files, Func <IFormFile, bool> predicate, FormFileRules formFileRules, IBlobStorage blobStorage, string userId, string tableName, string controllerName = null, string actionName = null, string remoteIpAddress = null)
        {
            var isFormFileUploadedApiResponse = await dbContext.IsFormFileUploadedAsync(files, predicate, formFileRules, userId, controllerName, actionName, remoteIpAddress);

            if (isFormFileUploadedApiResponse.Status == ApiResponseStatus.Failed || !isFormFileUploadedApiResponse.Data)
            {
                return(new ApiResponse <IEnumerable <UserBlobs> >()
                {
                    Status = isFormFileUploadedApiResponse.Status, Message = isFormFileUploadedApiResponse.Message
                });
            }
            var blobs = await dbContext.CreateRangeUserBlobsAsync(files, predicate, formFileRules, blobStorage, userId, tableName, controllerName, actionName, remoteIpAddress);

            if (blobs.Status == ApiResponseStatus.Failed)
            {
                return(blobs);
            }
            model.GetType().GetProperty(propertyName).SetValue(model, JsonConvert.SerializeObject(blobs.Data));
            return(blobs);
        }
Example #8
0
        /// <summary>
        /// Updates a blob/s from the storage. Delete the provide userBlobs and upload the new files from the http request.
        /// </summary>
        /// <param name="UserBlobs">The user blob/s to delete</param>
        /// <param name="predicate">Set this param if you want to read a file from a specific form field name.</param>
        /// <param name="formFileRules">The rules to apply to the file uploaded.</param>
        /// <returns></returns>
        public static async Task <ApiResponse <Tuple <IEnumerable <UserBlobs>, IEnumerable <UserBlobs> > > > UpdateRangeUserBlobsAsync(this BaseDbContext <AuditTrails, ExceptionLogs, UserBlobs> dbContext, IEnumerable <UserBlobs> UserBlobs, IFormFileCollection files, Func <IFormFile, bool> predicate, FormFileRules formFileRules, IBlobStorage blobStorage, string userId, bool ignoreBlobOwner = false, string controllerName = null, string actionName = null, string remoteIpAddress = null)
        {
            var tableName = UserBlobs?.FirstOrDefault()?.TableName;
            var addMultipleApiResponse = await dbContext.CreateRangeUserBlobsAsync(files, predicate, formFileRules, blobStorage, userId, tableName, controllerName, actionName, remoteIpAddress);

            if (addMultipleApiResponse.Status == ApiResponseStatus.Failed)
            {
                return(new ApiResponse <Tuple <IEnumerable <UserBlobs>, IEnumerable <UserBlobs> > >()
                {
                    Data = Tuple.Create(addMultipleApiResponse.Data, new List <UserBlobs>().AsEnumerable()), Message = addMultipleApiResponse.Message, Status = ApiResponseStatus.Failed
                });
            }
            var deleteMultipleApiResponse = await dbContext.DeleteRangeUserBlobsAsync(UserBlobs, blobStorage, userId, ignoreBlobOwner, controllerName, actionName, remoteIpAddress);

            if (deleteMultipleApiResponse.Status == ApiResponseStatus.Failed)
            {
                return(new ApiResponse <Tuple <IEnumerable <UserBlobs>, IEnumerable <UserBlobs> > >()
                {
                    Data = Tuple.Create(addMultipleApiResponse.Data, deleteMultipleApiResponse.Data), Message = deleteMultipleApiResponse.Message, Status = ApiResponseStatus.Failed
                });
            }
            return(new ApiResponse <Tuple <IEnumerable <UserBlobs>, IEnumerable <UserBlobs> > >()
            {
                Data = Tuple.Create(addMultipleApiResponse.Data, deleteMultipleApiResponse.Data), Status = ApiResponseStatus.Failed
            });
        }
Example #9
0
        /// <summary>
        /// This is a helper method which tryies to upload a file and bind the userblob to the model property name
        /// </summary>
        /// <param name="model">The model to bind the result</param>
        /// <param name="propertyName">The property name of the model to bind</param>
        /// <param name="predicate">The form file field name</param>
        /// <param name="formFileRules">The rules for the files</param>
        /// <returns></returns>
        public static async Task <IApiResponse <Tuple <UserBlobs, UserBlobs> > > UpdateRangeAndBindUserBlobsAsync(this BaseDbContext <AuditTrails, ExceptionLogs, UserBlobs> dbContext, object model, string propertyName, UserBlobs userBlobs, IFormFileCollection files, Func <IFormFile, bool> predicate, FormFileRules formFileRules, IBlobStorage blobStorage, string userId, bool ignoreBlobOwner = false, string controllerName = null, string actionName = null, string remoteIpAddress = null)
        {
            var blob = await dbContext.UpdateUserBlobsAsync(userBlobs, files, predicate, formFileRules, blobStorage, userId, ignoreBlobOwner, controllerName, actionName, remoteIpAddress);

            model.GetType().GetProperty(propertyName).SetValue(model, JsonConvert.SerializeObject(blob.Data.Item1));
            return(blob);
        }
Example #10
0
        /// <summary>
        /// Updates a blob from the storage. Delete the provide userBlob and upload the new file from the http request.
        /// </summary>
        /// <param name="UserBlobs">The user blob to delete</param>
        /// <param name="predicate">Set this param if you want to read a file from a specific form field name.</param>
        /// <param name="formFileRules">The rules to apply to the file uploaded.</param>
        /// <returns></returns>
        public static async Task <IApiResponse <Tuple <UserBlobs, UserBlobs> > > UpdateUserBlobsAsync(this BaseDbContext <AuditTrails, ExceptionLogs, UserBlobs> dbContext, UserBlobs userBlobs, IFormFileCollection files, Func <IFormFile, bool> predicate, FormFileRules formFileRules, IBlobStorage blobStorage, string userId, bool ignoreBlobOwner = false, string controllerName = null, string actionName = null, string remoteIpAddress = null)
        {
            var addHttpBlobApiResponse = await dbContext.CreateUserBlobsAsync(files, predicate, formFileRules, blobStorage, userId, userBlobs.TableName, controllerName, actionName, remoteIpAddress);

            if (addHttpBlobApiResponse.Status == ApiResponseStatus.Failed)
            {
                return(new ApiResponse <Tuple <UserBlobs, UserBlobs> >()
                {
                    Data = Tuple.Create(addHttpBlobApiResponse.Data, new UserBlobs()), Message = addHttpBlobApiResponse.Message, Status = ApiResponseStatus.Failed
                });
            }
            var deleteBlobApiResponse = await dbContext.DeleteUserBlobsAsync(userBlobs, blobStorage, userId, ignoreBlobOwner, controllerName, actionName, remoteIpAddress);

            if (addHttpBlobApiResponse.Status == ApiResponseStatus.Failed)
            {
                return(new ApiResponse <Tuple <UserBlobs, UserBlobs> >()
                {
                    Data = Tuple.Create(addHttpBlobApiResponse.Data, deleteBlobApiResponse.Data), Message = deleteBlobApiResponse.Message, Status = ApiResponseStatus.Failed
                });
            }
            return(new ApiResponse <Tuple <UserBlobs, UserBlobs> > {
                Data = Tuple.Create(addHttpBlobApiResponse.Data, deleteBlobApiResponse.Data), Status = ApiResponseStatus.Succeeded
            });
        }