Files
spacerace/Server/Repositories/SpaceRaceDbContext.cs
T
2023-08-29 20:18:34 +10:00

80 lines
2.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using SpaceRace.Shared;
namespace Server;
public class SpaceRaceDbContext : DbContext {
public DbSet<Lap> Laps { get; set; }
public DbSet<PbDTO> PbDTO { get; set; }
public SpaceRaceDbContext(DbContextOptions<SpaceRaceDbContext> options) : base(options) {}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
new SpaceRaceInitialiser(modelBuilder).Seed();
var pbQuery = $$"""
WITH ranked AS (
SELECT *, rank() OVER (ORDER BY "Time" ASC) AS "Position", COUNT("Id") OVER () AS "Completions"
FROM "Laps"
)
SELECT * FROM ranked
""";
modelBuilder.Entity<PbDTO>()
.HasNoKey()
.ToSqlQuery(pbQuery)
.ToTable(null as string);
}
}
[Index(nameof(UserId), nameof(Map), IsUnique = true)]
[Index(nameof(Map))]
public class Lap {
public Guid Id { get; set; }
public Guid UserId { get; set; }
[Required] public DateTimeOffset Created { get; set; }
[Required] public double Time { get; set; }
[Required] public List<double> Sectors { get; set; }
[Required] public string Map { get; set; }
}
class SpaceRaceInitialiser {
private readonly ModelBuilder modelBuilder;
public SpaceRaceInitialiser(ModelBuilder modelBuilder) {
this.modelBuilder = modelBuilder;
}
public void Seed() {
modelBuilder.Entity<Lap>().HasData(
new Lap {
Created = DateTimeOffset.UtcNow,
Id = Guid.NewGuid(),
UserId = new Guid("11111111-1111-1111-1111-111111111111"),
Time = 128f,
Sectors = new List<double> { 64f, 24f, 24f },
Map = "sr_TestTrack",
},
new Lap {
Created = DateTimeOffset.UtcNow,
Id = Guid.NewGuid(),
UserId = new Guid("22222222-2222-2222-2222-222222222222"),
Time = 132f,
Sectors = new List<double> { 64f, 38f, 24f },
Map = "sr_TestTrack",
},
new Lap {
Created = DateTimeOffset.UtcNow,
Id = Guid.NewGuid(),
UserId = new Guid("33333333-3333-3333-3333-333333333333"),
Time = 148f,
Sectors = new List<double> { 64f, 64f, 24f },
Map = "sr_TestTrack",
}
);
}
}