fix: resolve specificStadium achievement ID mismatch

The Green Monster (Fenway) and Ivy League (Wrigley) achievements
weren't working because:
1. Symbolic IDs use lowercase sport (stadium_mlb_bos)
2. Sport enum uses uppercase raw values (MLB)
3. Visits store stadium UUIDs, not symbolic IDs

Added resolveSymbolicStadiumId() helper that:
- Uppercases the sport string before Sport(rawValue:)
- Looks up team by abbreviation and sport
- Returns the team's stadiumId as UUID string

Also fixed:
- getStadiumIdsForLeague returns UUID strings (not symbolic IDs)
- AchievementProgress.isEarned computed from progress OR stored record
- getStadiumIdsForDivision queries CanonicalTeam properly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-11 22:22:29 -06:00
parent dcd5edb229
commit 5c13650742
20 changed files with 1619 additions and 141 deletions

View File

@@ -6,6 +6,10 @@
objectVersion = 77;
objects = {
/* Begin PBXBuildFile section */
1CC750E42F148BA4007D870A /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = 1CC750E32F148BA4007D870A /* SwiftSoup */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
1CA7F9052F0D647300490ABD /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
@@ -65,6 +69,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1CC750E42F148BA4007D870A /* SwiftSoup in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -91,6 +96,7 @@
1CA7F8F52F0D647100490ABD /* SportsTime */,
1CA7F9072F0D647300490ABD /* SportsTimeTests */,
1CA7F9112F0D647400490ABD /* SportsTimeUITests */,
1CC750E22F148BA4007D870A /* Frameworks */,
1CA7F8F42F0D647100490ABD /* Products */,
);
sourceTree = "<group>";
@@ -105,6 +111,13 @@
name = Products;
sourceTree = "<group>";
};
1CC750E22F148BA4007D870A /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -125,6 +138,7 @@
);
name = SportsTime;
packageProductDependencies = (
1CC750E32F148BA4007D870A /* SwiftSoup */,
);
productName = SportsTime;
productReference = 1CA7F8F32F0D647100490ABD /* SportsTime.app */;
@@ -208,6 +222,9 @@
);
mainGroup = 1CA7F8EA2F0D647100490ABD;
minimizedProjectReferenceProxies = 1;
packageReferences = (
1CC750E12F1487A8007D870A /* XCRemoteSwiftPackageReference "SwiftSoup" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 1CA7F8F42F0D647100490ABD /* Products */;
projectDirPath = "";
@@ -597,6 +614,25 @@
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
1CC750E12F1487A8007D870A /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/scinfu/SwiftSoup";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.11.3;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
1CC750E32F148BA4007D870A /* SwiftSoup */ = {
isa = XCSwiftPackageProductDependency;
package = 1CC750E12F1487A8007D870A /* XCRemoteSwiftPackageReference "SwiftSoup" */;
productName = SwiftSoup;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 1CA7F8EB2F0D647100490ABD /* Project object */;
}