diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2023-01-13 20:21:20 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2023-01-13 20:21:20 +0100 |
| commit | 0ae5a68a9d81547bb9b741458d94b5f1b7374027 (patch) | |
| tree | 485384d892cdfe4dc6af79f3cf0abe11d2e552b1 /src/Program.cs | |
| parent | 971c00b8f5977db9422eeafa47b262c1030bd4af (diff) | |
| download | blob-bin-0ae5a68a9d81547bb9b741458d94b5f1b7374027.tar.xz blob-bin-0ae5a68a9d81547bb9b741458d94b5f1b7374027.zip | |
feat: First dev release
Diffstat (limited to 'src/Program.cs')
| -rw-r--r-- | src/Program.cs | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/Program.cs b/src/Program.cs new file mode 100644 index 0000000..01ca76b --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,120 @@ +global using BlobBin; +using IOL.Helpers; +using Microsoft.EntityFrameworkCore; +using File = BlobBin.File; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddDbContext<DB>(opt => opt.UseSqlite("data source=main.db")); +var app = builder.Build(); + +app.UseFileServer(); +app.UseStatusCodePages(); +app.MapGet("/upload-link", GetUploadLink); +app.MapPost("/upload/{id}", UploadBig); +app.MapPost("/upload", UploadSimple); +app.MapPost("/text", UploadText); +app.MapGet("/b/{id}", GetBlob); +app.Run(); + +IResult GetUploadLink(HttpContext context, DB db) { + var file = new File { + CreatedBy = context.Request.Headers["X-Forwarded-For"].ToString() + }; + db.Files.Add(file); + db.SaveChanges(); + return Results.Text( + context.Request.GetRequestHost() + + "/upload/" + + file.Id + ); +} + +async Task<IResult> UploadSimple(HttpContext context, DB db) { + if (!context.Request.Form.Files.Any()) { + return Results.BadRequest("No files was found in request"); + } + + var file = new File { + CreatedBy = context.Request.Headers["X-Forwarded-For"].ToString(), + Singleton = context.Request.Form["singleton"] == "on", + AutoDeleteAfter = context.Request.Form["autoDeleteAfter"], + Length = context.Request.Form.Files[0].Length, + Name = context.Request.Form.Files[0].FileName, + MimeType = context.Request.Form.Files[0].ContentType, + PublicId = GetUnusedBlobId(db) + }; + + if (context.Request.Form["password"].ToString().HasValue()) { + file.PasswordHash = PasswordHelper.HashPassword(context.Request.Form["password"]); + } + + + await using var write = System.IO.File.OpenWrite( + Path.Combine(GetFilesDirectoryPath(), file.Id.ToString()) + ); + await context.Request.Form.Files[0].CopyToAsync(write); + db.Files.Add(file); + db.SaveChanges(); + return Results.Text( + context.Request.GetRequestHost() + + "/b/" + + file.PublicId + ); +} + +IResult UploadBig(HttpContext context, DB db) { + return Results.Ok(); +} + +IResult UploadText(HttpContext context, DB db) { + return Results.Ok(); +} + +async Task<IResult> GetBlob(string id, DB db) { + var file = db.Files.FirstOrDefault(c => c.PublicId == id.Trim()); + if (file == default) return Results.NotFound(); + var reader = await System.IO.File.ReadAllBytesAsync( + Path.Combine( + GetFilesDirectoryPath(), file.Id.ToString() + ) + ); + return Results.File(reader, file.MimeType, file.Name); +} + +string GetFilesDirectoryPath() { + var filesDirectoryPath = Path.Combine( + Directory.GetCurrentDirectory(), + "AppData", + "files" + ); + Directory.CreateDirectory(filesDirectoryPath); + return filesDirectoryPath; +} + +string GetUnusedBlobId(DB db) { + string id() => RandomString.Generate(3); + var res = id(); + while (db.Files.Any(c => c.PublicId == res)) { + res = id(); + } + + return res; +} + +class BlobBase +{ + public string Password { get; set; } + public bool Singleton { get; set; } + public string AutoDeleteAfter { get; set; } +} + +class PasteRequest : BlobBase +{ + public string Text { get; set; } + public string Mime { get; set; } +} + +class UploadRequest : BlobBase +{ + public IFormFile? File { get; set; } +}
\ No newline at end of file |
