diff --git a/src/models/player.ts b/src/models/player.ts index f7c69bc..5dc87bd 100755 --- a/src/models/player.ts +++ b/src/models/player.ts @@ -6,7 +6,7 @@ import { } from "./stats"; import { getMongoObjectCollection, - MongoStoredObject, MongoStoredObjectCollection, + MongoStoredObject, MongoStoredObjectCollection, StoredObject, StoredObjectCollection, } from "./utils"; import {CellValue} from "../controllers/statsController"; import mongo from "mongodb"; @@ -23,12 +23,12 @@ export interface StoredPlayerData { stats: PlayerStats; } -interface StoredPlayerCollection { - findPlayerById(id: string): Promise; +interface StoredPlayerCollection extends StoredObjectCollection { + findById(id: string): Promise; } class MongoStoredPlayerCollection - extends MongoStoredObjectCollection + extends MongoStoredObjectCollection implements StoredPlayerCollection { private updater: PlayerStatsUpdater; @@ -37,19 +37,19 @@ class MongoStoredPlayerCollection this.updater = new PlayerStatsUpdater(); } - async findPlayerById(id: string): Promise { + async findById(id: string): Promise { const data = await this.findObjectById(id); return new MongoStoredPlayer(data); } } -export interface StoredPlayer { +export interface StoredPlayer extends StoredObject { nick(): string; setNick(newNick: string): Promise; updateStats(results: PlayerGameResults & {outcome: OutcomeType}, ruleset: Ruleset): Promise; } -class MongoStoredPlayer extends MongoStoredObject implements StoredPlayer { +class MongoStoredPlayer extends MongoStoredObject implements StoredPlayer { constructor(data: StoredPlayerData) { super(data); } diff --git a/src/models/utils.ts b/src/models/utils.ts index 0345bc0..3ce4363 100644 --- a/src/models/utils.ts +++ b/src/models/utils.ts @@ -18,7 +18,11 @@ export function getMongoObjectCollection(collectionName: string) { } } -export abstract class MongoStoredObjectCollection> { +export interface StoredObjectCollection { + findById(id: string): Promise; +} + +export abstract class MongoStoredObjectCollection, K extends StoredObject> implements StoredObjectCollection { protected mongoDbClientCollection: mongo.Collection; protected constructor(collectionClient: mongo.Collection) { this.mongoDbClientCollection = collectionClient; @@ -28,6 +32,8 @@ export abstract class MongoStoredObjectCollection; + async save(...objects: T[]): Promise { for (const object of objects) { await this.mongoDbClientCollection.findOneAndUpdate({_id: object.id()}, {...object.rawData()}); @@ -35,7 +41,12 @@ export abstract class MongoStoredObjectCollection { +export interface StoredObject { + id(): string; + rawData(): any; +} + +export abstract class MongoStoredObject implements StoredObject { protected constructor(protected data: {_id: string} & T) {} id(): string {