diff --git a/src/controllers/api/unlockShipFeatureController.ts b/src/controllers/api/unlockShipFeatureController.ts index fb047d8d..e24a9c2c 100644 --- a/src/controllers/api/unlockShipFeatureController.ts +++ b/src/controllers/api/unlockShipFeatureController.ts @@ -1,11 +1,20 @@ import type { RequestHandler } from "express"; -import { updateShipFeature } from "../../services/personalRoomsService.ts"; -import type { IUnlockShipFeatureRequest } from "../../types/requestTypes.ts"; -import { parseString } from "../../helpers/general.ts"; +import { getAccountIdForRequest } from "../../services/loginService.ts"; +import { getInventory } from "../../services/inventoryService.ts"; +import { getJSONfromString } from "../../helpers/stringHelpers.ts"; +import { unlockShipFeature } from "../../services/personalRoomsService.ts"; export const unlockShipFeatureController: RequestHandler = async (req, res) => { - const accountId = parseString(req.query.accountId); - const shipFeatureRequest = JSON.parse((req.body as string).toString()) as IUnlockShipFeatureRequest; - await updateShipFeature(accountId, shipFeatureRequest.Feature); + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId, "MiscItems accountOwnerId"); + const request = getJSONfromString(String(req.body)); + + await unlockShipFeature(inventory, request.Feature); + await inventory.save(); res.send([]); }; +interface IUnlockShipFeatureRequest { + Feature: string; + KeyChain: string; + ChainStage: number; +} diff --git a/src/services/personalRoomsService.ts b/src/services/personalRoomsService.ts index 56c32af9..689bcc62 100644 --- a/src/services/personalRoomsService.ts +++ b/src/services/personalRoomsService.ts @@ -1,7 +1,9 @@ import { PersonalRooms } from "../models/personalRoomsModel.ts"; -import { addItem, getInventory } from "./inventoryService.ts"; +import { addItem } from "./inventoryService.ts"; import type { IGardeningDatabase, TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes.ts"; import { getRandomElement } from "./rngService.ts"; +import type { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel.ts"; +import { logger } from "../utils/logger.ts"; export const getPersonalRooms = async ( accountId: string, @@ -15,19 +17,18 @@ export const getPersonalRooms = async ( return personalRooms; }; -export const updateShipFeature = async (accountId: string, shipFeature: string): Promise => { - const personalRooms = await getPersonalRooms(accountId); +export const unlockShipFeature = async (inventory: TInventoryDatabaseDocument, shipFeature: string): Promise => { + const personalRooms = await getPersonalRooms(inventory.accountOwnerId.toString()); if (personalRooms.Ship.Features.includes(shipFeature)) { - throw new Error(`ship feature ${shipFeature} already unlocked`); + logger.warn(`ship feature ${shipFeature} already unlocked`); + } else { + personalRooms.Ship.Features.push(shipFeature); + await personalRooms.save(); + + const miscItem = inventory.MiscItems.find(x => x.ItemType === shipFeature); + if (miscItem && miscItem.ItemCount > 0) await addItem(inventory, shipFeature, -1); } - - personalRooms.Ship.Features.push(shipFeature); - await personalRooms.save(); - - const inventory = await getInventory(accountId); - await addItem(inventory, shipFeature, -1); - await inventory.save(); }; export const createGarden = (): IGardeningDatabase => { diff --git a/src/services/questService.ts b/src/services/questService.ts index 0a4ad1aa..bfb53d59 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -11,7 +11,7 @@ import { addFixedLevelRewards } from "./missionInventoryUpdateService.ts"; import type { IInventoryChanges } from "../types/purchaseTypes.ts"; import questCompletionItems from "../../static/fixed_responses/questCompletionRewards.json" with { type: "json" }; import type { ITypeCount } from "../types/commonTypes.ts"; -import { updateShipFeature } from "./personalRoomsService.ts"; +import { unlockShipFeature } from "./personalRoomsService.ts"; export interface IUpdateQuestRequest { QuestKeys: IQuestKeyClient[]; @@ -298,10 +298,7 @@ const handleQuestCompletion = async ( // Unfaitful fix for "Examine the Reliquary on the Railjack" if (questKey == "/Lotus/Types/Keys/RailJackBuildQuest/RailjackBuildQuestKeyChain") { - await updateShipFeature( - inventory.accountOwnerId.toString(), - "/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem" - ); // only works with relog + await unlockShipFeature(inventory, "/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem"); // only works with relog await addItems(inventory, ["/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem"], inventoryChanges); // required item to trigger cutscene } diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index d762edd8..ed82d296 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -234,11 +234,6 @@ export interface IUpgradeOperation { PolarizeValue: ArtifactPolarity; PolarityRemap: IPolarity[]; } -export interface IUnlockShipFeatureRequest { - Feature: string; - KeyChain: string; - ChainStage: number; -} export interface IVoidTearParticipantInfo { AccountId: string;