diff --git a/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs b/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs index 8d787a1b..de413739 100644 --- a/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs +++ b/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs @@ -1,4 +1,6 @@ -using System.Collections; +#nullable enable + +using System.Collections; using System.Collections.ObjectModel; using System.Data.Entity; using System.Data.Entity.Infrastructure; @@ -6,9 +8,8 @@ using System.Reflection; using Snittlistan.Web.Infrastructure.Database; -#nullable enable - namespace Snittlistan.Test.ApiControllers.Infrastructure; + public sealed class InMemoryDbSet : IDbSet, IDbAsyncEnumerable where T : class { private readonly IdGenerator _generator; @@ -106,19 +107,28 @@ public InMemoryContext() IdGenerator generator = new(); PublishedTasks = new InMemoryDbSet(generator); Tenants = new InMemoryDbSet(generator); - Teams = new InMemoryDbSet(generator); - Hallar = new InMemoryDbSet(generator); + Team = new InMemoryDbSet(generator); + Hall = new InMemoryDbSet(generator); RosterMails = new InMemoryDbSet(generator); ChangeLogs = new InMemoryDbSet(generator); KeyValueProperties = new InMemoryDbSet(generator); SentEmails = new InMemoryDbSet(generator); + Match = new InMemoryDbSet(generator); + TeamRef = new InMemoryDbSet(generator); + OilProfile = new InMemoryDbSet(generator); } public IDbSet PublishedTasks { get; } - public IDbSet Teams { get; } + public IDbSet Team { get; } + + public IDbSet Hall { get; } + + public IDbSet Match { get; } + + public IDbSet TeamRef { get; } - public IDbSet Hallar { get; } + public IDbSet OilProfile { get; } public IDbSet Tenants { get; } @@ -130,7 +140,7 @@ public InMemoryContext() public IDbSet SentEmails { get; } - public DbChangeTracker ChangeTracker => throw new NotImplementedException(); + public DbChangeTracker ChangeTracker { get; } = null!; public int SaveChanges() { diff --git a/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs b/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs index d75c560a..4b47e3f5 100644 --- a/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs +++ b/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs @@ -16,7 +16,7 @@ public JsonResult TeamsQuickSearch(string term) } var query = - from team in CompositionRoot.Databases.Bits.Teams + from team in CompositionRoot.Databases.Bits.Team where team.TeamAlias.StartsWith(term) orderby team.TeamAlias select new @@ -35,7 +35,7 @@ public JsonResult LocationsQuickSearch(string term) } var query = - from hall in CompositionRoot.Databases.Bits.Hallar + from hall in CompositionRoot.Databases.Bits.Hall where hall.HallName.StartsWith(term) orderby hall.HallName select new diff --git a/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs b/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs index 12882c6a..439c4d4b 100644 --- a/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs +++ b/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs @@ -19,6 +19,26 @@ namespace Snittlistan.Web.Areas.V2.Controllers.Api; [OnlyLocalAllowed] public class TaskController : AbstractApiController { + public async Task Get() + { + var query = + from m in CompositionRoot.Databases.Bits.Match + where m.MatchId == 6422 + select new + { + m.ExternalMatchId, + HomeTeamName = m.HomeTeamRef.TeamName, + AwayTeamName = m.AwayTeamRef.TeamName, + m.MatchDateTime, + m.HallRef.HallRefId, + HallRef_HallName = m.HallRef.HallName, + HallName = m.HallRef.Hall!.HallName ?? "" + }; + var result = await query + .FirstOrDefaultAsync(); + return Ok(result); + } + public async Task Post(TaskRequest request) { Logger.InfoFormat("Received task {taskJson}", request.TaskJson); diff --git a/Snittlistan.Web/Infrastructure/Database/BitsContext.cs b/Snittlistan.Web/Infrastructure/Database/BitsContext.cs index 1eea7dce..99f2a545 100644 --- a/Snittlistan.Web/Infrastructure/Database/BitsContext.cs +++ b/Snittlistan.Web/Infrastructure/Database/BitsContext.cs @@ -1,15 +1,26 @@ -using Npgsql.NameTranslation; -using System.Data.Entity; +#nullable enable -#nullable enable +using Npgsql.NameTranslation; namespace Snittlistan.Web.Infrastructure.Database; public class BitsContext : DbContext, IBitsContext { - public IDbSet Teams { get; set; } = null!; + public BitsContext() + { + Configuration.AutoDetectChangesEnabled = false; + Configuration.LazyLoadingEnabled = false; + } + + public IDbSet Team { get; set; } = null!; + + public IDbSet Hall { get; set; } = null!; - public IDbSet Hallar { get; set; } = null!; + public IDbSet Match { get; set; } = null!; + + public IDbSet TeamRef { get; set; } = null!; + + public IDbSet OilProfile { get; set; } = null!; protected override void OnModelCreating(DbModelBuilder modelBuilder) { @@ -17,7 +28,14 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) System.Data.Entity.Database.SetInitializer(new NullDatabaseInitializer()); NpgsqlSnakeCaseNameTranslator mapper = new(); _ = modelBuilder.HasDefaultSchema("bits"); - modelBuilder.Properties().Configure(x => x.HasColumnName(mapper.TranslateMemberName(x.ClrPropertyInfo.Name))); - modelBuilder.Types().Configure(x => x.ToTable(mapper.TranslateMemberName(x.ClrType.Name.Replace("Bits", string.Empty)))); + modelBuilder.Properties().Configure(x => x.HasColumnName( + mapper.TranslateMemberName(x.ClrPropertyInfo.Name))); + modelBuilder.Types().Configure(x => x.ToTable( + mapper.TranslateMemberName(x.ClrType.Name.Replace("Bits_", string.Empty)))); + + _ = modelBuilder.Entity() + .HasOptional(x => x.Hall) + .WithOptionalDependent(x => x!.HallRef) + .Map(x => x.MapKey("hall_id")); } } diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs b/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs index d4a52e8c..f127f4d2 100644 --- a/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs +++ b/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs @@ -1,10 +1,19 @@ #nullable enable +using System.ComponentModel.DataAnnotations; + namespace Snittlistan.Web.Infrastructure.Database; public class Bits_Hall { - public int ExternalHallId { get; set; } + [Key] + public int HallId { get; private set; } + + public int ExternalHallId { get; private set; } + + public string HallName { get; private set; } = string.Empty; + + public int HallRefId { get; set; } - public string HallName { get; set; } = null!; + public Bits_HallRef HallRef { get; private set; } = null!; } diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_HallRef.cs b/Snittlistan.Web/Infrastructure/Database/Bits_HallRef.cs new file mode 100644 index 00000000..791bea5d --- /dev/null +++ b/Snittlistan.Web/Infrastructure/Database/Bits_HallRef.cs @@ -0,0 +1,21 @@ +#nullable enable + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Snittlistan.Web.Infrastructure.Database; + +public class Bits_HallRef +{ + [Key] + public int HallRefId { get; private set; } + + public int ExternalHallId { get; private set; } + + //[ForeignKey(nameof(Hall))] + //public int HallId { get; private set; } + + public string HallName { get; private set; } = string.Empty; + + public Bits_Hall? Hall { get; private set; } +} diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_Match.cs b/Snittlistan.Web/Infrastructure/Database/Bits_Match.cs new file mode 100644 index 00000000..912ea668 --- /dev/null +++ b/Snittlistan.Web/Infrastructure/Database/Bits_Match.cs @@ -0,0 +1,59 @@ +#nullable enable + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Snittlistan.Web.Infrastructure.Database; + +/* + * SELECT + m.external_match_id, + tr_home.team_name AS home_team_name, + tr_home.team_alias AS home_team_alias, + tr_away.team_name AS away_team_name, + tr_away.team_alias AS away_team_alias, + op.oil_profile_name, + hr.hall_name +FROM + bits.match m + JOIN bits.team_ref tr_home ON m.match_home_team_ref_id = tr_home.team_ref_id + JOIN bits.team_ref tr_away ON m.match_away_team_ref_id = tr_away.team_ref_id + JOIN bits.oil_profile op ON m.match_oil_profile_id = op.oil_profile_id + JOIN bits.hall_ref hr ON m.match_hall_ref_id = hr.hall_ref_id +WHERE + m.external_match_id = 3235829; + + */ +public class Bits_Match +{ + [Key] + public int MatchId { get; private set; } + + public int ExternalMatchId { get; private set; } + + public DateTime MatchDateTime { get; private set; } + + [Column("match_home_team_ref_id")] + [ForeignKey(nameof(HomeTeamRef))] + public int HomeTeamRefId { get; private set; } + + public virtual Bits_TeamRef HomeTeamRef { get; private set; } = null!; + + [Column("match_away_team_ref_id")] + [ForeignKey(nameof(AwayTeamRef))] + public int AwayTeamRefId { get; private set; } + + public virtual Bits_TeamRef AwayTeamRef { get; private set; } = null!; + + [Column("match_oil_profile_id")] + [ForeignKey(nameof(OilProfile))] + public int OilProfileId { get; private set; } + + public virtual Bits_OilProfile OilProfile { get; private set; } = null!; + + [Column("match_hall_ref_id")] + [ForeignKey(nameof(HallRef))] + public int HallRefId { get; private set; } + + public Bits_HallRef HallRef { get; private set; } = null!; +} diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_OilProfile.cs b/Snittlistan.Web/Infrastructure/Database/Bits_OilProfile.cs new file mode 100644 index 00000000..e534b3c1 --- /dev/null +++ b/Snittlistan.Web/Infrastructure/Database/Bits_OilProfile.cs @@ -0,0 +1,16 @@ +#nullable enable + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Snittlistan.Web.Infrastructure.Database; + +public class Bits_OilProfile +{ + [Key] + public int OilProfileId { get; set; } + + [InverseProperty(nameof(Bits_Match.OilProfile))] + public virtual ICollection Matches { get; set; } = + new HashSet(); +} diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs b/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs index 9a38ce71..7f2e978d 100644 --- a/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs +++ b/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs @@ -1,9 +1,14 @@ #nullable enable +using System.ComponentModel.DataAnnotations; + namespace Snittlistan.Web.Infrastructure.Database; public class Bits_Team { + [Key] + public int TeamId { get; set; } + public int ExternalTeamId { get; set; } public string TeamName { get; set; } = null!; diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_TeamRef.cs b/Snittlistan.Web/Infrastructure/Database/Bits_TeamRef.cs new file mode 100644 index 00000000..c87011f1 --- /dev/null +++ b/Snittlistan.Web/Infrastructure/Database/Bits_TeamRef.cs @@ -0,0 +1,26 @@ +#nullable enable + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Snittlistan.Web.Infrastructure.Database; + +public class Bits_TeamRef +{ + [Key] + public int TeamRefId { get; private set; } + + public int ExternalTeamId { get; set; } + + public string TeamName { get; private set; } = string.Empty; + + public string TeamAlias { get; set; } = string.Empty; + + [InverseProperty(nameof(Bits_Match.HomeTeamRef))] + public virtual ICollection HomeMatches { get; private set; } = + new HashSet(); + + [InverseProperty(nameof(Bits_Match.AwayTeamRef))] + public virtual ICollection AwayMatches { get; private set; } = + new HashSet(); +} diff --git a/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs b/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs index 6f2e820a..f96b22e1 100644 --- a/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs +++ b/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs @@ -1,12 +1,16 @@ - -using System.Data.Entity; - -#nullable enable +#nullable enable namespace Snittlistan.Web.Infrastructure.Database; + public interface IBitsContext { - public IDbSet Teams { get; } + public IDbSet Team { get; } + + public IDbSet Hall { get; } + + public IDbSet Match { get; } + + public IDbSet TeamRef { get; } - public IDbSet Hallar { get; } + public IDbSet OilProfile { get; } } diff --git a/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs b/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs index 6dbec398..ce3e56d2 100644 --- a/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs +++ b/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs @@ -1,6 +1,5 @@ #nullable enable -using System.Data.Entity; using System.Data.Entity.Infrastructure; namespace Snittlistan.Web.Infrastructure.Database; diff --git a/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs b/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs index 0c693043..494499f8 100644 --- a/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs +++ b/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs @@ -1,7 +1,6 @@ #nullable enable using Npgsql.NameTranslation; -using System.Data.Entity; namespace Snittlistan.Web.Infrastructure.Database; diff --git a/Snittlistan.Web/Snittlistan.Web.csproj b/Snittlistan.Web/Snittlistan.Web.csproj index a1397c3b..0d8f90e1 100644 --- a/Snittlistan.Web/Snittlistan.Web.csproj +++ b/Snittlistan.Web/Snittlistan.Web.csproj @@ -155,6 +155,10 @@ Index.cshtml + + + + diff --git a/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml b/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml index 532e99c0..772863af 100644 --- a/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml +++ b/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml @@ -30,7 +30,16 @@ Content-Type: text/html; charset=utf-8 }

-

@Model.FormattedAuditLog.Title

+
+
Hemmalag
+
@Model.HomeTeamName
+
Bortalag
+
@Model.AwayTeamName
+
Datum
+
@Model.MatchDate
+
Online scoring
+
@Model.OnlineScoringLink
+
diff --git a/Snittlistan.Web/Web.config b/Snittlistan.Web/Web.config index 30a56855..3a1880f2 100644 --- a/Snittlistan.Web/Web.config +++ b/Snittlistan.Web/Web.config @@ -17,7 +17,7 @@ - +
Bord