feat: goddess API routes, services, and tests (chunk 4)

Add six new goddess-mode API routes (boss fight, consecration,
enlightenment, upgrade purchase, crafting, exploration) alongside
matching service modules and full test suites at 100% coverage.
This commit is contained in:
2026-04-13 15:48:35 -07:00
committed by Naomi Carrigan
parent 7da1f3942d
commit 0d36b255ee
19 changed files with 4250 additions and 16 deletions
+20
View File
@@ -49,12 +49,22 @@ export type {
AuthResponse,
BossChallengeRequest,
BossChallengeResponse,
BuyConsecrationUpgradeRequest,
BuyConsecrationUpgradeResponse,
BuyEchoUpgradeRequest,
BuyEchoUpgradeResponse,
BuyEnlightenmentUpgradeRequest,
BuyEnlightenmentUpgradeResponse,
BuyGoddessUpgradeRequest,
BuyGoddessUpgradeResponse,
BuyPrestigeUpgradeRequest,
BuyPrestigeUpgradeResponse,
ConsecrationRequest,
ConsecrationResponse,
CraftRecipeRequest,
CraftRecipeResponse,
EnlightenmentRequest,
EnlightenmentResponse,
ExploreClaimableResponse,
ExploreCollectEventResult,
ExploreCollectRequest,
@@ -63,6 +73,16 @@ export type {
ExploreStartResponse,
ForceUnlocksResponse,
GiteaRelease,
GoddessBossChallengeRequest,
GoddessBossChallengeResponse,
GoddessCraftRequest,
GoddessCraftResponse,
GoddessExploreClaimableResponse,
GoddessExploreCollectEventResult,
GoddessExploreCollectRequest,
GoddessExploreCollectResponse,
GoddessExploreStartRequest,
GoddessExploreStartResponse,
LeaderboardCategory,
LeaderboardEntry,
LeaderboardResponse,
+204
View File
@@ -564,12 +564,196 @@ interface SyncNewContentResponse {
*/
zonesPatched: number;
/**
* Number of goddess achievements added to the save.
*/
goddessAchievementsAdded: number;
/**
* Number of goddess bosses added to the save.
*/
goddessBossesAdded: number;
/**
* Number of goddess disciples added to the save.
*/
goddessDiscipesAdded: number;
/**
* Number of goddess equipment items added to the save.
*/
goddessEquipmentAdded: number;
/**
* Number of goddess exploration areas added to the save.
*/
goddessExplorationAreasAdded: number;
/**
* Number of goddess quests added to the save.
*/
goddessQuestsAdded: number;
/**
* Number of goddess upgrades added to the save.
*/
goddessUpgradesAdded: number;
/**
* Number of goddess zones added to the save.
*/
goddessZonesAdded: number;
/**
* HMAC-SHA256 signature of the updated state for anti-cheat chain continuity.
*/
signature?: string;
}
interface GoddessBossChallengeRequest {
bossId: string;
}
interface GoddessBossChallengeResponse {
won: boolean;
partyDPS: number;
bossDPS: number;
bossHpBefore: number;
bossMaxHp: number;
bossHpAtBattleEnd: number;
bossNewHp: number;
partyMaxHp: number;
partyHpRemaining: number;
rewards?: {
prayers: number;
divinity: number;
stardust: number;
upgradeIds: Array<string>;
equipmentIds: Array<string>;
/**
* One-time divinity bounty awarded for defeating this boss for the very first time.
*/
bountyDivinity: number;
};
casualties?: Array<{
discipleId: string;
killed: number;
}>;
/**
* HMAC-SHA256 signature of the updated state for anti-cheat chain continuity.
*/
signature?: string;
}
type ConsecrationRequest = Record<string, never>;
interface ConsecrationResponse {
/**
* Divinity earned from this consecration.
*/
divinityEarned: number;
// eslint-disable-next-line unicorn/no-keyword-prefix -- API response field name required by client
newConsecrationCount: number;
}
interface BuyConsecrationUpgradeRequest {
upgradeId: string;
}
interface BuyConsecrationUpgradeResponse {
divinityRemaining: number;
purchasedUpgradeIds: Array<string>;
divinityPrayersMultiplier: number;
divinityDisciplesMultiplier: number;
divinityCombatMultiplier: number;
}
type EnlightenmentRequest = Record<string, never>;
interface EnlightenmentResponse {
/**
* Stardust earned from this enlightenment.
*/
stardustEarned: number;
// eslint-disable-next-line unicorn/no-keyword-prefix -- API response field name required by client
newEnlightenmentCount: number;
}
interface BuyEnlightenmentUpgradeRequest {
upgradeId: string;
}
interface BuyEnlightenmentUpgradeResponse {
stardustRemaining: number;
purchasedUpgradeIds: Array<string>;
stardustPrayersMultiplier: number;
stardustCombatMultiplier: number;
stardustConsecrationThresholdMultiplier: number;
stardustConsecrationDivinityMultiplier: number;
stardustMetaMultiplier: number;
}
interface BuyGoddessUpgradeRequest {
upgradeId: string;
}
interface BuyGoddessUpgradeResponse {
prayersRemaining: number;
divinityRemaining: number;
stardustRemaining: number;
}
interface GoddessCraftRequest {
recipeId: string;
}
interface GoddessCraftResponse {
recipeId: string;
bonusType: string;
bonusValue: number;
craftedPrayersMultiplier: number;
craftedDivinityMultiplier: number;
craftedCombatMultiplier: number;
materials: Array<{ materialId: string; quantity: number }>;
}
interface GoddessExploreStartRequest {
areaId: string;
}
interface GoddessExploreStartResponse {
areaId: string;
endsAt: number;
}
interface GoddessExploreCollectRequest {
areaId: string;
}
interface GoddessExploreCollectEventResult {
text: string;
prayersChange: number;
discipleLostCount: number;
materialGained: { materialId: string; quantity: number } | null;
}
interface GoddessExploreCollectResponse {
foundNothing: boolean;
nothingMessage?: string;
materialsFound: Array<{ materialId: string; quantity: number }>;
event: GoddessExploreCollectEventResult | null;
}
interface GoddessExploreClaimableResponse {
claimable: boolean;
}
export type {
AboutResponse,
ApiError,
@@ -578,12 +762,22 @@ export type {
AuthResponse,
BossChallengeRequest,
BossChallengeResponse,
BuyConsecrationUpgradeRequest,
BuyConsecrationUpgradeResponse,
BuyEchoUpgradeRequest,
BuyEchoUpgradeResponse,
BuyEnlightenmentUpgradeRequest,
BuyEnlightenmentUpgradeResponse,
BuyGoddessUpgradeRequest,
BuyGoddessUpgradeResponse,
BuyPrestigeUpgradeRequest,
BuyPrestigeUpgradeResponse,
ConsecrationRequest,
ConsecrationResponse,
CraftRecipeRequest,
CraftRecipeResponse,
EnlightenmentRequest,
EnlightenmentResponse,
ExploreClaimableResponse,
ExploreCollectEventResult,
ExploreCollectRequest,
@@ -592,6 +786,16 @@ export type {
ExploreStartResponse,
ForceUnlocksResponse,
GiteaRelease,
GoddessBossChallengeRequest,
GoddessBossChallengeResponse,
GoddessCraftRequest,
GoddessCraftResponse,
GoddessExploreClaimableResponse,
GoddessExploreCollectEventResult,
GoddessExploreCollectRequest,
GoddessExploreCollectResponse,
GoddessExploreStartRequest,
GoddessExploreStartResponse,
LeaderboardCategory,
LeaderboardEntry,
LeaderboardResponse,