import { Document, Schema, Types, model } from "mongoose"; import { IEnemy, IMission, IScan, ITutorial, IAbility, IWeapon, IStatsDatabase, IRace } from "@/src/types/statTypes"; const abilitySchema = new Schema( { type: { type: String, required: true }, used: { type: Number, required: true } }, { _id: false } ); const enemySchema = new Schema( { type: { type: String, required: true }, executions: Number, headshots: Number, kills: Number, assists: Number, deaths: Number, captures: Number }, { _id: false } ); const missionSchema = new Schema( { type: { type: String, required: true }, highScore: Number }, { _id: false } ); const scanSchema = new Schema( { type: { type: String, required: true }, scans: { type: Number, required: true } }, { _id: false } ); const tutorialSchema = new Schema( { stage: Number }, { _id: false } ); const weaponSchema = new Schema( { type: { type: String, required: true }, equipTime: Number, hits: Number, kills: Number, xp: Number, assists: Number, headshots: Number, fired: Number }, { _id: false } ); const raceSchema = new Schema( { highScore: Number }, { _id: false } ); const statsSchema = new Schema({ accountOwnerId: { type: Schema.Types.ObjectId, required: true }, CiphersSolved: Number, CiphersFailed: Number, CipherTime: Number, Weapons: { type: [weaponSchema], default: [] }, Enemies: { type: [enemySchema], default: [] }, MeleeKills: Number, MissionsCompleted: Number, MissionsQuit: Number, MissionsFailed: Number, MissionsInterrupted: Number, MissionsDumped: Number, TimePlayedSec: Number, PickupCount: Number, Tutorial: { type: Map, of: tutorialSchema, default: {} }, Abilities: { type: [abilitySchema], default: [] }, Rating: Number, Income: Number, Rank: Number, PlayerLevel: Number, Scans: { type: [scanSchema], default: [] }, Missions: { type: [missionSchema], default: [] }, Deaths: Number, HealCount: Number, ReviveCount: Number, Races: { type: Map, of: raceSchema, default: {} } }); statsSchema.set("toJSON", { transform(_document, returnedObject) { delete returnedObject._id; delete returnedObject.__v; delete returnedObject.accountOwnerId; } }); export const Stats = model("Stats", statsSchema); // eslint-disable-next-line @typescript-eslint/ban-types export type TStatsDatabaseDocument = Document & { _id: Types.ObjectId; __v: number; } & IStatsDatabase;