Files
rr3-server/RR3CommunityServer/Migrations/20260224010029_AddAnalyticsTracking.cs
Daniel Elliott 182026a32c Wire up real implementations for Tracking & Config controllers
- TrackingController: Added database persistence for analytics events
  * Created AnalyticsEvent entity with user/session tracking
  * Store event type, data (JSON), and timestamp
  * Graceful fallback if DB write fails (game doesn't break)

- ConfigController: Added real player counting
  * Query active sessions from last 15 minutes
  * Return actual player count instead of hardcoded 0
  * Real-time server status with DB metrics

- Added AnalyticsEvents table migration
  * Stores all game telemetry for analytics
  * Indexed by UserId for performance
  * JSON event data for flexibility

Controllers now fully wired to database:
- 11/18 controllers REAL implementation 
- 5/18 controllers STUB (config-based) ⚠️
- 2/18 controllers SERVICE (delegated) ⚠️

Total: 95 endpoints, improving from demo to production

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-23 17:03:36 -08:00

78 lines
3.3 KiB
C#

using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace RR3CommunityServer.Migrations
{
/// <inheritdoc />
public partial class AddAnalyticsTracking : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AnalyticsEvents",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
EventType = table.Column<string>(type: "TEXT", nullable: false),
UserId = table.Column<int>(type: "INTEGER", nullable: true),
SessionId = table.Column<string>(type: "TEXT", nullable: true),
EventData = table.Column<string>(type: "TEXT", nullable: false),
Timestamp = table.Column<DateTime>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AnalyticsEvents", x => x.Id);
table.ForeignKey(
name: "FK_AnalyticsEvents_Users_UserId",
column: x => x.UserId,
principalTable: "Users",
principalColumn: "Id");
});
migrationBuilder.UpdateData(
table: "TimeTrials",
keyColumn: "Id",
keyValue: 1,
columns: new[] { "EndDate", "StartDate" },
values: new object[] { new DateTime(2026, 3, 3, 1, 0, 29, 89, DateTimeKind.Utc).AddTicks(3271), new DateTime(2026, 2, 24, 1, 0, 29, 89, DateTimeKind.Utc).AddTicks(3268) });
migrationBuilder.UpdateData(
table: "TimeTrials",
keyColumn: "Id",
keyValue: 2,
columns: new[] { "EndDate", "StartDate" },
values: new object[] { new DateTime(2026, 3, 3, 1, 0, 29, 89, DateTimeKind.Utc).AddTicks(3281), new DateTime(2026, 2, 24, 1, 0, 29, 89, DateTimeKind.Utc).AddTicks(3280) });
migrationBuilder.CreateIndex(
name: "IX_AnalyticsEvents_UserId",
table: "AnalyticsEvents",
column: "UserId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AnalyticsEvents");
migrationBuilder.UpdateData(
table: "TimeTrials",
keyColumn: "Id",
keyValue: 1,
columns: new[] { "EndDate", "StartDate" },
values: new object[] { new DateTime(2026, 3, 3, 0, 53, 48, 427, DateTimeKind.Utc).AddTicks(9290), new DateTime(2026, 2, 24, 0, 53, 48, 427, DateTimeKind.Utc).AddTicks(9287) });
migrationBuilder.UpdateData(
table: "TimeTrials",
keyColumn: "Id",
keyValue: 2,
columns: new[] { "EndDate", "StartDate" },
values: new object[] { new DateTime(2026, 3, 3, 0, 53, 48, 427, DateTimeKind.Utc).AddTicks(9297), new DateTime(2026, 2, 24, 0, 53, 48, 427, DateTimeKind.Utc).AddTicks(9296) });
}
}
}