mirror of
https://github.com/LBPUnion/ProjectLighthouse.git
synced 2025-07-29 08:28:39 +00:00
Add database changes for allowing multiple resources
This commit is contained in:
parent
685f57fd28
commit
e63a4b812a
8 changed files with 442 additions and 13 deletions
|
@ -25,7 +25,7 @@ namespace ProjectLighthouse.Controllers {
|
|||
Slot slot = await this.GetSlotFromBody();
|
||||
if(slot == null) return this.BadRequest(); // if the level cant be parsed then it obviously cant be uploaded
|
||||
|
||||
string resource = LbpSerializer.StringElement("resource", slot.Resource);
|
||||
string resource = LbpSerializer.StringElement("resource", slot.Resources);
|
||||
|
||||
return this.Ok(LbpSerializer.TaggedStringElement("slot", resource, "type", "user"));
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
@ -26,10 +25,10 @@ namespace ProjectLighthouse.Controllers {
|
|||
|
||||
[HttpGet("r/{hash}")]
|
||||
public IActionResult GetResource(string hash) {
|
||||
string path = Path.Combine(Environment.CurrentDirectory, "r", hash);
|
||||
string path = FileHelper.GetResourcePath(hash);
|
||||
|
||||
if(IOFile.Exists(path)) {
|
||||
return this.File(IOFile.OpenRead(path), "image/jpg");
|
||||
if(FileHelper.ResourceExists(hash)) {
|
||||
return this.File(IOFile.OpenRead(path), "application/octet-stream");
|
||||
}
|
||||
return this.NotFound();
|
||||
}
|
||||
|
@ -37,11 +36,11 @@ namespace ProjectLighthouse.Controllers {
|
|||
// TODO: check if this is a valid hash
|
||||
[HttpPost("upload/{hash}")]
|
||||
public async Task<IActionResult> UploadResource(string hash) {
|
||||
string assetsDirectory = Path.Combine(Environment.CurrentDirectory, "r");
|
||||
string path = Path.Combine(assetsDirectory, hash);
|
||||
string assetsDirectory = FileHelper.ResourcePath;
|
||||
string path = FileHelper.GetResourcePath(hash);
|
||||
|
||||
if(!Directory.Exists(assetsDirectory)) Directory.CreateDirectory(assetsDirectory);
|
||||
if(IOFile.Exists(path)) this.Ok(); // no reason to fail if it's already uploaded
|
||||
FileHelper.EnsureDirectoryCreated(assetsDirectory);
|
||||
if(FileHelper.ResourceExists(hash)) this.Ok(); // no reason to fail if it's already uploaded
|
||||
|
||||
LbpFile file = new(Encoding.ASCII.GetBytes(await new StreamReader(Request.Body).ReadToEndAsync()));
|
||||
|
||||
|
|
|
@ -22,6 +22,14 @@ namespace ProjectLighthouse {
|
|||
MySqlServerVersion.LatestSupportedServerVersion
|
||||
);
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder) {
|
||||
base.OnModelCreating(modelBuilder);
|
||||
|
||||
modelBuilder.Entity<Slot>()
|
||||
.Property<string>(nameof(Slot.ResourceCollection))
|
||||
.HasField(nameof(Slot.ResourceCollection));
|
||||
}
|
||||
|
||||
public async Task<User> CreateUser(string username) {
|
||||
User user;
|
||||
if((user = await Users.Where(u => u.Username == username).FirstOrDefaultAsync()) != null)
|
||||
|
|
|
@ -1,10 +1,16 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using ProjectLighthouse.Types.Files;
|
||||
|
||||
namespace ProjectLighthouse.Helpers {
|
||||
public static class FileHelper {
|
||||
public static readonly string ResourcePath = Path.Combine(Environment.CurrentDirectory, "r");
|
||||
|
||||
public static string GetResourcePath(string hash) => Path.Combine(ResourcePath, hash);
|
||||
|
||||
public static bool IsFileSafe(LbpFile file) {
|
||||
if(file.FileType == LbpFileType.Unknown) file.FileType = DetermineFileType(file.Data);
|
||||
|
||||
|
@ -38,5 +44,13 @@ namespace ProjectLighthouse.Helpers {
|
|||
_ => LbpFileType.Unknown,
|
||||
};
|
||||
}
|
||||
|
||||
public static bool ResourceExists(string hash) => File.Exists(GetResourcePath(hash));
|
||||
|
||||
public static void EnsureDirectoryCreated(string path) {
|
||||
if(!Directory.Exists(path)) Directory.CreateDirectory(path ?? throw new ArgumentNullException(nameof(path)));
|
||||
}
|
||||
|
||||
public static string[] ResourcesNotUploaded(params string[] hashes) => hashes.Where(hash => !ResourceExists(hash)).ToArray();
|
||||
}
|
||||
}
|
378
ProjectLighthouse/Migrations/20211020220840_ResourceList.Designer.cs
generated
Normal file
378
ProjectLighthouse/Migrations/20211020220840_ResourceList.Designer.cs
generated
Normal file
|
@ -0,0 +1,378 @@
|
|||
// <auto-generated />
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using ProjectLighthouse;
|
||||
|
||||
namespace ProjectLighthouse.Migrations
|
||||
{
|
||||
[DbContext(typeof(Database))]
|
||||
[Migration("20211020220840_ResourceList")]
|
||||
partial class ResourceList
|
||||
{
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 64)
|
||||
.HasAnnotation("ProductVersion", "5.0.11");
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.Comment", b =>
|
||||
{
|
||||
b.Property<int>("CommentId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Message")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<int>("PosterUserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("TargetUserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("ThumbsDown")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("ThumbsUp")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<long>("Timestamp")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.HasKey("CommentId");
|
||||
|
||||
b.HasIndex("PosterUserId");
|
||||
|
||||
b.HasIndex("TargetUserId");
|
||||
|
||||
b.ToTable("Comments");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.HeartedLevel", b =>
|
||||
{
|
||||
b.Property<int>("HeartedLevelId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("SlotId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("HeartedLevelId");
|
||||
|
||||
b.HasIndex("SlotId");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("HeartedLevels");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.LastMatch", b =>
|
||||
{
|
||||
b.Property<int>("UserId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<long>("Timestamp")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.HasKey("UserId");
|
||||
|
||||
b.ToTable("LastMatches");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.Location", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("X")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("Y")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Locations");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.QueuedLevel", b =>
|
||||
{
|
||||
b.Property<int>("QueuedLevelId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("SlotId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("QueuedLevelId");
|
||||
|
||||
b.HasIndex("SlotId");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("QueuedLevels");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.Slot", b =>
|
||||
{
|
||||
b.Property<int>("SlotId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("AuthorLabels")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("BackgroundHash")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<int>("CreatorId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("IconHash")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<bool>("InitiallyLocked")
|
||||
.HasColumnType("tinyint(1)");
|
||||
|
||||
b.Property<bool>("Lbp1Only")
|
||||
.HasColumnType("tinyint(1)");
|
||||
|
||||
b.Property<int>("LocationId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("MaximumPlayers")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("MinimumPlayers")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<bool>("MoveRequired")
|
||||
.HasColumnType("tinyint(1)");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("ResourceCollection")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("RootLevel")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<int>("Shareable")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<bool>("SubLevel")
|
||||
.HasColumnType("tinyint(1)");
|
||||
|
||||
b.HasKey("SlotId");
|
||||
|
||||
b.HasIndex("CreatorId");
|
||||
|
||||
b.HasIndex("LocationId");
|
||||
|
||||
b.ToTable("Slots");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.Token", b =>
|
||||
{
|
||||
b.Property<int>("TokenId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("UserToken")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.HasKey("TokenId");
|
||||
|
||||
b.ToTable("Tokens");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.User", b =>
|
||||
{
|
||||
b.Property<int>("UserId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Biography")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("BooHash")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<int>("CommentCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<bool>("CommentsEnabled")
|
||||
.HasColumnType("tinyint(1)");
|
||||
|
||||
b.Property<int>("FavouriteSlotCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("FavouriteUserCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("Game")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("HeartCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("IconHash")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<int>("Lists")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("LocationId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("LolCatFtwCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("PhotosByMeCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("PhotosWithMeCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Pins")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("PlanetHash")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<int>("ReviewCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("StaffChallengeBronzeCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("StaffChallengeGoldCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("StaffChallengeSilverCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("UsedSlots")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Username")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("YayHash")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.HasKey("UserId");
|
||||
|
||||
b.HasIndex("LocationId");
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.Comment", b =>
|
||||
{
|
||||
b.HasOne("ProjectLighthouse.Types.User", "Poster")
|
||||
.WithMany()
|
||||
.HasForeignKey("PosterUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("ProjectLighthouse.Types.User", "Target")
|
||||
.WithMany()
|
||||
.HasForeignKey("TargetUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Poster");
|
||||
|
||||
b.Navigation("Target");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.HeartedLevel", b =>
|
||||
{
|
||||
b.HasOne("ProjectLighthouse.Types.Slot", "Slot")
|
||||
.WithMany()
|
||||
.HasForeignKey("SlotId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("ProjectLighthouse.Types.User", "User")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Slot");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.QueuedLevel", b =>
|
||||
{
|
||||
b.HasOne("ProjectLighthouse.Types.Slot", "Slot")
|
||||
.WithMany()
|
||||
.HasForeignKey("SlotId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("ProjectLighthouse.Types.User", "User")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Slot");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.Slot", b =>
|
||||
{
|
||||
b.HasOne("ProjectLighthouse.Types.User", "Creator")
|
||||
.WithMany()
|
||||
.HasForeignKey("CreatorId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("ProjectLighthouse.Types.Location", "Location")
|
||||
.WithMany()
|
||||
.HasForeignKey("LocationId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Creator");
|
||||
|
||||
b.Navigation("Location");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("ProjectLighthouse.Types.User", b =>
|
||||
{
|
||||
b.HasOne("ProjectLighthouse.Types.Location", "Location")
|
||||
.WithMany()
|
||||
.HasForeignKey("LocationId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Location");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
23
ProjectLighthouse/Migrations/20211020220840_ResourceList.cs
Normal file
23
ProjectLighthouse/Migrations/20211020220840_ResourceList.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
namespace ProjectLighthouse.Migrations
|
||||
{
|
||||
public partial class ResourceList : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.RenameColumn(
|
||||
name: "Resource",
|
||||
table: "Slots",
|
||||
newName: "ResourceCollection");
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.RenameColumn(
|
||||
name: "ResourceCollection",
|
||||
table: "Slots",
|
||||
newName: "Resource");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -164,7 +164,7 @@ namespace ProjectLighthouse.Migrations
|
|||
b.Property<string>("Name")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("Resource")
|
||||
b.Property<string>("ResourceCollection")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<string>("RootLevel")
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Xml.Serialization;
|
||||
|
@ -30,8 +31,14 @@ namespace ProjectLighthouse.Types {
|
|||
[XmlElement("rootLevel")]
|
||||
public string RootLevel { get; set; }
|
||||
|
||||
public string ResourceCollection;
|
||||
|
||||
[NotMapped]
|
||||
[XmlElement("resource")]
|
||||
public string Resource { get; set; }
|
||||
public string[] Resources {
|
||||
get => this.ResourceCollection.Split(",");
|
||||
set => this.ResourceCollection = string.Join(',', value);
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public int LocationId { get; set; }
|
||||
|
@ -84,7 +91,7 @@ namespace ProjectLighthouse.Types {
|
|||
LbpSerializer.StringElement("description", Description) +
|
||||
LbpSerializer.StringElement("icon", IconHash) +
|
||||
LbpSerializer.StringElement("rootLevel", RootLevel) +
|
||||
LbpSerializer.StringElement("resource", Resource) +
|
||||
LbpSerializer.StringElement("resource", this.Resources) +
|
||||
LbpSerializer.StringElement("location", Location.Serialize()) +
|
||||
LbpSerializer.StringElement("initiallyLocked", InitiallyLocked) +
|
||||
LbpSerializer.StringElement("isSubLevel", SubLevel) +
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue