From 5514d79b6707b3829ec98e64d7703527abdf5052 Mon Sep 17 00:00:00 2001 From: michael-bailey Date: Sun, 1 Jun 2025 19:04:35 +0100 Subject: [PATCH] Cleaned up file controller and repositories. --- .../FileStorageService.www.Test.csproj | 11 ++++++-- .../Repositories/FileRepositoryTests.cs | 12 ++++++-- .../Controllers/FilesController.cs | 5 +--- FileStorageService.www/Data/FileBlock.cs | 2 +- FileStorageService.www/Program.cs | 5 ++-- .../Properties/launchSettings.json | 2 +- .../Repositories/FileRepository.cs | 28 +++++++++++++------ 7 files changed, 43 insertions(+), 22 deletions(-) diff --git a/FileStorageService.www.Test/FileStorageService.www.Test.csproj b/FileStorageService.www.Test/FileStorageService.www.Test.csproj index eeec78a..8269de7 100644 --- a/FileStorageService.www.Test/FileStorageService.www.Test.csproj +++ b/FileStorageService.www.Test/FileStorageService.www.Test.csproj @@ -13,10 +13,15 @@ + - - - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/FileStorageService.www.Test/Repositories/FileRepositoryTests.cs b/FileStorageService.www.Test/Repositories/FileRepositoryTests.cs index 5e329e8..d5efa9e 100644 --- a/FileStorageService.www.Test/Repositories/FileRepositoryTests.cs +++ b/FileStorageService.www.Test/Repositories/FileRepositoryTests.cs @@ -2,15 +2,24 @@ using FileStorageService.www.Data; using FileStorageService.www.Repositories; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Moq; namespace FileStorageService.www.Test.Repositories; public class FileRepositoryTests { + private readonly Logger _logger; private readonly ApplicationDbContext _context; public FileRepositoryTests() { + var mock = new Mock>(); + + mock.SetupAllProperties(); + + _logger = mock.Object; + var connection = new SqliteConnection("Filename=:memory:"); connection.Open(); @@ -24,8 +33,7 @@ public class FileRepositoryTests _context.Database.EnsureCreated(); } - private FileRepository repository => new FileRepository(_context); - + private FileRepository repository => new(_logger, _context); [Theory] [InlineData("one", 1)] diff --git a/FileStorageService.www/Controllers/FilesController.cs b/FileStorageService.www/Controllers/FilesController.cs index e4f7afa..961b3f2 100644 --- a/FileStorageService.www/Controllers/FilesController.cs +++ b/FileStorageService.www/Controllers/FilesController.cs @@ -75,10 +75,7 @@ public class FilesController( var fileHandleId = await fileRepository.TryNewFileAsync(name, stream); - if (fileHandleId != null) - return RedirectToAction("Index", "Files", new { id = fileHandleId }); - - return RedirectToAction("NotEnoughSpace"); + return fileHandleId != null ? RedirectToAction("Index", "Files", new { id = fileHandleId }) : RedirectToAction("NotEnoughSpace"); } public IActionResult NotEnoughSpace() diff --git a/FileStorageService.www/Data/FileBlock.cs b/FileStorageService.www/Data/FileBlock.cs index 1b6ebdc..21667d1 100644 --- a/FileStorageService.www/Data/FileBlock.cs +++ b/FileStorageService.www/Data/FileBlock.cs @@ -12,7 +12,7 @@ public class FileBlock public required int BlockNumber { get; init; } [DataType("BLOB")] - [MaxLength(1024)] + [MaxLength(4096)] public required byte[] Data { get; init; } public required FileHandle FileHandle { get; init; } diff --git a/FileStorageService.www/Program.cs b/FileStorageService.www/Program.cs index da9f7a5..3bd566f 100644 --- a/FileStorageService.www/Program.cs +++ b/FileStorageService.www/Program.cs @@ -23,6 +23,7 @@ builder.Services.AddScoped(); var app = builder.Build(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { @@ -31,10 +32,10 @@ if (app.Environment.IsDevelopment()) else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); + // app.UseHsts(); } -app.UseHttpsRedirection(); +// app.UseHttpsRedirection(); app.UseStatusCodePagesWithRedirects("/Error/Status/{0}"); diff --git a/FileStorageService.www/Properties/launchSettings.json b/FileStorageService.www/Properties/launchSettings.json index 26b8226..412133a 100644 --- a/FileStorageService.www/Properties/launchSettings.json +++ b/FileStorageService.www/Properties/launchSettings.json @@ -5,7 +5,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "http://localhost:5197", + "applicationUrl": "http://localhost:5197;http://british-information-technologies.org:5197", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/FileStorageService.www/Repositories/FileRepository.cs b/FileStorageService.www/Repositories/FileRepository.cs index 5b187f4..5b008f5 100644 --- a/FileStorageService.www/Repositories/FileRepository.cs +++ b/FileStorageService.www/Repositories/FileRepository.cs @@ -5,9 +5,12 @@ using Microsoft.EntityFrameworkCore; namespace FileStorageService.www.Repositories; -public class FileRepository(ApplicationDbContext context) +public class FileRepository( + ILogger logger, + ApplicationDbContext context) { public static readonly int MAX_BLOCKS = 10_485_760; + public static readonly int BLOCK_SIZE = 4096; private readonly Queue<(string, Stream, TaskCompletionSource)> _creationQueue = new(); private readonly Lock _countLock = new(); @@ -66,7 +69,7 @@ public class FileRepository(ApplicationDbContext context) return tcs.Task; } - + private async Task StartProcessFileUpload() { Stream stream; @@ -107,17 +110,24 @@ public class FileRepository(ApplicationDbContext context) private async Task CreateFileBlocks(Stream reader, FileHandle fileHandle) { var blockNumber = 0; - var buffer = new byte[1024]; + var buffer = new byte[BLOCK_SIZE]; + while (await reader.ReadAsync(buffer) > 0) { - var block = new FileBlock + var num = blockNumber++; + Task.Run(() => { - BlockNumber = blockNumber++, - Data = buffer.ToArray(), - FileHandle = fileHandle - }; - fileHandle.FileBlocks.Add(block); + var block = new FileBlock + { + BlockNumber = num, + Data = buffer.ToArray(), + FileHandle = fileHandle + }; + fileHandle.FileBlocks.Add(block); + + logger.LogInformation($"Saved block {num}"); + }); } return fileHandle;