Skip to content

Commit 57786d4

Browse files
committed
report implemented
1 parent 9387432 commit 57786d4

5 files changed

Lines changed: 335 additions & 49 deletions

File tree

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using JetBrains.Annotations;
2+
using Refresh.Database.Models.Levels;
3+
using Refresh.Database.Models.Users;
4+
using Refresh.Database.Models.Reports;
5+
6+
namespace Refresh.Database;
7+
8+
public partial class GameDatabaseContext // Reports
9+
{
10+
private IQueryable<Report> ReportsIncluded => this.Reports
11+
.Include(r => r.Reporter)
12+
.Include(r => r.Reporter.Statistics)
13+
.Include(r => r.Level)
14+
.Include(r => r.Level!.Publisher)
15+
.Include(r => r.Level!.Statistics)
16+
.Include(r => r.ReviewedBy)
17+
.Include(r => r.ReviewedBy!.Statistics)
18+
.Include(r => r.Players)
19+
.ThenInclude(p => p.User)
20+
.Include(r => r.Players)
21+
.ThenInclude(p => p.User.Statistics);
22+
23+
public void CreateReport(Report report)
24+
{
25+
this.Write(() =>
26+
{
27+
report.ReportDate = this._time.Now;
28+
this.Reports.Add(report);
29+
});
30+
}
31+
32+
public void UpdateReportStatus(Report report, ReportStatus status, GameUser? reviewer = null, string? notes = null)
33+
{
34+
this.Write(() =>
35+
{
36+
report.Status = status;
37+
report.ReviewedBy = reviewer;
38+
report.ReviewedDate = reviewer != null ? this._time.Now : null;
39+
report.ModeratorNotes = notes;
40+
});
41+
}
42+
43+
public void RemoveReport(Report report)
44+
{
45+
this.Write(() =>
46+
{
47+
this.Reports.Remove(report);
48+
});
49+
}
50+
51+
[Pure]
52+
public Report? GetReportById(int id) =>
53+
this.ReportsIncluded.FirstOrDefault(r => r.ReportId == id);
54+
55+
[Pure]
56+
public DatabaseList<Report> GetReportsByStatus(ReportStatus status, int count, int skip) =>
57+
new(this.ReportsIncluded
58+
.Where(r => r.Status == status)
59+
.OrderByDescending(r => r.ReportDate), skip, count);
60+
61+
[Pure]
62+
public DatabaseList<Report> GetReportsByReporter(GameUser reporter, int count, int skip) =>
63+
new(this.ReportsIncluded
64+
.Where(r => r.Reporter == reporter)
65+
.OrderByDescending(r => r.ReportDate), skip, count);
66+
67+
[Pure]
68+
public DatabaseList<Report> GetReportsForLevel(GameLevel level, int count, int skip) =>
69+
new(this.ReportsIncluded
70+
.Where(r => r.Level == level)
71+
.OrderByDescending(r => r.ReportDate), skip, count);
72+
73+
[Pure]
74+
public DatabaseList<Report> GetStaleReports(TimeSpan maxAge, int count, int skip)
75+
{
76+
DateTimeOffset cutoff = this._time.Now - maxAge;
77+
return new(this.ReportsIncluded
78+
.Where(r => r.Status == ReportStatus.Pending && r.ReportDate < cutoff)
79+
.OrderBy(r => r.ReportDate), skip, count);
80+
}
81+
82+
}

Refresh.Database/Migrations/GameDatabaseContextModelSnapshot.cs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,36 @@ protected override void BuildModel(ModelBuilder modelBuilder)
10801080
b.ToTable("RateReviewRelations");
10811081
});
10821082

1083+
modelBuilder.Entity("Refresh.Database.Models.Relations.ReportPlayerRelation", b =>
1084+
{
1085+
b.Property<int>("ReportId")
1086+
.HasColumnType("integer");
1087+
1088+
b.Property<string>("UserId")
1089+
.HasColumnType("text");
1090+
1091+
b.Property<bool>("IsInGameNow")
1092+
.HasColumnType("boolean");
1093+
1094+
b.Property<bool>("IsReporter")
1095+
.HasColumnType("boolean");
1096+
1097+
b.Property<int>("PlayerNumber")
1098+
.HasColumnType("integer");
1099+
1100+
b.Property<string>("PlayerRect")
1101+
.HasColumnType("text");
1102+
1103+
b.Property<DateTimeOffset>("Timestamp")
1104+
.HasColumnType("timestamp with time zone");
1105+
1106+
b.HasKey("ReportId", "UserId");
1107+
1108+
b.HasIndex("UserId");
1109+
1110+
b.ToTable("ReportPlayersRelations");
1111+
});
1112+
10831113
modelBuilder.Entity("Refresh.Database.Models.Relations.SubPlaylistRelation", b =>
10841114
{
10851115
b.Property<int>("PlaylistId")
@@ -1139,6 +1169,74 @@ protected override void BuildModel(ModelBuilder modelBuilder)
11391169
b.ToTable("UniquePlayLevelRelations");
11401170
});
11411171

1172+
modelBuilder.Entity("Refresh.Database.Models.Reports.Report", b =>
1173+
{
1174+
b.Property<int>("ReportId")
1175+
.ValueGeneratedOnAdd()
1176+
.HasColumnType("integer");
1177+
1178+
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("ReportId"));
1179+
1180+
b.Property<string>("Description")
1181+
.IsRequired()
1182+
.HasColumnType("text");
1183+
1184+
b.Property<string>("GriefStateHash")
1185+
.IsRequired()
1186+
.HasColumnType("text");
1187+
1188+
b.Property<string>("InitialStateHash")
1189+
.IsRequired()
1190+
.HasColumnType("text");
1191+
1192+
b.Property<int?>("LevelId")
1193+
.HasColumnType("integer");
1194+
1195+
b.Property<string>("LevelType")
1196+
.IsRequired()
1197+
.HasColumnType("text");
1198+
1199+
b.Property<string>("MarkerRect")
1200+
.IsRequired()
1201+
.HasColumnType("text");
1202+
1203+
b.Property<string>("ModeratorNotes")
1204+
.HasColumnType("text");
1205+
1206+
b.Property<string>("PhotoAssetHash")
1207+
.IsRequired()
1208+
.HasColumnType("text");
1209+
1210+
b.Property<DateTimeOffset>("ReportDate")
1211+
.HasColumnType("timestamp with time zone");
1212+
1213+
b.Property<string>("ReporterUserId")
1214+
.IsRequired()
1215+
.HasColumnType("text");
1216+
1217+
b.Property<string>("ReviewedByUserId")
1218+
.HasColumnType("text");
1219+
1220+
b.Property<DateTimeOffset?>("ReviewedDate")
1221+
.HasColumnType("timestamp with time zone");
1222+
1223+
b.Property<int>("Status")
1224+
.HasColumnType("integer");
1225+
1226+
b.Property<int>("Type")
1227+
.HasColumnType("integer");
1228+
1229+
b.HasKey("ReportId");
1230+
1231+
b.HasIndex("LevelId");
1232+
1233+
b.HasIndex("ReporterUserId");
1234+
1235+
b.HasIndex("ReviewedByUserId");
1236+
1237+
b.ToTable("Reports");
1238+
});
1239+
11421240
modelBuilder.Entity("Refresh.Database.Models.Statistics.GameLevelStatistics", b =>
11431241
{
11441242
b.Property<int>("LevelId")
@@ -1402,6 +1500,9 @@ protected override void BuildModel(ModelBuilder modelBuilder)
14021500
.IsRequired()
14031501
.HasColumnType("text");
14041502

1503+
b.Property<bool>("RedirectGriefReportsToPhotos")
1504+
.HasColumnType("boolean");
1505+
14051506
b.Property<short>("Role")
14061507
.HasColumnType("smallint");
14071508

@@ -2026,6 +2127,25 @@ protected override void BuildModel(ModelBuilder modelBuilder)
20262127
b.Navigation("User");
20272128
});
20282129

2130+
modelBuilder.Entity("Refresh.Database.Models.Relations.ReportPlayerRelation", b =>
2131+
{
2132+
b.HasOne("Refresh.Database.Models.Reports.Report", "Report")
2133+
.WithMany("Players")
2134+
.HasForeignKey("ReportId")
2135+
.OnDelete(DeleteBehavior.Cascade)
2136+
.IsRequired();
2137+
2138+
b.HasOne("Refresh.Database.Models.Users.GameUser", "User")
2139+
.WithMany()
2140+
.HasForeignKey("UserId")
2141+
.OnDelete(DeleteBehavior.Cascade)
2142+
.IsRequired();
2143+
2144+
b.Navigation("Report");
2145+
2146+
b.Navigation("User");
2147+
});
2148+
20292149
modelBuilder.Entity("Refresh.Database.Models.Relations.SubPlaylistRelation", b =>
20302150
{
20312151
b.HasOne("Refresh.Database.Models.Playlists.GamePlaylist", "Playlist")
@@ -2083,6 +2203,29 @@ protected override void BuildModel(ModelBuilder modelBuilder)
20832203
b.Navigation("User");
20842204
});
20852205

2206+
modelBuilder.Entity("Refresh.Database.Models.Reports.Report", b =>
2207+
{
2208+
b.HasOne("Refresh.Database.Models.Levels.GameLevel", "Level")
2209+
.WithMany()
2210+
.HasForeignKey("LevelId");
2211+
2212+
b.HasOne("Refresh.Database.Models.Users.GameUser", "Reporter")
2213+
.WithMany()
2214+
.HasForeignKey("ReporterUserId")
2215+
.OnDelete(DeleteBehavior.Cascade)
2216+
.IsRequired();
2217+
2218+
b.HasOne("Refresh.Database.Models.Users.GameUser", "ReviewedBy")
2219+
.WithMany()
2220+
.HasForeignKey("ReviewedByUserId");
2221+
2222+
b.Navigation("Level");
2223+
2224+
b.Navigation("Reporter");
2225+
2226+
b.Navigation("ReviewedBy");
2227+
});
2228+
20862229
modelBuilder.Entity("Refresh.Database.Models.Users.EmailVerificationCode", b =>
20872230
{
20882231
b.HasOne("Refresh.Database.Models.Users.GameUser", "User")
@@ -2113,6 +2256,11 @@ protected override void BuildModel(ModelBuilder modelBuilder)
21132256

21142257
b.Navigation("Statistics");
21152258
});
2259+
2260+
modelBuilder.Entity("Refresh.Database.Models.Reports.Report", b =>
2261+
{
2262+
b.Navigation("Players");
2263+
});
21162264
#pragma warning restore 612, 618
21172265
}
21182266
}

Refresh.Database/Models/Reports/Report.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,26 @@ public class Report
1313
public GameUser Reporter { get; set; } = null!;
1414
public DateTimeOffset ReportDate { get; set; }
1515

16-
public string LevelHash { get; set; } = "0";
17-
public string GriefStateHash { get; set; } = "0";
18-
public ICollection<ReportPlayerRelation> Players { get; set; } = new List<ReportPlayerRelation>();
16+
// level/evidence data
17+
public int? LevelId { get; set; }
18+
[ForeignKey("LevelId")]
19+
public GameLevel? Level { get; set; }
20+
public string LevelType { get; set; } = string.Empty;
21+
public string InitialStateHash { get; set; } = "0"; // hash for initial level state asset
22+
public string GriefStateHash { get; set; } = "0"; // hash for griefed level state asset
1923

20-
public int PhotoId { get; set; }
21-
[ForeignKey("PhotoId")]
22-
public GamePhoto Photo { get; set; } = null!;
24+
// evidence
25+
public string PhotoAssetHash { get; set; } = "0";
2326
public string MarkerRect { get; set; } = string.Empty; // normalized "l,t,r,b"
24-
25-
public ReportStatus Status { get; set; } = ReportStatus.Pending;
27+
public ICollection<ReportPlayerRelation> Players { get; set; } = new List<ReportPlayerRelation>();
28+
29+
// report details
2630
public ReportType Type { get; set; } = ReportType.Unknown;
2731
public string Description { get; set; } = string.Empty;
32+
public ReportStatus Status { get; set; } = ReportStatus.Pending;
2833

34+
// Moderation
2935
public GameUser? ReviewedBy { get; set; }
3036
public DateTimeOffset? ReviewedDate { get; set; }
3137
public string? ModeratorNotes { get; set; }
32-
}
38+
}

0 commit comments

Comments
 (0)