diff --git a/src/controllers/api/giveKeyChainTriggeredItemsController.ts b/src/controllers/api/giveKeyChainTriggeredItemsController.ts index 1f875cd5..4981bd11 100644 --- a/src/controllers/api/giveKeyChainTriggeredItemsController.ts +++ b/src/controllers/api/giveKeyChainTriggeredItemsController.ts @@ -1,12 +1,12 @@ import type { RequestHandler } from "express"; -import { parseString } from "../../helpers/general.ts"; import { getJSONfromString } from "../../helpers/stringHelpers.ts"; import { getInventory } from "../../services/inventoryService.ts"; import { giveKeyChainItem } from "../../services/questService.ts"; import type { IKeyChainRequest } from "../../types/requestTypes.ts"; +import { getAccountIdForRequest } from "../../services/loginService.ts"; export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => { - const accountId = parseString(req.query.accountId); + const accountId = await getAccountIdForRequest(req); const keyChainInfo = getJSONfromString((req.body as string).toString()); const inventory = await getInventory(accountId); diff --git a/src/controllers/api/reverseQuestProgressController.ts b/src/controllers/api/reverseQuestProgressController.ts new file mode 100644 index 00000000..4c62d743 --- /dev/null +++ b/src/controllers/api/reverseQuestProgressController.ts @@ -0,0 +1,17 @@ +import type { RequestHandler } from "express"; +import { getAccountIdForRequest } from "../../services/loginService.ts"; +import { resetQuestKeyToStage } from "../../services/questService.ts"; +import { getInventory } from "../../services/inventoryService.ts"; +import { getJSONfromString } from "../../helpers/stringHelpers.ts"; +import type { IKeyChainRequest } from "../../types/requestTypes.ts"; + +export const reverseQuestProgressController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const keyChainInfo = getJSONfromString((req.body as string).toString()); + + const inventory = await getInventory(accountId); + resetQuestKeyToStage(inventory, keyChainInfo); + await inventory.save(); + + res.end(); +}; diff --git a/src/routes/api.ts b/src/routes/api.ts index 5502a0c8..e594a2e7 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -120,6 +120,7 @@ import { rerollRandomModController } from "../controllers/api/rerollRandomModCon import { researchMushroomController } from "../controllers/api/researchMushroomController.ts"; import { resetQuestProgressController } from "../controllers/api/resetQuestProgressController.ts"; import { retrievePetFromStasisController } from "../controllers/api/retrievePetFromStasisController.ts"; +import { reverseQuestProgressController } from "../controllers/api/reverseQuestProgressController.ts"; import { saveDialogueController } from "../controllers/api/saveDialogueController.ts"; import { saveLoadoutController } from "../controllers/api/saveLoadoutController.ts"; import { saveSettingsController } from "../controllers/api/saveSettingsController.ts"; @@ -323,6 +324,7 @@ apiRouter.post("/renamePet.php", renamePetController); apiRouter.post("/rerollRandomMod.php", rerollRandomModController); apiRouter.post("/researchMushroom.php", researchMushroomController); apiRouter.post("/retrievePetFromStasis.php", retrievePetFromStasisController); +apiRouter.post("/reverseQuestProgress.php", reverseQuestProgressController); apiRouter.post("/saveDialogue.php", saveDialogueController); apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/saveSettings.php", saveSettingsController); diff --git a/src/services/questService.ts b/src/services/questService.ts index b99d1879..ad1f8df6 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -92,6 +92,30 @@ export const updateQuestStage = ( } }; +export const resetQuestKeyToStage = ( + inventory: TInventoryDatabaseDocument, + { KeyChain, ChainStage }: IKeyChainRequest +): void => { + const quest = inventory.QuestKeys.find(quest => quest.ItemType === KeyChain); + + if (!quest) { + throw new Error(`Quest ${KeyChain} not found in QuestKeys`); + } + + quest.Progress ??= []; + + quest.Progress.splice(1 + ChainStage); // remove stages past the target + + const questStage = quest.Progress[ChainStage]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (questStage) { + const run = quest.Progress[0].c; + if (run >= 0) { + questStage.c = run - 1; + } + } +}; + export const addQuestKey = ( inventory: TInventoryDatabaseDocument, questKey: IQuestKeyDatabase