refactor: change domain model IDs from UUID to String canonical IDs

This refactor fixes the achievement system by using stable canonical string
IDs (e.g., "stadium_mlb_fenway_park") instead of random UUIDs. This ensures
stadium mappings for achievements are consistent across app launches and
CloudKit sync operations.

Changes:
- Stadium, Team, Game: id property changed from UUID to String
- Trip, TripStop, TripPreferences: updated to use String IDs for games/stadiums
- CKModels: removed UUID parsing, use canonical IDs directly
- AchievementEngine: now matches against canonical stadium IDs
- All test files updated to use String IDs instead of UUID()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-12 09:24:33 -06:00
parent 4b2cacaeba
commit 1703ca5b0f
53 changed files with 642 additions and 727 deletions

View File

@@ -181,10 +181,10 @@ final class AchievementEngineIntegrationTests: XCTestCase {
var modelContainer: ModelContainer!
var modelContext: ModelContext!
// Test UUIDs for stadiums
let fenwayUUID = UUID(uuidString: "11111111-1111-1111-1111-111111111111")!
let wrigleyUUID = UUID(uuidString: "22222222-2222-2222-2222-222222222222")!
let msgUUID = UUID(uuidString: "33333333-3333-3333-3333-333333333333")!
// Canonical IDs for test stadiums
let fenwayId = "stadium_mlb_bos"
let wrigleyId = "stadium_mlb_chc"
let msgId = "stadium_nba_nyk"
override func setUp() async throws {
try await super.setUp()
@@ -231,8 +231,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
private func setupTestData() async {
// Create Fenway Park stadium
let fenway = CanonicalStadium(
canonicalId: "stadium_mlb_bos",
uuid: fenwayUUID,
canonicalId: fenwayId,
name: "Fenway Park",
city: "Boston",
state: "MA",
@@ -245,8 +244,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Create Wrigley Field stadium
let wrigley = CanonicalStadium(
canonicalId: "stadium_mlb_chc",
uuid: wrigleyUUID,
canonicalId: wrigleyId,
name: "Wrigley Field",
city: "Chicago",
state: "IL",
@@ -259,8 +257,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Create MSG stadium
let msg = CanonicalStadium(
canonicalId: "stadium_nba_nyk",
uuid: msgUUID,
canonicalId: msgId,
name: "Madison Square Garden",
city: "New York",
state: "NY",
@@ -317,10 +314,9 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Create engine
let engine = AchievementEngine(modelContext: modelContext, dataProvider: AppDataProvider.shared)
// Create a visit to Fenway using the actual stadium UUID format
// Create a visit to Fenway using the canonical stadium ID
let visit = StadiumVisit(
canonicalStadiumId: fenwayUUID.uuidString,
stadiumUUID: fenwayUUID,
stadiumId: fenwayId,
stadiumNameAtVisit: "Fenway Park",
visitDate: Date(),
sport: .mlb
@@ -347,8 +343,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
let engine = AchievementEngine(modelContext: modelContext, dataProvider: AppDataProvider.shared)
let visit = StadiumVisit(
canonicalStadiumId: wrigleyUUID.uuidString,
stadiumUUID: wrigleyUUID,
stadiumId: wrigleyId,
stadiumNameAtVisit: "Wrigley Field",
visitDate: Date(),
sport: .mlb
@@ -386,8 +381,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Add a visit
let visit = StadiumVisit(
canonicalStadiumId: fenwayUUID.uuidString,
stadiumUUID: fenwayUUID,
stadiumId: fenwayId,
stadiumNameAtVisit: "Fenway Park",
visitDate: Date(),
sport: .mlb
@@ -406,10 +400,9 @@ final class AchievementEngineIntegrationTests: XCTestCase {
let engine = AchievementEngine(modelContext: modelContext, dataProvider: AppDataProvider.shared)
// Add TD Garden for NHL
let tdGardenUUID = UUID()
let tdGardenId = "stadium_nhl_bos"
let tdGarden = CanonicalStadium(
canonicalId: "stadium_nhl_bos",
uuid: tdGardenUUID,
canonicalId: tdGardenId,
name: "TD Garden",
city: "Boston",
state: "MA",
@@ -437,8 +430,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Visit MLB stadium only - not enough
let mlbVisit = StadiumVisit(
canonicalStadiumId: fenwayUUID.uuidString,
stadiumUUID: fenwayUUID,
stadiumId: fenwayId,
stadiumNameAtVisit: "Fenway Park",
visitDate: Date(),
sport: .mlb
@@ -453,8 +445,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Visit NBA stadium - still not enough
let nbaVisit = StadiumVisit(
canonicalStadiumId: msgUUID.uuidString,
stadiumUUID: msgUUID,
stadiumId: msgId,
stadiumNameAtVisit: "MSG",
visitDate: Date(),
sport: .nba
@@ -469,8 +460,7 @@ final class AchievementEngineIntegrationTests: XCTestCase {
// Visit NHL stadium - now earned!
let nhlVisit = StadiumVisit(
canonicalStadiumId: tdGardenUUID.uuidString,
stadiumUUID: tdGardenUUID,
stadiumId: tdGardenId,
stadiumNameAtVisit: "TD Garden",
visitDate: Date(),
sport: .nhl