summaryrefslogtreecommitdiffstats
path: root/src/Program.cs
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2023-01-13 20:21:20 +0100
committerivarlovlie <git@ivarlovlie.no>2023-01-13 20:21:20 +0100
commit0ae5a68a9d81547bb9b741458d94b5f1b7374027 (patch)
tree485384d892cdfe4dc6af79f3cf0abe11d2e552b1 /src/Program.cs
parent971c00b8f5977db9422eeafa47b262c1030bd4af (diff)
downloadblob-bin-0ae5a68a9d81547bb9b741458d94b5f1b7374027.tar.xz
blob-bin-0ae5a68a9d81547bb9b741458d94b5f1b7374027.zip
feat: First dev release
Diffstat (limited to 'src/Program.cs')
-rw-r--r--src/Program.cs120
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