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)); }
/// <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); }
/// <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 }); }
/// <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); }
/// <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 }); }