Files
spacerace/Server/Repositories/SpaceRaceDbContext.cs
T
2023-08-29 13:52:19 +10:00

75 lines
2.2 KiB
C#

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using Server.Models;
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();
modelBuilder.Entity<PbDTO>(pb => {
var pbQuery = $$"""
WITH ranked AS (
SELECT *, rank() OVER (ORDER BY "Time" ASC) AS "Position", COUNT("Id") OVER () AS "Completions"
FROM "Laps"
)
SELECT * FROM ranked
""";
pb.HasNoKey();
pb.ToSqlQuery(pbQuery);
});
}
}
[Index(nameof(UserId), nameof(Map), IsUnique = true)]
[Index(nameof(Map))]
public class Lap {
public DateTimeOffset Created { get; set; }
public Guid Id { get; set; }
public Guid UserId { get; set; }
public double Time { 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 = Guid.NewGuid(),
Time = 128f,
Map = "sr_TestTrack",
},
new Lap {
Created = DateTimeOffset.UtcNow,
Id = Guid.NewGuid(),
UserId = Guid.NewGuid(),
Time = 132f,
Map = "sr_TestTrack",
},
new Lap {
Created = DateTimeOffset.UtcNow,
Id = Guid.NewGuid(),
UserId = Guid.NewGuid(),
Time = 148f,
Map = "sr_TestTrack",
}
);
}
}