diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2023-01-10 21:46:03 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2023-01-10 21:46:03 +0100 |
| commit | a9860b28f2be123d1f0bfad504165992a4c841ed (patch) | |
| tree | 12c0683e18cb1efd4dd202d0d011f5902df950c2 /BlobBin | |
| parent | 9d7152b5ca085c70e9b0d94adb6f5f9ff8d6f127 (diff) | |
| download | blob-bin-a9860b28f2be123d1f0bfad504165992a4c841ed.tar.xz blob-bin-a9860b28f2be123d1f0bfad504165992a4c841ed.zip | |
feat: feat
Diffstat (limited to 'BlobBin')
| -rw-r--r-- | BlobBin/BlobBin.csproj | 8 | ||||
| -rw-r--r-- | BlobBin/DB.cs | 41 | ||||
| -rw-r--r-- | BlobBin/Migrations/20230110204008_InitialCreate.Designer.cs | 105 | ||||
| -rw-r--r-- | BlobBin/Migrations/20230110204008_InitialCreate.cs | 65 | ||||
| -rw-r--r-- | BlobBin/Migrations/DBModelSnapshot.cs | 102 | ||||
| -rw-r--r-- | BlobBin/Program.cs | 26 |
6 files changed, 336 insertions, 11 deletions
diff --git a/BlobBin/BlobBin.csproj b/BlobBin/BlobBin.csproj index cd8d47d..263a517 100644 --- a/BlobBin/BlobBin.csproj +++ b/BlobBin/BlobBin.csproj @@ -8,8 +8,12 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" /> - <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> + <PackageReference Include="IOL.Helpers" Version="3.1.0" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.2"> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + <PrivateAssets>all</PrivateAssets> + </PackageReference> + <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" /> </ItemGroup> <ItemGroup> diff --git a/BlobBin/DB.cs b/BlobBin/DB.cs new file mode 100644 index 0000000..5146304 --- /dev/null +++ b/BlobBin/DB.cs @@ -0,0 +1,41 @@ +using Microsoft.EntityFrameworkCore; + +namespace BlobBin; + +public class DB : DbContext +{ + public DB(DbContextOptions<DB> options) : base(options) { } + + public DbSet<File> Files { get; set; } + public DbSet<Paste> Pastes { get; set; } +} + +public class UploadEntityBase +{ + public UploadEntityBase() { + Id = Guid.NewGuid(); + CreatedAt = DateTime.UtcNow; + } + + public Guid Id { get; set; } + public DateTime CreatedAt { get; set; } + public string CreatedBy { get; set; } + public DateTime? DeletedAt { get; set; } + public string? PasswordHash { get; set; } + public bool Singleton { get; set; } + public string? AutoDeleteAfter { get; set; } + public string? MimeType { get; set; } +} + +public class File : UploadEntityBase +{ + public string? Name { get; set; } + public long Length { get; set; } +} + +public class Paste : UploadEntityBase +{ + public string? Name { get; set; } + public string? Content { get; set; } + public long Length { get; set; } +}
\ No newline at end of file diff --git a/BlobBin/Migrations/20230110204008_InitialCreate.Designer.cs b/BlobBin/Migrations/20230110204008_InitialCreate.Designer.cs new file mode 100644 index 0000000..f461df5 --- /dev/null +++ b/BlobBin/Migrations/20230110204008_InitialCreate.Designer.cs @@ -0,0 +1,105 @@ +// <auto-generated /> +using System; +using BlobBin; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BlobBin.Migrations +{ + [DbContext(typeof(DB))] + [Migration("20230110204008_InitialCreate")] + partial class InitialCreate + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + + modelBuilder.Entity("BlobBin.File", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property<string>("AutoDeleteAfter") + .HasColumnType("TEXT"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("TEXT"); + + b.Property<string>("CreatedBy") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<DateTime?>("DeletedAt") + .HasColumnType("TEXT"); + + b.Property<long>("Length") + .HasColumnType("INTEGER"); + + b.Property<string>("MimeType") + .HasColumnType("TEXT"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<string>("PasswordHash") + .HasColumnType("TEXT"); + + b.Property<bool>("Singleton") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("BlobBin.Paste", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property<string>("AutoDeleteAfter") + .HasColumnType("TEXT"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("TEXT"); + + b.Property<string>("CreatedBy") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<DateTime?>("DeletedAt") + .HasColumnType("TEXT"); + + b.Property<long>("Length") + .HasColumnType("INTEGER"); + + b.Property<string>("MimeType") + .HasColumnType("TEXT"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<string>("PasswordHash") + .HasColumnType("TEXT"); + + b.Property<bool>("Singleton") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Pastes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BlobBin/Migrations/20230110204008_InitialCreate.cs b/BlobBin/Migrations/20230110204008_InitialCreate.cs new file mode 100644 index 0000000..1614b01 --- /dev/null +++ b/BlobBin/Migrations/20230110204008_InitialCreate.cs @@ -0,0 +1,65 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BlobBin.Migrations +{ + /// <inheritdoc /> + public partial class InitialCreate : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Files", + columns: table => new + { + Id = table.Column<Guid>(type: "TEXT", nullable: false), + Name = table.Column<string>(type: "TEXT", nullable: false), + Length = table.Column<long>(type: "INTEGER", nullable: false), + CreatedAt = table.Column<DateTime>(type: "TEXT", nullable: false), + CreatedBy = table.Column<string>(type: "TEXT", nullable: false), + DeletedAt = table.Column<DateTime>(type: "TEXT", nullable: true), + PasswordHash = table.Column<string>(type: "TEXT", nullable: true), + Singleton = table.Column<bool>(type: "INTEGER", nullable: false), + AutoDeleteAfter = table.Column<string>(type: "TEXT", nullable: true), + MimeType = table.Column<string>(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Files", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Pastes", + columns: table => new + { + Id = table.Column<Guid>(type: "TEXT", nullable: false), + Name = table.Column<string>(type: "TEXT", nullable: false), + Length = table.Column<long>(type: "INTEGER", nullable: false), + CreatedAt = table.Column<DateTime>(type: "TEXT", nullable: false), + CreatedBy = table.Column<string>(type: "TEXT", nullable: false), + DeletedAt = table.Column<DateTime>(type: "TEXT", nullable: true), + PasswordHash = table.Column<string>(type: "TEXT", nullable: true), + Singleton = table.Column<bool>(type: "INTEGER", nullable: false), + AutoDeleteAfter = table.Column<string>(type: "TEXT", nullable: true), + MimeType = table.Column<string>(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Pastes", x => x.Id); + }); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Files"); + + migrationBuilder.DropTable( + name: "Pastes"); + } + } +} diff --git a/BlobBin/Migrations/DBModelSnapshot.cs b/BlobBin/Migrations/DBModelSnapshot.cs new file mode 100644 index 0000000..b81feae --- /dev/null +++ b/BlobBin/Migrations/DBModelSnapshot.cs @@ -0,0 +1,102 @@ +// <auto-generated /> +using System; +using BlobBin; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BlobBin.Migrations +{ + [DbContext(typeof(DB))] + partial class DBModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + + modelBuilder.Entity("BlobBin.File", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property<string>("AutoDeleteAfter") + .HasColumnType("TEXT"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("TEXT"); + + b.Property<string>("CreatedBy") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<DateTime?>("DeletedAt") + .HasColumnType("TEXT"); + + b.Property<long>("Length") + .HasColumnType("INTEGER"); + + b.Property<string>("MimeType") + .HasColumnType("TEXT"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<string>("PasswordHash") + .HasColumnType("TEXT"); + + b.Property<bool>("Singleton") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("BlobBin.Paste", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property<string>("AutoDeleteAfter") + .HasColumnType("TEXT"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("TEXT"); + + b.Property<string>("CreatedBy") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<DateTime?>("DeletedAt") + .HasColumnType("TEXT"); + + b.Property<long>("Length") + .HasColumnType("INTEGER"); + + b.Property<string>("MimeType") + .HasColumnType("TEXT"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property<string>("PasswordHash") + .HasColumnType("TEXT"); + + b.Property<bool>("Singleton") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Pastes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BlobBin/Program.cs b/BlobBin/Program.cs index 085bd6e..acf3e5f 100644 --- a/BlobBin/Program.cs +++ b/BlobBin/Program.cs @@ -1,25 +1,33 @@ -var builder = WebApplication.CreateBuilder(args); +global using BlobBin; +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.MapPost("/upload", Upload); +app.MapGet("/upload-link", GetUploadLink); +app.MapPost("/upload/{id}", GetUploadLink); app.MapPost("/text", UploadText); app.MapGet("/b/{id}", GetBlob); app.Run(); -IResult Upload(HttpContext context) { - var request = new UploadRequest() { - Singleton = context.Request.Form["singleton"] == "on", - File = context.Request.Form.Files.FirstOrDefault(), - Password = context.Request.Form["password"], - AutoDeleteAfter = context.Request.Form["autoDeleteAfter"] +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.Ok(context.Request.Host.Value + "/upload/" + file.Id); +} + +IResult Upload(HttpContext context, DB db) { return Results.Ok(); } -IResult UploadText(PasteRequest request) { +IResult UploadText(HttpContext context, DB db) { return Results.Ok(); } |
