Skip to content

Commit 9f6e5db

Browse files
authored
Merge pull request #40 from zetroot/feature/toot-reports
+semver: breaking
2 parents 6b1bc00 + 2c7731f commit 9f6e5db

28 files changed

+722
-51
lines changed

src/NTorSpectator.Database/Configuration/ObservationEntityConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ public void Configure(EntityTypeBuilder<Observation> builder)
1515

1616
builder.HasOne(x => x.Site).WithMany().HasForeignKey(x => x.SiteId).OnDelete(DeleteBehavior.Restrict);
1717
}
18-
}
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
3+
using NTorSpectator.Database.Models;
4+
5+
namespace NTorSpectator.Database.Configuration;
6+
7+
internal class ObservationEventEntityConfiguration : IEntityTypeConfiguration<SiteAvailabilityEvent>
8+
{
9+
public void Configure(EntityTypeBuilder<SiteAvailabilityEvent> builder)
10+
{
11+
builder.ToTable("availability_events");
12+
builder.HasKey(x => x.Id);
13+
builder.HasIndex(x => x.OccuredAt);
14+
builder.HasIndex(x => x.EventType);
15+
builder.HasOne(x => x.Site).WithMany().HasForeignKey(x => x.SiteId).OnDelete(DeleteBehavior.Cascade);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
3+
using NTorSpectator.Database.Models;
4+
5+
namespace NTorSpectator.Database.Configuration;
6+
7+
internal class ObservationReportEntityConfiguration : IEntityTypeConfiguration<ObservationReport>
8+
{
9+
public void Configure(EntityTypeBuilder<ObservationReport> builder)
10+
{
11+
builder.ToTable("reports");
12+
builder.HasKey(x => x.Id);
13+
14+
builder.HasMany(x => x.Observations).WithOne().HasForeignKey(x => x.ReportId).OnDelete(DeleteBehavior.Restrict);
15+
builder.HasMany(x => x.Events).WithOne().HasForeignKey(x => x.ReportId).OnDelete(DeleteBehavior.Restrict);
16+
}
17+
}

src/NTorSpectator.Database/DataContext.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,16 @@
33

44
namespace NTorSpectator.Database;
55

6-
public class DataContext : DbContext
6+
internal class DataContext : DbContext
77
{
8-
public DataContext()
9-
{
10-
11-
}
8+
public DataContext() { }
129

13-
public DataContext(DbContextOptions<DataContext> options) : base(options)
14-
{
15-
16-
}
10+
public DataContext(DbContextOptions<DataContext> options) : base(options) { }
1711

1812
public DbSet<Site> Sites => Set<Site>();
1913
public DbSet<Observation> Observations => Set<Observation>();
14+
public DbSet<SiteAvailabilityEvent> Events => Set<SiteAvailabilityEvent>();
15+
public DbSet<ObservationReport> Reports => Set<ObservationReport>();
2016

2117
protected override void OnModelCreating(ModelBuilder modelBuilder)
2218
{

src/NTorSpectator.Database/DatabaseInjector.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,24 @@
66

77
namespace NTorSpectator.Database;
88

9+
/// <summary>
10+
/// Injects data access services into DI
11+
/// </summary>
912
public static class DatabaseInjector
1013
{
14+
/// <summary>
15+
/// Registers Datacontext and repositories implementations in DI-container
16+
/// </summary>
17+
/// <param name="services">DI-container</param>
18+
/// <param name="configuration">Configuration to get database settings from</param>
19+
/// <returns>Same di container to chain extension calls</returns>
1120
public static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
1221
{
1322
services.AddDbContextPool<DataContext>(opts => opts.UseNpgsql(configuration.GetConnectionString("SpectatorDatabase")));
1423
services
1524
.AddTransient<ISitesRepository, SitesRepository>()
16-
.AddTransient<IObservesRepository, ObservesRepository>();
25+
.AddTransient<IObservesRepository, ObservesRepository>()
26+
.AddTransient<IReportsRepository, ReportsRepository>();
1727

1828
return services;
1929
}

src/NTorSpectator.Database/Migrations/20230708103126_CombinedReports.Designer.cs

Lines changed: 166 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
using System;
2+
using Microsoft.EntityFrameworkCore.Migrations;
3+
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
4+
5+
#nullable disable
6+
7+
namespace NTorSpectator.Database.Migrations
8+
{
9+
/// <inheritdoc />
10+
public partial class CombinedReports : Migration
11+
{
12+
/// <inheritdoc />
13+
protected override void Up(MigrationBuilder migrationBuilder)
14+
{
15+
migrationBuilder.AddColumn<int>(
16+
name: "ReportId",
17+
table: "observations",
18+
type: "integer",
19+
nullable: true);
20+
21+
migrationBuilder.CreateTable(
22+
name: "reports",
23+
columns: table => new
24+
{
25+
Id = table.Column<int>(type: "integer", nullable: false)
26+
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)
27+
},
28+
constraints: table =>
29+
{
30+
table.PrimaryKey("PK_reports", x => x.Id);
31+
});
32+
33+
migrationBuilder.CreateTable(
34+
name: "availability_events",
35+
columns: table => new
36+
{
37+
Id = table.Column<int>(type: "integer", nullable: false)
38+
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
39+
ReportId = table.Column<int>(type: "integer", nullable: false),
40+
SiteId = table.Column<int>(type: "integer", nullable: false),
41+
OccuredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
42+
EventType = table.Column<int>(type: "integer", nullable: false)
43+
},
44+
constraints: table =>
45+
{
46+
table.PrimaryKey("PK_availability_events", x => x.Id);
47+
table.ForeignKey(
48+
name: "FK_availability_events_reports_ReportId",
49+
column: x => x.ReportId,
50+
principalTable: "reports",
51+
principalColumn: "Id",
52+
onDelete: ReferentialAction.Restrict);
53+
table.ForeignKey(
54+
name: "FK_availability_events_sites_SiteId",
55+
column: x => x.SiteId,
56+
principalTable: "sites",
57+
principalColumn: "Id",
58+
onDelete: ReferentialAction.Cascade);
59+
});
60+
61+
migrationBuilder.CreateIndex(
62+
name: "IX_observations_ReportId",
63+
table: "observations",
64+
column: "ReportId");
65+
66+
migrationBuilder.CreateIndex(
67+
name: "IX_availability_events_EventType",
68+
table: "availability_events",
69+
column: "EventType");
70+
71+
migrationBuilder.CreateIndex(
72+
name: "IX_availability_events_OccuredAt",
73+
table: "availability_events",
74+
column: "OccuredAt");
75+
76+
migrationBuilder.CreateIndex(
77+
name: "IX_availability_events_ReportId",
78+
table: "availability_events",
79+
column: "ReportId");
80+
81+
migrationBuilder.CreateIndex(
82+
name: "IX_availability_events_SiteId",
83+
table: "availability_events",
84+
column: "SiteId");
85+
86+
migrationBuilder.AddForeignKey(
87+
name: "FK_observations_reports_ReportId",
88+
table: "observations",
89+
column: "ReportId",
90+
principalTable: "reports",
91+
principalColumn: "Id",
92+
onDelete: ReferentialAction.Restrict);
93+
}
94+
95+
/// <inheritdoc />
96+
protected override void Down(MigrationBuilder migrationBuilder)
97+
{
98+
migrationBuilder.DropForeignKey(
99+
name: "FK_observations_reports_ReportId",
100+
table: "observations");
101+
102+
migrationBuilder.DropTable(
103+
name: "availability_events");
104+
105+
migrationBuilder.DropTable(
106+
name: "reports");
107+
108+
migrationBuilder.DropIndex(
109+
name: "IX_observations_ReportId",
110+
table: "observations");
111+
112+
migrationBuilder.DropColumn(
113+
name: "ReportId",
114+
table: "observations");
115+
}
116+
}
117+
}

0 commit comments

Comments
 (0)