diff --git a/config.json b/config.json index 9dd254d5..d70bc643 100644 --- a/config.json +++ b/config.json @@ -8,5 +8,6 @@ "skipTutorial": true, "unlockAllMissions": true, "unlockAllQuests": false, - "infiniteResources": true + "infiniteResources": true, + "unlockallShipFeatures": true } diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts index b0501365..359298f6 100644 --- a/src/controllers/api/getShipController.ts +++ b/src/controllers/api/getShipController.ts @@ -1,90 +1,60 @@ -import { Ship } from "@/src/models/shipModel"; -import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; import { RequestHandler } from "express"; +import config from "@/config.json"; +import allShipFeatures from "@/static/fixed_responses/allShipFeatures.json"; +import { parseString } from "@/src/helpers/general"; +import { getShip } from "@/src/services/shipService"; +import { PersonalRooms } from "@/src/models/shipModel"; +import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; +import { logger } from "@/src/utils/logger"; +import { toOid } from "@/src/helpers/inventoryHelpers"; +import { IGetShipResponse } from "@/src/types/shipTypes"; // eslint-disable-next-line @typescript-eslint/no-misused-promises -const getShipController: RequestHandler = async (req, res) => { - const accountId = req.query.accountId; - const ship = await Ship.findOne({ ShipOwnerId: accountId }).populate<{ - LoadOutInventory: { LoadOutPresets: ILoadoutDatabase }; - }>("LoadOutInventory.LoadOutPresets"); +export const getShipController: RequestHandler = async (req, res) => { + const accountId = parseString(req.query.accountId); + const personalRooms = await getPersonalRooms(accountId); + const loadout = await getLoadout(accountId); + const ship = await getShip(accountId, "ShipInteriorColors ShipAttachments SkinFlavourItem"); - if (!ship) { - res.status(500).json({ error: "error finding a corresponding ship" }); - return; + const getShipResponse: IGetShipResponse = { + ShipOwnerId: accountId, + LoadOutInventory: { LoadOutPresets: loadout.toJSON() }, + Ship: { + ...personalRooms.toJSON().Ship, + ShipId: toOid(personalRooms.activeShipId), + ShipInterior: { + Colors: ship.ShipInteriorColors, + ShipAttachments: ship.ShipAttachments, + SkinFlavourItem: ship.SkinFlavourItem + } + }, + Apartment: personalRooms.Apartment + }; + + if (config.unlockallShipFeatures) { + getShipResponse.Ship.Features = allShipFeatures; } - ship.Ship.Features = [ - "/Lotus/Types/Items/ShipFeatureItems/AdvancedOrdisFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/AlchemyRoomFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/AlertsFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/CeresNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ClanFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ErisNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/EuropaNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/FoundryConcurrentBuildFormaFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryItem", - "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/JupiterNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/MarketTierOneFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/MarketTierTwoFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/MarsNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ModsFusionFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ModsTransmuteFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/NeptuneNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/PhobosNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/PlutoNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodBraceFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHullFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleLeftFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleRightFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackTailFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItemBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItemBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItemBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItemBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItemBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItemBlueprint", - "/Lotus/Types/Items/ShipFeatureItems/RailjackCephalonShipFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/SaturnNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/SednaNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ShipFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/SolarChartFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/UranusNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/VenusNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/VoidProjectionFeatureItem" - ]; - - res.json(ship); + res.json(getShipResponse); }; -export { getShipController }; +export const getLoadout = async (accountId: string) => { + const loadout = await Loadout.findOne({ loadoutOwnerId: accountId }); + + if (!loadout) { + logger.error(`loadout not found for account ${accountId}`); + throw new Error("loadout not found"); + } + + return loadout; +}; + +export const getPersonalRooms = async (accountId: string) => { + const personalRooms = await PersonalRooms.findOne({ personalRoomsOwnerId: accountId }); + + if (!personalRooms) { + logger.error(`personal rooms not found for account ${accountId}`); + throw new Error("personal rooms not found"); + } + return personalRooms; +}; diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts index 8f217071..5cfbc64d 100644 --- a/src/controllers/api/inventoryController.ts +++ b/src/controllers/api/inventoryController.ts @@ -6,6 +6,8 @@ import config from "@/config.json"; import allMissions from "@/static/fixed_responses/allMissions.json"; import allQuestKeys from "@/static/fixed_responses/allQuestKeys.json"; import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; +import { Ship } from "@/src/models/shipModel"; +import { IShipInventory } from "@/src/types/inventoryTypes/inventoryTypes"; const inventoryController: RequestHandler = async (request: Request, response: Response) => { const accountId = request.query.accountId; @@ -15,24 +17,701 @@ const inventoryController: RequestHandler = async (request: Request, response: R return; } - const inventory = await Inventory.findOne({ accountOwnerId: accountId }).populate<{ - LoadOutPresets: ILoadoutDatabase; - }>("LoadOutPresets"); + const inventory = await Inventory.findOne({ accountOwnerId: accountId }) + .populate<{ + LoadOutPresets: ILoadoutDatabase; + }>("LoadOutPresets") + .populate<{ Ships: IShipInventory }>("Ships", "-ShipInteriorColors -ShipAttachments -SkinFlavourItem"); if (!inventory) { response.status(400).json({ error: "inventory was undefined" }); return; } + console.log(inventory.Ships); + // const ships = await Ship.find({ _id: { $in: inventory.Ships } }); + //TODO: make a function that converts from database representation to client const inventoryJSON = inventory.toJSON(); + console.log(inventoryJSON.Ships); const inventoryResponse = toInventoryResponse(inventoryJSON); if (config.unlockAllMissions) inventoryResponse.Missions = allMissions; if (config.unlockAllQuests) inventoryResponse.QuestKeys = allQuestKeys; - response.json(inventoryResponse); + (inventoryResponse.ShipDecorations = [ + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ChildDrawingA" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ChildDrawingB" + }, + { + ItemCount: 85, + ItemType: "/Lotus/Types/Items/ShipDecos/GlyphPictureFrame" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ChildDrawingC" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ChildDrawingD" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ChildDrawingF" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/OrbiterPictureFrameB" + }, + { + ItemCount: 13, + ItemType: "/Lotus/Types/Items/ShipDecos/ConclaveHeartOroOrnament" + }, + { + ItemCount: 18, + ItemType: "/Lotus/Types/Items/ShipDecos/Vignettes/Enemies/TeralystAFItem" + }, + { + ItemCount: 10, + ItemType: "/Lotus/Types/Items/ShipDecos/Vignettes/Enemies/TeralystBigAFItem" + }, + { + ItemCount: 6, + ItemType: "/Lotus/Types/Items/ShipDecos/Vignettes/Enemies/TeralystRainAFItem" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/Vignettes/Warframes/WarframeAFItem" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/PedistalPrime" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropEidolonShard" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropSentientCore" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyKubrodonUncommon" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyVirminkCommon" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyHorrasqueCommon" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyKubrodonCommon" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyKubrodonRare" + }, + { + ItemCount: 10, + ItemType: "/Lotus/Types/Items/ShipDecos/Vignettes/Enemies/ArachnoidCamperAFItem" + }, + { + ItemCount: 3, + ItemType: "/Lotus/Types/Items/ShipDecos/KubrowBust" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/KavatBust" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/RelayHydroidBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyDesertSkate" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationC" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationD" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardGauss" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationE" + }, + { + ItemCount: 3, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationF" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardGrendel" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardAtlas" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/KubrowToyB" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationG" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationH" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyThumper" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyThumperMedium" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardIvara" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardNova" + }, + { + ItemCount: 5, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationB" + }, + { + ItemCount: 5, + ItemType: "/Lotus/Types/Items/ShipDecos/BaroKiTeerDecorationA" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ExcaliburArchwingBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusShip/LisetPropGreedCoinGold" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusShip/LisetPropGreedCoinBlue" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusGreedReliefA" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyKuvaFortressBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyEarthBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyMercuryBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyVenusBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyLuaBronze" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusGreedReliefB" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyPhobosBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyMarsBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyCeresBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyJupiterBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyEuropaBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophySaturnBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFBeastMasterBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFChargerBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFEngineerBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFGruntBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFHealerBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFHeavyBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFHellionBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFSniperBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFTankBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyUranusBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusGreedReliefC" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyPlutoBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyErisBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophySednaBronze" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyDerelictBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyNeptuneBronze" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFRollerFloofRucksack" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFRollerFloofBeach" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFRollerFloof" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFRollerFloofRainbow" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/WFRollerFloofMorning" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusGreedReliefD" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusGreedReliefE" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CorpusGreedReliefF" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/ResourceDecoItemArgonCrystal" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/KuvaMetaBallOrnament" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/SUToolBox" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/SUTechToolA" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConG" + }, + { + ItemCount: 5, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConE" + }, + { + ItemCount: 8, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConI" + }, + { + ItemCount: 8, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConF" + }, + { + ItemCount: 3, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConJ" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/PlanetTrophies/PlanetTrophyDeimosBronze" + }, + { + ItemCount: 5, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConC" + }, + { + ItemCount: 5, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConB" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConD" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConH" + }, + { + ItemCount: 4, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardTennoConA" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/SUToolBoxLarge" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/SUFoodBox" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank01Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank02Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank03Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank04Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank05Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank06Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank07Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank08Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank09Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank10Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank11Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank12Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank13Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank14Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank15Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank16Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank17Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank18Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank19Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank20Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank21Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank22Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank23Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank24Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank25Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank26Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank27Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank28Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank29Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank30Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Events/TickerValentineWings" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyTicker" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/WeGame/LuckyKavat" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/WeGame/LuckyKavatWhite" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardSevagoth" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/WraithQuestRewardDeco" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/Deimos/PlushyMoonMonsterCommon" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/OrbiterPictureFrameBaro" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/YareliMerulinaBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/MasteryTrophies/Rank31Trophy" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/TarotCardYareli" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/YareliBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropBallasSwordSheath" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/HeartOfDeimosAlbumCoverPoster" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/StalkerBobbleHead" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/GarvLatroxPoster" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Conquera2021Deco" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/TheNewWarKahlCommunityDisplay" + }, + { + ItemCount: 2, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/TheNewWarTeshinCommunityDisplay" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/NewWar/LisetPropBallasStaff" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/NewWar/LisetPropFamilyPortrait" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropNarmerMandolin" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropGrineerCutter" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/Deimos/PlushySunMonsterCommon" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropGrineerFlak" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/CNY2021Poster" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Plushies/PlushyTiger" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/LisetPropGyrePulseDecoration" + }, + { + ItemCount: 1, + ItemType: "/Lotus/Types/Items/ShipDecos/Venus/PrideCommunityDisplay" + } + ]), + // (inventoryResponse.Ships = [ + // { + // ItemType: "/Lotus/Types/Items/Ships/BlueSkyShip", + // ShipExterior: { + // SkinFlavourItem: "/Lotus/Upgrades/Skins/Liset/LisetBlueSkySkinStalker", + // Colors: { + // t0: 0, + // t1: 5703424, + // t2: 0, + // t3: 5703424, + // m0: 16742665, + // en: 16742665 + // } + // }, + // AirSupportPower: "/Lotus/Types/Restoratives/LisetMedStation", + // ItemId: { + // $oid: "5b9ee83aa38e4a3fb7235e39" + // } + // }, + // { + // ItemType: "/Lotus/Types/Items/Ships/NoraShip", + // AirSupportPower: "/Lotus/Types/Restoratives/LisetMedStation", + // ShipExterior: { + // Colors: { + // t0: 5703424, + // t1: 5703424, + // t2: 0, + // t3: 5703424, + // m0: 16742665, + // en: 16742665 + // }, + // SkinFlavourItem: "/Lotus/Upgrades/Skins/Liset/ZephyrDeluxeShipSkin", + // ShipAttachments: { + // HOOD_ORNAMENT: "/Lotus/Upgrades/Skins/Liset/MasteryHoodOrnament" + // } + // }, + // ItemId: { + // $oid: "5ef21701e56e414c3e5d39f5" + // } + // } + // ]); + response.json(inventoryResponse); }; export { inventoryController }; diff --git a/src/controllers/api/loginController.ts b/src/controllers/api/loginController.ts index 3f25182b..7dbef077 100644 --- a/src/controllers/api/loginController.ts +++ b/src/controllers/api/loginController.ts @@ -51,7 +51,7 @@ const loginController: RequestHandler = async (request, response) => { return; } catch (error: unknown) { if (error instanceof Error) { - throw new Error("error creating account", error); + throw new Error(`error creating account ${error.message}`); } } } diff --git a/src/controllers/api/setShipCustomizationsController.ts b/src/controllers/api/setShipCustomizationsController.ts new file mode 100644 index 00000000..39dee24e --- /dev/null +++ b/src/controllers/api/setShipCustomizationsController.ts @@ -0,0 +1,18 @@ +import { logger } from "@/src/utils/logger"; +import { RequestHandler } from "express"; + +export const setShipCustomizationsController: RequestHandler = (_req, res) => { + try { + res.send(200); + handleSetShipDecorations(); + } catch (error: unknown) { + if (error instanceof Error) { + logger.error(`error in saveLoadoutController: ${error.message}`); + res.status(400).json({ error: error.message }); + } else { + res.status(400).json({ error: "unknown error" }); + } + } + + function handleSetShipDecorations() {} +}; diff --git a/src/controllers/api/shipDecorationsController.ts b/src/controllers/api/shipDecorationsController.ts new file mode 100644 index 00000000..667a2006 --- /dev/null +++ b/src/controllers/api/shipDecorationsController.ts @@ -0,0 +1,76 @@ +import { getPersonalRooms } from "@/src/controllers/api/getShipController"; +import { parseString } from "@/src/helpers/general"; +import { getShip } from "@/src/services/shipService"; +import { logger } from "@/src/utils/logger"; +import { RequestHandler } from "express"; +import { Types } from "mongoose"; + +// eslint-disable-next-line @typescript-eslint/no-misused-promises +export const shipDecorationsController: RequestHandler = async (req, res) => { + const accountId = parseString(req.query.accountId); + const shipDecorationsRequest = JSON.parse(req.body as string) as IShipDecorationsRequest; + console.log(shipDecorationsRequest); + + try { + const placedDecoration = await handleSetShipDecorations(accountId, shipDecorationsRequest); + res.send(placedDecoration); + } catch (error: unknown) { + if (error instanceof Error) { + logger.error(`error in saveLoadoutController: ${error.message}`); + res.status(400).json({ error: error.message }); + } + } +}; + +const handleSetShipDecorations = async ( + accountId: string, + placedDecoration: IShipDecorationsRequest +): Promise => { + const personalRooms = await getPersonalRooms(accountId); + console.log(placedDecoration); + + const room = personalRooms.Ship.Rooms.find(room => room.Name === placedDecoration.Room); + + //TODO: check whether to remove from shipitems + + if (placedDecoration.RemoveId) { + room?.PlacedDecos?.pull({ _id: placedDecoration.RemoveId }); + await personalRooms.save(); + return { + DecoId: placedDecoration.RemoveId, + Room: placedDecoration.Room, + IsApartment: placedDecoration.IsApartment, + MaxCapacityIncrease: 0 + }; + } + + // TODO: handle capacity + + const decoId = new Types.ObjectId(); + room?.PlacedDecos?.push({ + Type: placedDecoration.Type, + Pos: placedDecoration.Pos, + Rot: placedDecoration.Rot, + _id: decoId + }); + + await personalRooms.save(); + + return { DecoId: decoId.toString(), Room: placedDecoration.Room, IsApartment: placedDecoration.IsApartment }; +}; + +export interface IShipDecorationsRequest { + Type: string; + Pos: [number, number, number]; + Rot: [number, number, number]; + Room: string; + IsApartment: boolean; + RemoveId: string; +} + +export interface IShipDecorationsResponse { + DecoId: string; + Room: string; + IsApartment: boolean; + MaxCapacityIncrease?: number; +} diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 52283fd7..d7f3ae81 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -6,7 +6,6 @@ import { IInventoryDatabase, IBooster, IInventoryResponse, - IInventoryDatabaseDocument, ISlots, IGenericItem, IMailbox, @@ -21,9 +20,7 @@ import { IChallengeProgress, IStepSequencer, IAffiliation, - IShip, INotePacks, - IShipExterior, ICompletedJobChain, ISeasonChallengeHistory, IPlayerSkills, @@ -108,7 +105,7 @@ const abilityOverrideSchema = new Schema({ Ability: String, Index: Number }); -const colorSchema = new Schema( +export const colorSchema = new Schema( { t0: Number, t1: Number, @@ -457,33 +454,6 @@ const affiliationsSchema = new Schema( { _id: false } ); -const shipExteriorSchema = new Schema( - { - SkinFlavourItem: String, - Colors: colorSchema, //TODO: perhaps too many colors here - ShipAttachments: { HOOD_ORNAMENT: String } - }, - { _id: false } -); - -const shipSchema = new Schema({ - ItemType: String, - ShipExterior: shipExteriorSchema, - AirSupportPower: String -}); - -shipSchema.virtual("ItemId").get(function () { - return { $oid: this._id.toString() }; -}); - -shipSchema.set("toJSON", { - virtuals: true, - transform(_document, returnedObject) { - delete returnedObject._id; - delete returnedObject.__v; - } -}); - const completedJobChainsSchema = new Schema( { LocationTag: String, @@ -773,7 +743,7 @@ const inventorySchema = new Schema( Horses: [GenericItemSchema], //LandingCraft like Liset - Ships: [shipSchema], + Ships: { type: [Schema.Types.ObjectId], ref: "Ships" }, // /Lotus/Types/Items/ShipDecos/ ShipDecorations: [typeCountSchema], diff --git a/src/models/inventoryModels/loadoutModel.ts b/src/models/inventoryModels/loadoutModel.ts index 37a8d104..87871138 100644 --- a/src/models/inventoryModels/loadoutModel.ts +++ b/src/models/inventoryModels/loadoutModel.ts @@ -93,4 +93,4 @@ type loadoutDocumentProps = { type loadoutModelType = Model; -export const LoadoutModel = model("Loadout", loadoutSchema); +export const Loadout = model("Loadout", loadoutSchema); diff --git a/src/models/shipModel.ts b/src/models/shipModel.ts index 4b16ebd2..048671ec 100644 --- a/src/models/shipModel.ts +++ b/src/models/shipModel.ts @@ -1,66 +1,112 @@ -import { Schema, model } from "mongoose"; -import { IShip } from "../types/shipTypes"; -import { IOid } from "../types/commonTypes"; -import { loadoutSchema } from "@/src/models/inventoryModels/loadoutModel"; +import { Model, Schema, StringSchemaDefinition, Types, model } from "mongoose"; +import { IApartment, IPlacedDecosDatabase, IRooms, IShipDatabase } from "../types/shipTypes"; +import { toOid } from "@/src/helpers/inventoryHelpers"; +import { colorSchema } from "@/src/models/inventoryModels/inventoryModel"; +import { IShipInventory } from "@/src/types/inventoryTypes/inventoryTypes"; -const roomSchema = new Schema( +const placedDecosSchema = new Schema( { - Name: String, - MaxCapacity: Number - }, - { _id: false } -); - -const shipSchema = new Schema( - { - Rooms: [roomSchema], - Features: [String], - ContentUrlSignature: String + Type: String, + Pos: [Number], + Rot: [Number] }, { id: false } ); -shipSchema.virtual("ShipId").get(function () { - return { $oid: this._id.toString() } satisfies IOid; +placedDecosSchema.virtual("id").get(function (this: IPlacedDecosDatabase) { + return toOid(this._id); }); -shipSchema.set("toJSON", { +placedDecosSchema.set("toJSON", { virtuals: true, transform(_document, returnedObject) { delete returnedObject._id; } }); -const apartmentSchema = new Schema({ - Rooms: [roomSchema], - FavouriteLoadouts: [Schema.Types.Mixed] +const roomSchema = new Schema( + { + Name: String, + MaxCapacity: Number, + PlacedDecos: [placedDecosSchema] + }, + { _id: false } +); + +const shipSchema = new Schema( + { + ItemType: String, + ShipOwnerId: Schema.Types.ObjectId, + ShipInteriorColors: colorSchema, + ShipExteriorColors: colorSchema, + AirSupportPower: String, + ShipAttachments: { HOOD_ORNAMENT: String }, + SkinFlavourItem: String + }, + { id: false } +); + +shipSchema.virtual("ItemId").get(function () { + return toOid(this._id); }); -apartmentSchema.set("toJSON", { +shipSchema.set("toJSON", { + virtuals: true, transform(_document, returnedObject) { + const shipResponse = returnedObject as IShipInventory; + const shipDatabase = returnedObject as IShipDatabase; delete returnedObject._id; - } -}); - -const shipDatabaseSchema = new Schema({ - ShipOwnerId: Schema.Types.ObjectId, - Ship: shipSchema, - Apartment: apartmentSchema, - LoadOutInventory: { - LoadOutPresets: { - type: Schema.Types.ObjectId, - ref: "Loadout" + delete returnedObject.__v; + delete returnedObject.ShipOwnerId; + console.log(shipResponse.ShipExterior); + if (shipResponse.ShipExterior) { + shipResponse.ShipExterior = { + Colors: shipDatabase.ShipExteriorColors, + ShipAttachments: shipDatabase.ShipAttachments, + SkinFlavourItem: shipDatabase.SkinFlavourItem + }; } } }); -shipDatabaseSchema.set("toJSON", { - transform(_document, returnedObject) { - delete returnedObject._id; - delete returnedObject.__v; - } +shipSchema.set("toObject", { + virtuals: true }); -const Ship = model("Ship", shipDatabaseSchema); +const apartmentSchema = new Schema( + { + Rooms: [roomSchema], + FavouriteLoadouts: [Schema.Types.Mixed] + }, + { _id: false } +); -export { Ship }; +export const Ship = model("Ships", shipSchema); + +export interface IPersonalRooms { + personalRoomsOwnerId: Types.ObjectId; + activeShipId: Types.ObjectId; + Ship: { Features: string[]; Rooms: IRooms[]; ContentUrlSignature: string }; + Apartment: IApartment; +} + +const orbiterSchema = new Schema({ Features: [String], Rooms: [roomSchema], ContentUrlSignature: String }); + +export const personalRoomsSchema = new Schema({ + personalRoomsOwnerId: Schema.Types.ObjectId, + activeShipId: Schema.Types.ObjectId, + Ship: orbiterSchema, + Apartment: apartmentSchema +}); + +type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray }; +type PersonalRoomsDocumentProps = { + Ship: { + Features: string[]; + Rooms: RoomsType[]; + }; +}; + +type PersonalRoomsModelType = Model; + +export const PersonalRooms = model("PersonalRooms", personalRoomsSchema); diff --git a/src/routes/api.ts b/src/routes/api.ts index 1c9270bd..44bfde3f 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -37,6 +37,8 @@ import { focusController } from "@/src/controllers/api/focusController"; import { inventorySlotsController } from "@/src/controllers/api/inventorySlotsController"; import { startRecipeController } from "@/src/controllers/api/startRecipeController"; import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController"; +import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController"; +import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController"; const apiRouter = express.Router(); @@ -65,6 +67,8 @@ apiRouter.get("/setBootLocation.php", setBootLocationController); // post // eslint-disable-next-line @typescript-eslint/no-misused-promises +apiRouter.post("/shipDecorations.php", shipDecorationsController); +apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController); apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/startRecipe.php", startRecipeController); apiRouter.post("/inventorySlots.php", inventorySlotsController); diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 9b74dad6..cc7fd350 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -19,12 +19,16 @@ import { IArtifactsRequest, IMissionInventoryUpdateRequest } from "../types/requ import { logger } from "@/src/utils/logger"; import { WeaponTypeInternal } from "@/src/services/itemDataService"; -export const createInventory = async (accountOwnerId: Types.ObjectId, loadOutPresetId: Types.ObjectId) => { +export const createInventory = async ( + accountOwnerId: Types.ObjectId, + defaultItemReferences: { loadOutPresetId: Types.ObjectId; ship: Types.ObjectId } +) => { try { const inventory = new Inventory({ ...new_inventory, accountOwnerId: accountOwnerId, - LoadOutPresets: loadOutPresetId + LoadOutPresets: defaultItemReferences.loadOutPresetId, + Ships: [defaultItemReferences.ship] }); if (config.skipStoryModeChoice) { inventory.StoryModeChoice = "WARFRAME"; diff --git a/src/services/loginService.ts b/src/services/loginService.ts index 1753c85b..8733007c 100644 --- a/src/services/loginService.ts +++ b/src/services/loginService.ts @@ -3,7 +3,9 @@ import { createInventory } from "@/src/services/inventoryService"; import { IDatabaseAccount } from "@/src/types/loginTypes"; import { createShip } from "./shipService"; import { Types } from "mongoose"; -import { LoadoutModel } from "@/src/models/inventoryModels/loadoutModel"; +import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; +import { PersonalRooms } from "@/src/models/shipModel"; +import new_personal_rooms from "@/static/fixed_responses/personalRooms.json"; const isCorrectPassword = (requestPassword: string, databasePassword: string): boolean => { return requestPassword === databasePassword; @@ -14,8 +16,9 @@ const createAccount = async (accountData: IDatabaseAccount) => { try { await account.save(); const loadoutId = await createLoadout(account._id); - await createInventory(account._id, loadoutId); - await createShip(account._id, loadoutId); + const shipId = await createShip(account._id); + await createInventory(account._id, { loadOutPresetId: loadoutId, ship: shipId }); + await createPersonalRooms(account._id, shipId); return account.toJSON(); } catch (error) { if (error instanceof Error) { @@ -28,7 +31,16 @@ const createAccount = async (accountData: IDatabaseAccount) => { export { isCorrectPassword, createAccount }; export const createLoadout = async (accountId: Types.ObjectId) => { - const loadout = new LoadoutModel({ loadoutOwnerId: accountId }); + const loadout = new Loadout({ loadoutOwnerId: accountId }); const savedLoadout = await loadout.save(); return savedLoadout._id; }; + +export const createPersonalRooms = async (accountId: Types.ObjectId, shipId: Types.ObjectId) => { + const personalRooms = new PersonalRooms({ + ...new_personal_rooms, + personalRoomsOwnerId: accountId, + activeShipId: shipId + }); + await personalRooms.save(); +}; diff --git a/src/services/personalRoomsService.ts b/src/services/personalRoomsService.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/services/saveLoadoutService.ts b/src/services/saveLoadoutService.ts index e8f7bc5d..0b71f22f 100644 --- a/src/services/saveLoadoutService.ts +++ b/src/services/saveLoadoutService.ts @@ -5,7 +5,7 @@ import { IOperatorConfigEntry, ISaveLoadoutRequestNoUpgradeVer } from "@/src/types/saveLoadoutTypes"; -import { LoadoutModel } from "@/src/models/inventoryModels/loadoutModel"; +import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; import { getInventory } from "@/src/services/inventoryService"; import { IOid } from "@/src/types/commonTypes"; import { Types } from "mongoose"; @@ -60,7 +60,7 @@ export const handleInventoryItemConfigChange = async ( } case "LoadOuts": { logger.debug("loadout received"); - const loadout = await LoadoutModel.findOne({ loadoutOwnerId: accountId }); + const loadout = await Loadout.findOne({ loadoutOwnerId: accountId }); if (!loadout) { throw new Error("loadout not found"); } diff --git a/src/services/shipService.ts b/src/services/shipService.ts index 5b35cce3..0331a375 100644 --- a/src/services/shipService.ts +++ b/src/services/shipService.ts @@ -1,15 +1,23 @@ import { Ship } from "@/src/models/shipModel"; -import new_ship from "@/static/fixed_responses/ship.json"; +import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; +import { logger } from "@/src/utils/logger"; import { Types } from "mongoose"; -const createShip = async (accountOwnerId: Types.ObjectId, loadoutId: Types.ObjectId) => { +export const createShip = async (accountOwnerId: Types.ObjectId) => { try { const ship = new Ship({ - ...new_ship, + ItemType: "/Lotus/Types/Items/Ships/DefaultShip", ShipOwnerId: accountOwnerId, - LoadOutInventory: { LoadOutPresets: loadoutId } + ShipInteriorColors: { + t0: 3828063, + t1: 2502747 + }, + ShipAttachments: { HOOD_ORNAMENT: "" }, + SkinFlavourItem: "/Lotus/Upgrades/Skins/Liset/LisetSkinFlavourItemDefault" }); - await ship.save(); + const newShip = await ship.save(); + console.log(newShip); + return newShip._id; } catch (error) { if (error instanceof Error) { throw new Error(`error creating ship" ${error.message}`); @@ -18,4 +26,26 @@ const createShip = async (accountOwnerId: Types.ObjectId, loadoutId: Types.Objec } }; -export { createShip }; +export const getShip = async (shipOwnerId: string, fieldSelection: string = "") => { + const ship = await Ship.findOne({ ShipOwnerId: shipOwnerId }, fieldSelection); + + if (!ship) { + logger.error(`error finding a ship for account ${shipOwnerId}`); + throw new Error(`error finding a ship for account ${shipOwnerId}`); + } + + return ship; +}; + +export const getShipLean = async (shipOwnerId: string) => { + const ship = await Ship.findOne({ ShipOwnerId: shipOwnerId }).lean().populate<{ + LoadOutInventory: { LoadOutPresets: ILoadoutDatabase }; + }>("LoadOutInventory.LoadOutPresets"); + + if (!ship) { + logger.error(`error finding a ship for account ${shipOwnerId}`); + throw new Error(`error finding a ship for account ${shipOwnerId}`); + } + + return ship; +}; diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index b7b5f1fa..e17eac6a 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -11,13 +11,21 @@ import { } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; import { IOperatorLoadOutSigcol, IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; +import { Colour } from "warframe-items"; //Document extends will be deleted soon. TODO: delete and migrate uses to ... export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {} export interface IInventoryDatabase extends Omit< IInventoryResponse, - "TrainingDate" | "LoadOutPresets" | "Mailbox" | "PendingRecipes" | "Created" | "QuestKeys" | "BlessingCooldown" + | "TrainingDate" + | "LoadOutPresets" + | "Mailbox" + | "PendingRecipes" + | "Created" + | "QuestKeys" + | "BlessingCooldown" + | "Ships" > { accountOwnerId: Types.ObjectId; Created: Date; @@ -27,6 +35,7 @@ export interface IInventoryDatabase PendingRecipes: IPendingRecipe[]; QuestKeys: IQuestKeyDatabase[]; BlessingCooldown: Date; + Ships: Types.ObjectId[]; } export interface IInventoryResponseDocument extends IInventoryResponse, Document {} @@ -140,7 +149,7 @@ export interface IInventoryResponse { LongGuns: IWeaponDatabase[]; Pistols: IWeaponDatabase[]; Melee: IWeaponDatabase[]; - Ships: IShip[]; + Ships: IShipInventory[]; QuestKeys: IQuestKeyResponse[]; FlavourItems: IFlavourItem[]; Scoops: IGenericItem[]; @@ -450,7 +459,7 @@ export interface ICustomization { export interface IShipExterior { SkinFlavourItem: string; - Colors: IShipExteriorColors; + Colors: IColor; ShipAttachments?: IShipAttachments; } @@ -1016,7 +1025,7 @@ export interface ISettings { TradingRulesConfirmed: boolean; } -export interface IShip { +export interface IShipInventory { ItemType: string; ShipExterior: IShipExterior; AirSupportPower: string; diff --git a/src/types/shipTypes.ts b/src/types/shipTypes.ts index 522837e5..b71bf485 100644 --- a/src/types/shipTypes.ts +++ b/src/types/shipTypes.ts @@ -1,30 +1,74 @@ -import { Types } from "mongoose"; +import { Schema, Types } from "mongoose"; import { IOid } from "@/src/types/commonTypes"; +import { IColor } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { IShipInventory } from "@/src/types/inventoryTypes/inventoryTypes"; +import { colorSchema } from "@/src/models/inventoryModels/inventoryModel"; +import { ILoadoutClient } from "@/src/types/saveLoadoutTypes"; -export interface IShip { - ShipOwnerId: Types.ObjectId; - Ship: IShipResponse; +export interface IGetShipResponse { + ShipOwnerId: string; + Ship: IShip; Apartment: IApartment; LoadOutInventory: { LoadOutPresets: Types.ObjectId }; } -export interface IShipResponse extends IShipDatabase { - ShipId: IOid; +export interface IShipAttachments { + HOOD_ORNAMENT: string; } -export interface IShipDatabase { - Rooms: IRooms[]; +export interface IShipInterior { + Colors: IColor; + ShipAttachments: IShipAttachments; + SkinFlavourItem: string; +} + +export interface IShip { Features: string[]; + ShipId: IOid; + ShipInterior: IShipInterior; + Rooms: IRooms[]; ContentUrlSignature: string; } -// TODO: add Apartment.Gardening +export interface IShipDatabase { + ItemType: string; + ShipOwnerId: Schema.Types.ObjectId; + ShipInteriorColors: IColor; + ShipExteriorColors: IColor; + AirSupportPower: string; + ShipAttachments: IShipAttachments; + SkinFlavourItem: string; +} + export interface IRooms { Name: string; MaxCapacity: number; + PlacedDecos?: IPlacedDecosDatabase[]; +} + +export interface IPlants { + PlantType: string; + EndTime: IOid; + PlotIndex: number; +} +export interface IPlanters { + Name: string; + Plants: IPlants[]; } export interface IApartment { + Gardening: { Planters: IPlanters[] }; Rooms: IRooms[]; FavouriteLoadouts: string[]; } + +export interface IPlacedDecosDatabase { + Type: string; + Pos: [number, number, number]; + Rot: [number, number, number]; + _id: Types.ObjectId; +} + +export interface IPlacedDecosClient extends Omit { + id: IOid; +} diff --git a/static/fixed_responses/allShipFeatures.json b/static/fixed_responses/allShipFeatures.json new file mode 100644 index 00000000..fdbff99f --- /dev/null +++ b/static/fixed_responses/allShipFeatures.json @@ -0,0 +1,69 @@ +[ + "/Lotus/Types/Items/ShipFeatureItems/AdvancedOrdisFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AlchemyRoomFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AlertsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/CeresNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ClanFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ErisNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EuropaNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryConcurrentBuildFormaFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/JupiterNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarketTierOneFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarketTierTwoFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarsNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFusionFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsTransmuteFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/NeptuneNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PhobosNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PlutoNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodBraceFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHullFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleLeftFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleRightFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackTailFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/RailjackCephalonShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SaturnNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SednaNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SolarChartFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/UranusNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/VenusNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/VoidProjectionFeatureItem" +] diff --git a/static/fixed_responses/personalRooms.json b/static/fixed_responses/personalRooms.json new file mode 100644 index 00000000..8142eb97 --- /dev/null +++ b/static/fixed_responses/personalRooms.json @@ -0,0 +1,32 @@ +{ + "Ship": { + "Features": [ + "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem" + ], + "Rooms": [ + { "Name": "AlchemyRoom", "MaxCapacity": 1600 }, + { "Name": "BridgeRoom", "MaxCapacity": 1600 }, + { "Name": "LisetRoom", "MaxCapacity": 1000 }, + { "Name": "OperatorChamberRoom", "MaxCapacity": 1600 }, + { "Name": "OutsideRoom", "MaxCapacity": 1600 }, + { "Name": "PersonalQuartersRoom", "MaxCapacity": 1600 } + ], + "ContentUrlSignature": "removed" + }, + "Apartment": { + "Rooms": [ + { "Name": "ElevatorLanding", "MaxCapacity": 1600 }, + { "Name": "ApartmentRoomA", "MaxCapacity": 1000 }, + { "Name": "ApartmentRoomB", "MaxCapacity": 1600 }, + { "Name": "ApartmentRoomC", "MaxCapacity": 1600 }, + { "Name": "DuviriHallway", "MaxCapacity": 1600 } + ], + "FavouriteLoadouts": [], + "Gardening": [] + } +} diff --git a/static/fixed_responses/ship.json b/static/fixed_responses/ship.json index 8ed911c1..2534f236 100644 --- a/static/fixed_responses/ship.json +++ b/static/fixed_responses/ship.json @@ -1,32 +1,17 @@ { - "Ship": { - "Features": [ - "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", - "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem" - ], - "ShipId": { "$oid": "removed" }, - "Rooms": [ - { "Name": "AlchemyRoom", "MaxCapacity": 1600 }, - { "Name": "BridgeRoom", "MaxCapacity": 1600 }, - { "Name": "LisetRoom", "MaxCapacity": 1000 }, - { "Name": "OperatorChamberRoom", "MaxCapacity": 1600 }, - { "Name": "OutsideRoom", "MaxCapacity": 1600 }, - { "Name": "PersonalQuartersRoom", "MaxCapacity": 1600 } - ], - "ContentUrlSignature": "removed" + "ItemType": "/Lotus/Types/Items/Ships/DefaultShip", + "AirSupportPower": "/Lotus/Types/Restoratives/LisetAutoHack", + "ShipExterior": { + "Colors": { + "t0": 3828063, + "t1": 13529661, + "t2": 10767646, + "t3": 7216189, + "m0": 9773092, + "en": 9773092 + }, + "ShipAttachments": { "HOOD_ORNAMENT": "" }, + "SkinFlavourItem": "/Lotus/Upgrades/Skins/Liset/LisetSkinFlavourItemDefault" }, - "Apartment": { - "Rooms": [ - { "Name": "ElevatorLanding", "MaxCapacity": 1600 }, - { "Name": "ApartmentRoomA", "MaxCapacity": 1000 }, - { "Name": "ApartmentRoomB", "MaxCapacity": 1600 }, - { "Name": "ApartmentRoomC", "MaxCapacity": 1600 }, - { "Name": "DuviriHallway", "MaxCapacity": 1600 } - ], - "FavouriteLoadouts": [] - } + "ItemId": { "$oid": "6450f9bfe0714a4d6703f05e" } }