80 lines
2.6 KiB
C#
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",
|
|
}
|
|
);
|
|
}
|
|
} |