Skip to content

Commit 80be07b

Browse files
authored
Add scenario tables and list route (#127)
* start adding tables * working scenario/list route * undo removal of semaphores for loading obj dirs * check if downloaded file exists before writing it
1 parent 4cac2a8 commit 80be07b

23 files changed

+237
-67
lines changed

DatabaseExporter/Program.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
var authors = JsonSerializer.Serialize<IEnumerable<string>>(db.Authors.Select(a => a.Name).ToList().Order(), jsonOptions);
1717
var tags = JsonSerializer.Serialize<IEnumerable<string>>(db.Tags.Select(t => t.Name).ToList().Order(), jsonOptions);
1818
var licences = JsonSerializer.Serialize<IEnumerable<LicenceJsonRecord>>(db.Licences.Select(l => new LicenceJsonRecord(l.Name, l.Text)).ToList().OrderBy(l => l.Name), jsonOptions);
19-
var modpacks = JsonSerializer.Serialize<IEnumerable<ModpackJsonRecord>>(db.Modpacks.Select(m => new ModpackJsonRecord(m.Name, m.Author)).ToList().OrderBy(m => m.Name), jsonOptions);
19+
var objectPacks = JsonSerializer.Serialize<IEnumerable<ObjectPackJsonRecord>>(db.ObjectPacks.Select(m => new ObjectPackJsonRecord(m.Name, m.Description, m.Author)).ToList().OrderBy(m => m.Name), jsonOptions);
20+
//var scv5Files = JsonSerializer.Serialize<IEnumerable<?>>(db.Licences.Select(l => new LicenceJsonRecord(l.Name, l.Text)).ToList().OrderBy(l => l.Name), jsonOptions);
21+
//var scv5FilePacks = JsonSerializer.Serialize<IEnumerable<SCV5FilePackJsonRecord>>(db.ObjectPacks.Select(m => new SCV5FilePackJsonRecord(m.Name, m.Description, m.Author)).ToList().OrderBy(m => m.Name), jsonOptions);
2022

2123
var objs = new List<ObjectMetadata>();
2224

2325
foreach (var o in db.Objects
2426
.Include(l => l.Licence)
25-
.Select(x => new ExpandedTblLocoObject(x, x.Authors, x.Tags, x.Modpacks))
27+
.Select(x => new ExpandedTblLocoObject(x, x.Authors, x.Tags, x.ObjectPacks))
2628
.ToList()
2729
.OrderBy(x => x.Object.UniqueName))
2830
{
@@ -33,7 +35,7 @@
3335
o.Object.Description,
3436
o.Authors.Select(a => a.Name).ToList(),
3537
o.Tags.Select(t => t.Name).ToList(),
36-
o.Modpacks.Select(m => m.Name).ToList(),
38+
o.ObjectPacks.Select(m => m.Name).ToList(),
3739
o.Object.Licence?.Name,
3840
o.Object.Availability,
3941
o.Object.ObjectSource);
@@ -47,7 +49,9 @@
4749
File.WriteAllText("Q:\\Games\\Locomotion\\Database\\authors.json", authors);
4850
File.WriteAllText("Q:\\Games\\Locomotion\\Database\\tags.json", tags);
4951
File.WriteAllText("Q:\\Games\\Locomotion\\Database\\licences.json", licences);
50-
File.WriteAllText("Q:\\Games\\Locomotion\\Database\\modpacks.json", modpacks);
52+
File.WriteAllText("Q:\\Games\\Locomotion\\Database\\objectPacks.json", objectPacks);
5153
File.WriteAllText("Q:\\Games\\Locomotion\\Database\\objectMetadata.json", objects);
54+
//File.WriteAllText("Q:\\Games\\Locomotion\\Database\\scv5Files.json", objectPacks);
55+
//File.WriteAllText("Q:\\Games\\Locomotion\\Database\\scv5FilePacks.json", objects);
5256

5357
Console.WriteLine("done");

DatabaseSeeder/Program.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static void SeedDb(LocoDb db, bool deleteExisting)
4141
Console.WriteLine("Clearing database");
4242
_ = db.Objects.ExecuteDelete();
4343
_ = db.Tags.ExecuteDelete();
44-
_ = db.Modpacks.ExecuteDelete();
44+
_ = db.ObjectPacks.ExecuteDelete();
4545
_ = db.Authors.ExecuteDelete();
4646
_ = db.Licences.ExecuteDelete();
4747
_ = db.SaveChanges(); // not necessary since ExecuteDelete auto-saves
@@ -98,14 +98,14 @@ static void SeedDb(LocoDb db, bool deleteExisting)
9898

9999
// ...
100100

101-
if (!db.Modpacks.Any())
101+
if (!db.ObjectPacks.Any())
102102
{
103-
Console.WriteLine("Seeding Modpacks");
103+
Console.WriteLine("Seeding ObjectPacks");
104104

105-
var modpacks = JsonSerializer.Deserialize<IEnumerable<ModpackJsonRecord>>(File.ReadAllText("Q:\\Games\\Locomotion\\Server\\modpacks.json"), jsonOptions);
105+
var modpacks = JsonSerializer.Deserialize<IEnumerable<ObjectPackJsonRecord>>(File.ReadAllText("Q:\\Games\\Locomotion\\Server\\objectPacks.json"), jsonOptions);
106106
if (modpacks != null)
107107
{
108-
db.AddRange(modpacks.Select(x => new TblModpack() { Name = x.Name, Author = x.Author == null ? null : db.Authors.Single(a => a.Name == x.Author) }));
108+
db.AddRange(modpacks.Select(x => new TblLocoObjectPack() { Name = x.Name, Author = x.Author == null ? null : db.Authors.Single(a => a.Name == x.Author) }));
109109
_ = db.SaveChanges();
110110
}
111111
}
@@ -139,7 +139,7 @@ static void SeedDb(LocoDb db, bool deleteExisting)
139139

140140
var authors = meta.Authors == null ? null : db.Authors.Where(x => meta.Authors.Contains(x.Name)).ToList();
141141
var tags = meta.Tags == null ? null : db.Tags.Where(x => meta.Tags.Contains(x.Name)).ToList();
142-
var modpacks = meta.Modpacks == null ? null : db.Modpacks.Where(x => meta.Modpacks.Contains(x.Name)).ToList();
142+
var objectPacks = meta.ObjectPacks == null ? null : db.ObjectPacks.Where(x => meta.ObjectPacks.Contains(x.Name)).ToList();
143143
var licence = meta.Licence == null ? null : db.Licences.Where(x => x.Name == meta.Licence).First();
144144

145145
var tblLocoObject = new TblLocoObject()
@@ -156,7 +156,7 @@ static void SeedDb(LocoDb db, bool deleteExisting)
156156
LastEditDate = null,
157157
UploadDate = DateTimeOffset.Now,
158158
Tags = tags ?? [],
159-
Modpacks = modpacks ?? [],
159+
ObjectPacks = objectPacks ?? [],
160160
Availability = meta!.ObjectAvailability,
161161
Licence = licence,
162162
};

Definitions/DTO/DtoDatObjectWithMetadata.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public record DtoDatObjectWithMetadata(
1919
DateTimeOffset? LastEditDate,
2020
DateTimeOffset UploadDate,
2121
ICollection<TblTag> Tags,
22-
ICollection<TblModpack> Modpacks,
22+
ICollection<TblLocoObjectPack> ObjectPacks,
2323
ObjectAvailability Availability,
2424
TblLicence? Licence);
2525
}

Definitions/Database/LocoDb.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ public class LocoDb : DbContext
77
{
88
public DbSet<TblAuthor> Authors => Set<TblAuthor>();
99
public DbSet<TblTag> Tags => Set<TblTag>();
10-
public DbSet<TblModpack> Modpacks => Set<TblModpack>();
1110
public DbSet<TblLocoObject> Objects => Set<TblLocoObject>();
11+
public DbSet<TblLocoObjectPack> ObjectPacks => Set<TblLocoObjectPack>();
1212
public DbSet<TblLicence> Licences => Set<TblLicence>();
13+
public DbSet<TblSCV5File> SCV5Files => Set<TblSCV5File>();
14+
public DbSet<TblSCV5FilePack> SCV5FilePacks => Set<TblSCV5FilePack>();
1315

1416
public LocoDb()
1517
{ }
@@ -25,9 +27,15 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
2527
}
2628
}
2729

28-
protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.Entity<TblLocoObject>()
29-
.Property(b => b.UploadDate)
30-
.HasDefaultValueSql("datetime(datetime('now', 'localtime'), 'utc')"); // this is necessary, it seems like a bug in sqlite
30+
protected override void OnModelCreating(ModelBuilder modelBuilder)
31+
{
32+
modelBuilder.Entity<TblLocoObject>()
33+
.Property(b => b.UploadDate)
34+
.HasDefaultValueSql("datetime(datetime('now', 'localtime'), 'utc')"); // this is necessary, it seems like a bug in sqlite
35+
modelBuilder.Entity<TblSCV5File>()
36+
.Property(b => b.UploadDate)
37+
.HasDefaultValueSql("datetime(datetime('now', 'localtime'), 'utc')"); // this is necessary, it seems like a bug in sqlite
38+
}
3139

3240
public bool DoesObjectExist(S5Header s5Header, out TblLocoObject? existingObject)
3341
=> DoesObjectExist(s5Header.Name, s5Header.Checksum, out existingObject);

Definitions/Database/TblAuthor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ namespace OpenLoco.Definitions.Database
33
public class TblAuthor
44
{
55
public int Id { get; set; }
6-
public string Name { get; set; }
6+
public required string Name { get; set; }
77

88
public ICollection<TblLocoObject> Objects { get; set; }
99
}

Definitions/Database/TblLocoObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class TblLocoObject
1313

1414
public required string UniqueName { get; set; }
1515

16-
#region OriginalDatdata
16+
#region OriginalDatData
1717

1818
public required string DatName { get; set; }
1919

@@ -42,7 +42,7 @@ public class TblLocoObject
4242

4343
public ICollection<TblTag> Tags { get; set; }
4444

45-
public ICollection<TblModpack> Modpacks { get; set; }
45+
public ICollection<TblLocoObjectPack> ObjectPacks { get; set; } // aka modpack
4646

4747
public ObjectAvailability Availability { get; set; }
4848

Definitions/Database/TblModpack.cs renamed to Definitions/Database/TblLocoObjectPack.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
namespace OpenLoco.Definitions.Database
44
{
55
[Index(nameof(Name), IsUnique = true)]
6-
public class TblModpack
6+
public class TblLocoObjectPack
77
{
88
public int Id { get; set; }
99

10-
public string Name { get; set; }
10+
public required string Name { get; set; }
11+
12+
public string? Description { get; set; }
1113

1214
public TblAuthor? Author { get; set; }
1315

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using OpenLoco.Dat.Data;
3+
using System.ComponentModel.DataAnnotations.Schema;
4+
5+
namespace OpenLoco.Definitions.Database
6+
{
7+
[Index(nameof(DatName), nameof(DatChecksum), IsDescending = [true, false], IsUnique = true)]
8+
[Index(nameof(UniqueName), IsUnique = true)]
9+
public class TblSCV5File
10+
{
11+
public int Id { get; set; }
12+
13+
public required string UniqueName { get; set; }
14+
15+
#region OriginalDatData
16+
17+
public required string DatName { get; set; }
18+
19+
public required uint DatChecksum { get; set; }
20+
21+
#endregion
22+
23+
public ObjectSource ObjectSource { get; set; }
24+
25+
public string? Description { get; set; }
26+
27+
public ICollection<TblAuthor> Authors { get; set; }
28+
29+
public DateTimeOffset? CreationDate { get; set; }
30+
31+
public DateTimeOffset? LastEditDate { get; set; }
32+
33+
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
34+
public DateTimeOffset UploadDate { get; set; }
35+
36+
public ICollection<TblTag> Tags { get; set; }
37+
38+
public ICollection<TblSCV5FilePack> SCV5FilePacks { get; set; }
39+
40+
public TblLicence? Licence { get; set; }
41+
}
42+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Microsoft.EntityFrameworkCore;
2+
3+
namespace OpenLoco.Definitions.Database
4+
{
5+
[Index(nameof(Name), IsUnique = true)]
6+
public class TblSCV5FilePack
7+
{
8+
public required int Id { get; set; }
9+
10+
public required string Name { get; set; }
11+
12+
public string? Description { get; set; }
13+
14+
public TblAuthor? Author { get; set; }
15+
16+
public ICollection<TblSCV5File> Files { get; set; }
17+
}
18+
}

Definitions/SourceData/ExpandedTblLocoObject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
namespace OpenLoco.Definitions.SourceData
44
{
55
// this must be done because eager-loading related many-to-many data in entity framework is recursive and cannot be turned off...
6-
public record ExpandedTblLocoObject(TblLocoObject Object, ICollection<TblAuthor> Authors, ICollection<TblTag> Tags, ICollection<TblModpack> Modpacks);
6+
public record ExpandedTblLocoObject(TblLocoObject Object, ICollection<TblAuthor> Authors, ICollection<TblTag> Tags, ICollection<TblLocoObjectPack> ObjectPacks);
77
}

0 commit comments

Comments
 (0)