diff --git a/src/controllers/api/giveQuestKey.ts b/src/controllers/api/giveQuestKey.ts index 070dea75..8cd4b135 100644 --- a/src/controllers/api/giveQuestKey.ts +++ b/src/controllers/api/giveQuestKey.ts @@ -38,7 +38,7 @@ export interface IQuestKeyReward { Duration: number; CouponSku: number; Syndicate: string; - Milestones: any[]; + //Milestones: any[]; ChooseSetIndex: number; NewSystemReward: boolean; _id: IOid; diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts index acb7d2cd..13638df3 100644 --- a/src/controllers/api/inventoryController.ts +++ b/src/controllers/api/inventoryController.ts @@ -258,6 +258,7 @@ const resourceGetParent = (resourceName: string): string | undefined => { if (resourceName in ExportResources) { return ExportResources[resourceName].parentName; } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition return ExportVirtuals[resourceName]?.parentName; }; diff --git a/src/controllers/api/joinSessionController.ts b/src/controllers/api/joinSessionController.ts index 4212c90f..7dff9fc9 100644 --- a/src/controllers/api/joinSessionController.ts +++ b/src/controllers/api/joinSessionController.ts @@ -2,12 +2,13 @@ import { RequestHandler } from "express"; import { getSessionByID } from "@/src/managers/sessionManager"; import { logger } from "@/src/utils/logger"; -const joinSessionController: RequestHandler = (_req, res) => { - const reqBody = JSON.parse(String(_req.body)); +export const joinSessionController: RequestHandler = (req, res) => { + const reqBody = JSON.parse(String(req.body)) as IJoinSessionRequest; logger.debug(`JoinSession Request`, { reqBody }); - const req = JSON.parse(String(_req.body)); - const session = getSessionByID(req.sessionIds[0] as string); + const session = getSessionByID(reqBody.sessionIds[0]); res.json({ rewardSeed: session?.rewardSeed, sessionId: { $oid: session?.sessionId } }); }; -export { joinSessionController }; +interface IJoinSessionRequest { + sessionIds: string[]; +} diff --git a/src/managers/sessionManager.ts b/src/managers/sessionManager.ts index 98bcc912..d933407a 100644 --- a/src/managers/sessionManager.ts +++ b/src/managers/sessionManager.ts @@ -44,7 +44,7 @@ function getSessionByID(sessionId: string): ISession | undefined { return sessions.find(session => session.sessionId === sessionId); } -function getSession(sessionIdOrRequest: string | IFindSessionRequest): any[] { +function getSession(sessionIdOrRequest: string | IFindSessionRequest): { createdBy: string; id: string }[] { if (typeof sessionIdOrRequest === "string") { const session = sessions.find(session => session.sessionId === sessionIdOrRequest); if (session) { @@ -107,8 +107,7 @@ function updateSession(sessionId: string, sessionData: string): boolean { const session = sessions.find(session => session.sessionId === sessionId); if (!session) return false; try { - const updatedData = JSON.parse(sessionData); - Object.assign(session, updatedData); + Object.assign(session, JSON.parse(sessionData)); return true; } catch (error) { console.error("Invalid JSON string for session update."); diff --git a/src/models/inventoryModels/loadoutModel.ts b/src/models/inventoryModels/loadoutModel.ts index 8eba69c1..e43d33d1 100644 --- a/src/models/inventoryModels/loadoutModel.ts +++ b/src/models/inventoryModels/loadoutModel.ts @@ -1,7 +1,7 @@ import { IOid } from "@/src/types/commonTypes"; import { IEquipmentSelection } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { ILoadoutConfigDatabase, ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; -import { Model, Schema, Types, model } from "mongoose"; +import { Document, Model, Schema, Types, model } from "mongoose"; const oidSchema = new Schema( { @@ -97,3 +97,15 @@ type loadoutDocumentProps = { type loadoutModelType = Model; export const Loadout = model("Loadout", loadoutSchema); + +// eslint-disable-next-line @typescript-eslint/ban-types +export type TLoadoutDatabaseDocument = Document & + Omit< + ILoadoutDatabase & { + _id: Types.ObjectId; + } & { + __v: number; + }, + keyof loadoutDocumentProps + > & + loadoutDocumentProps; diff --git a/src/models/shipModel.ts b/src/models/shipModel.ts index 13e1ef53..784a6125 100644 --- a/src/models/shipModel.ts +++ b/src/models/shipModel.ts @@ -1,4 +1,4 @@ -import { Schema, model } from "mongoose"; +import { Document, Schema, Types, model } from "mongoose"; import { IShipDatabase } from "../types/shipTypes"; import { toOid } from "@/src/helpers/inventoryHelpers"; import { colorSchema } from "@/src/models/inventoryModels/inventoryModel"; @@ -47,3 +47,11 @@ shipSchema.set("toObject", { }); export const Ship = model("Ships", shipSchema); + +// eslint-disable-next-line @typescript-eslint/ban-types +export type TShipDatabaseDocument = Document & + IShipDatabase & { + _id: Types.ObjectId; + } & { + __v: number; + }; diff --git a/src/models/statsModel.ts b/src/models/statsModel.ts index e11ca652..c8f5659b 100644 --- a/src/models/statsModel.ts +++ b/src/models/statsModel.ts @@ -4,7 +4,7 @@ import { IEnemy, IMission, IScan, ITutorial, IAbility, IWeapon, IStatsDatabase, const abilitySchema = new Schema( { type: { type: String, required: true }, - used: Number + used: { type: Number, required: true } }, { _id: false } ); @@ -32,7 +32,7 @@ const missionSchema = new Schema( const scanSchema = new Schema( { type: { type: String, required: true }, - scans: Number + scans: { type: Number, required: true } }, { _id: false } ); diff --git a/src/services/loadoutService.ts b/src/services/loadoutService.ts index f9c385c5..265a8150 100644 --- a/src/services/loadoutService.ts +++ b/src/services/loadoutService.ts @@ -1,6 +1,6 @@ -import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; +import { Loadout, TLoadoutDatabaseDocument } from "@/src/models/inventoryModels/loadoutModel"; -export const getLoadout = async (accountId: string) => { +export const getLoadout = async (accountId: string): Promise => { const loadout = await Loadout.findOne({ loadoutOwnerId: accountId }); if (!loadout) { diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 71c2828e..fb4a936e 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -313,6 +313,12 @@ export const addMissionInventoryUpdates = async ( return inventoryChanges; }; +interface AddMissionRewardsReturnType { + MissionRewards: IMissionReward[]; + inventoryChanges?: IInventoryChanges; + credits?: IMissionCredits; +} + //TODO: return type of partial missioninventoryupdate response export const addMissionRewards = async ( inventory: TInventoryDatabaseDocument, @@ -324,7 +330,7 @@ export const addMissionRewards = async ( VoidTearParticipantsCurrWave: voidTearWave, StrippedItems: strippedItems }: IMissionInventoryUpdateRequest -) => { +): Promise => { if (!rewardInfo) { //TODO: if there is a case where you can have credits collected during a mission but no rewardInfo, add credits needs to be handled earlier logger.debug(`Mission ${missions!.Tag} did not have Reward Info `); @@ -435,6 +441,13 @@ export const addMissionRewards = async ( return { inventoryChanges, MissionRewards, credits }; }; +interface IMissionCredits { + MissionCredits: number[]; + CreditBonus: number[]; + TotalCredits: number[]; + DailyMissionBonus?: boolean; +} + //creditBonus is not entirely accurate. //TODO: consider ActiveBoosters export const addCredits = ( @@ -444,11 +457,11 @@ export const addCredits = ( missionCompletionCredits, rngRewardCredits }: { missionDropCredits: number; missionCompletionCredits: number; rngRewardCredits: number } -) => { +): IMissionCredits => { const hasDailyCreditBonus = true; const totalCredits = missionDropCredits + missionCompletionCredits + rngRewardCredits; - const finalCredits = { + const finalCredits: IMissionCredits = { MissionCredits: [missionDropCredits, missionDropCredits], CreditBonus: [missionCompletionCredits, missionCompletionCredits], TotalCredits: [totalCredits, totalCredits] @@ -471,7 +484,7 @@ export const addFixedLevelRewards = ( rewards: IMissionRewardExternal, inventory: TInventoryDatabaseDocument, MissionRewards: IMissionReward[] -) => { +): number => { let missionBonusCredits = 0; if (rewards.credits) { missionBonusCredits += rewards.credits; diff --git a/src/services/personalRoomsService.ts b/src/services/personalRoomsService.ts index 5325af1c..24399655 100644 --- a/src/services/personalRoomsService.ts +++ b/src/services/personalRoomsService.ts @@ -1,7 +1,8 @@ import { PersonalRooms } from "@/src/models/personalRoomsModel"; import { addItem, getInventory } from "@/src/services/inventoryService"; +import { TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes"; -export const getPersonalRooms = async (accountId: string) => { +export const getPersonalRooms = async (accountId: string): Promise => { const personalRooms = await PersonalRooms.findOne({ personalRoomsOwnerId: accountId }); if (!personalRooms) { @@ -10,7 +11,7 @@ export const getPersonalRooms = async (accountId: string) => { return personalRooms; }; -export const updateShipFeature = async (accountId: string, shipFeature: string) => { +export const updateShipFeature = async (accountId: string, shipFeature: string): Promise => { const personalRooms = await getPersonalRooms(accountId); if (personalRooms.Ship.Features.includes(shipFeature)) { diff --git a/src/services/purchaseService.ts b/src/services/purchaseService.ts index d960c629..b3d795a3 100644 --- a/src/services/purchaseService.ts +++ b/src/services/purchaseService.ts @@ -108,8 +108,11 @@ export const handlePurchase = async ( ]; } purchaseRequest.PurchaseParams.Quantity *= offer.QuantityMultiplier; - } else if (!ExportVendors[purchaseRequest.PurchaseParams.SourceId!]) { - throw new Error(`unknown vendor: ${purchaseRequest.PurchaseParams.SourceId!}`); + } else { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!ExportVendors[purchaseRequest.PurchaseParams.SourceId!]) { + throw new Error(`unknown vendor: ${purchaseRequest.PurchaseParams.SourceId!}`); + } } } @@ -120,8 +123,6 @@ export const handlePurchase = async ( ); combineInventoryChanges(purchaseResponse.InventoryChanges, inventoryChanges); - if (!purchaseResponse) throw new Error("purchase response was undefined"); - const currencyChanges = updateCurrency( inventory, purchaseRequest.PurchaseParams.ExpectedPrice, @@ -149,6 +150,7 @@ export const handlePurchase = async ( ]; } else { const syndicate = ExportSyndicates[syndicateTag]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (syndicate) { const favour = syndicate.favours.find( x => x.storeItem == purchaseRequest.PurchaseParams.StoreItem @@ -360,6 +362,7 @@ const handleBoosterPackPurchase = async ( quantity: number ): Promise => { const pack = ExportBoosterPacks[typeName]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!pack) { throw new Error(`unknown booster pack: ${typeName}`); } diff --git a/src/services/questService.ts b/src/services/questService.ts index 5e70f502..a9629339 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -93,7 +93,10 @@ export const updateQuestStage = ( Object.assign(questStage, questStageUpdate); }; -export const addQuestKey = (inventory: TInventoryDatabaseDocument, questKey: IQuestKeyDatabase) => { +export const addQuestKey = ( + inventory: TInventoryDatabaseDocument, + questKey: IQuestKeyDatabase +): IQuestKeyClient | undefined => { if (inventory.QuestKeys.some(q => q.ItemType === questKey.ItemType)) { logger.warn(`Quest key ${questKey.ItemType} already exists. It will not be added`); return; @@ -115,7 +118,7 @@ export const addQuestKey = (inventory: TInventoryDatabaseDocument, questKey: IQu return inventory.QuestKeys[index - 1].toJSON(); }; -export const completeQuest = async (inventory: TInventoryDatabaseDocument, questKey: string) => { +export const completeQuest = async (inventory: TInventoryDatabaseDocument, questKey: string): Promise => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition const chainStages = ExportKeys[questKey]?.chainStages; diff --git a/src/services/shipService.ts b/src/services/shipService.ts index 0925a409..cc97d52d 100644 --- a/src/services/shipService.ts +++ b/src/services/shipService.ts @@ -1,11 +1,10 @@ -import { Ship } from "@/src/models/shipModel"; -import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; +import { Ship, TShipDatabaseDocument } from "@/src/models/shipModel"; import { Types } from "mongoose"; export const createShip = async ( accountOwnerId: Types.ObjectId, typeName: string = "/Lotus/Types/Items/Ships/DefaultShip" -) => { +): Promise => { try { const ship = new Ship({ ItemType: typeName, @@ -21,7 +20,7 @@ export const createShip = async ( } }; -export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = "") => { +export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = ""): Promise => { const ship = await Ship.findOne({ _id: shipId }, fieldSelection); if (!ship) { @@ -30,15 +29,3 @@ export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = " return ship; }; - -export const getShipLean = async (shipOwnerId: string) => { - const ship = await Ship.findOne({ ShipOwnerId: shipOwnerId }).lean().populate<{ - LoadOutInventory: { LoadOutPresets: ILoadoutDatabase }; - }>("LoadOutInventory.LoadOutPresets"); - - if (!ship) { - throw new Error(`error finding a ship for account ${shipOwnerId}`); - } - - return ship; -}; diff --git a/src/services/statsService.ts b/src/services/statsService.ts index 49bcea3f..75a05627 100644 --- a/src/services/statsService.ts +++ b/src/services/statsService.ts @@ -82,7 +82,6 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload: for (const [type, scans] of Object.entries(data as IUploadEntry)) { const scan = playerStats.Scans.find(element => element.type === type); if (scan) { - scan.scans ??= 0; scan.scans += scans; } else { playerStats.Scans.push({ type: type, scans }); @@ -95,7 +94,6 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload: for (const [type, used] of Object.entries(data as IUploadEntry)) { const ability = playerStats.Abilities.find(element => element.type === type); if (ability) { - ability.used ??= 0; ability.used += used; } else { playerStats.Abilities.push({ type: type, used }); @@ -307,22 +305,20 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload: for (const [category, value] of Object.entries(actionData as IStatsSet)) { switch (category) { case "ELO_RATING": - playerStats.Rating = value; + playerStats.Rating = value as number; break; case "RANK": - playerStats.Rank = value; + playerStats.Rank = value as number; break; case "PLAYER_LEVEL": - playerStats.PlayerLevel = value; + playerStats.PlayerLevel = value as number; break; default: if (!ignoredCategories.includes(category)) { - if (!unknownCategories[action]) { - unknownCategories[action] = []; - } + unknownCategories[action] ??= []; unknownCategories[action].push(category); } break; diff --git a/src/types/personalRoomsTypes.ts b/src/types/personalRoomsTypes.ts index f91a5b88..cfb98ae7 100644 --- a/src/types/personalRoomsTypes.ts +++ b/src/types/personalRoomsTypes.ts @@ -7,7 +7,7 @@ import { ITailorShopDatabase, TBootLocation } from "@/src/types/shipTypes"; -import { Model, Types } from "mongoose"; +import { Document, Model, Types } from "mongoose"; export interface IOrbiter { Features: string[]; @@ -48,3 +48,15 @@ export type PersonalRoomsDocumentProps = { // eslint-disable-next-line @typescript-eslint/ban-types export type PersonalRoomsModelType = Model; + +// eslint-disable-next-line @typescript-eslint/ban-types +export type TPersonalRoomsDatabaseDocument = Document & + Omit< + IPersonalRoomsDatabase & { + _id: Types.ObjectId; + } & { + __v: number; + }, + keyof PersonalRoomsDocumentProps + > & + PersonalRoomsDocumentProps; diff --git a/src/types/session.ts b/src/types/session.ts index 2e534f70..d7f6e68a 100644 --- a/src/types/session.ts +++ b/src/types/session.ts @@ -1,29 +1,29 @@ export interface ISession { sessionId: string; creatorId: string; - maxPlayers: number; - minPlayers: number; - privateSlots: number; - scoreLimit: number; - timeLimit: number; - gameModeId: number; - eloRating: number; - regionId: number; - difficulty: number; - hasStarted: boolean; - enableVoice: boolean; - matchType: string; - maps: string[]; - originalSessionId: string; - customSettings: string; - rewardSeed: number; - guildId: string; - buildId: number; - platform: number; - xplatform: boolean; - freePublic: number; - freePrivate: number; - fullReset: number; + maxPlayers?: number; + minPlayers?: number; + privateSlots?: number; + scoreLimit?: number; + timeLimit?: number; + gameModeId?: number; + eloRating?: number; + regionId?: number; + difficulty?: number; + hasStarted?: boolean; + enableVoice?: boolean; + matchType?: string; + maps?: string[]; + originalSessionId?: string; + customSettings?: string; + rewardSeed?: number; + guildId?: string; + buildId?: number; + platform?: number; + xplatform?: boolean; + freePublic?: number; + freePrivate?: number; + fullReset?: number; } export interface IFindSessionRequest {