wordRotator/src/client/js/model/LevelPlayed.ts
2020-10-17 16:42:59 +02:00

78 lines
2.6 KiB
TypeScript

import {BaseModel} from "cordova-sites-database/dist/BaseModel";
import {BaseDatabase} from "cordova-sites-database/dist/cordova-sites-database";
import {LevelData} from "../../../shared/model/LevelData";
import {Helper} from "js-helper/dist/shared/Helper";
export class LevelPlayed extends BaseModel {
levelData: LevelData;
played: boolean;
static getColumnDefinitions() {
let columns = super.getColumnDefinitions();
columns["played"] = {type: BaseDatabase.TYPES.BOOLEAN, default: true};
return columns;
}
static getRelationDefinitions() {
let relations = super.getRelationDefinitions();
relations["levelData"] = {
target: LevelData.getSchemaName(),
type: "one-to-one",
joinColumn: true,
cascade: true,
};
return relations;
}
static async setPlayed(levelData, played?){
played = Helper.nonNull(played, true);
let levelPlayed = new LevelPlayed();
levelPlayed.levelData = levelData;
levelPlayed.played = played;
return await levelPlayed.save();
}
static async getNextLevelData(renderer){
let qb = await this._database.createQueryBuilder(LevelData);
qb = qb.select("COUNT(*) as count, difficulty")
.leftJoin(LevelPlayed, "levelPlayed", "levelPlayed.levelData = LevelData.id")
.where("(deleted = 0 OR deleted = 'false')")
.andWhere("renderer IN ("+renderer.join(",")+")")
.andWhere("(levelPlayed.id IS NULL OR levelPlayed.played = 0)")
.groupBy("difficulty")
.orderBy("difficulty, LevelData.id");
let countRes = await qb.getRawMany();
let difficulty = null;
let offset = null;
if (!countRes.some(res => {
if (res["count"] > 0){
difficulty = res["difficulty"];
offset = Math.floor(Math.random() * Math.floor(res["count"]));
return true;
}
return false;
})){
return null;
}
qb = await this._database.createQueryBuilder(LevelData);
qb = qb
.leftJoin(LevelPlayed, "levelPlayed", "levelPlayed.levelData = LevelData.id")
.where("(deleted = 0 OR deleted = 'false')")
.andWhere("difficulty = "+difficulty)
.andWhere("renderer IN ("+renderer.join(",")+")")
.andWhere("(levelPlayed.id IS NULL OR levelPlayed.played = 0)")
.orderBy("LevelData.id")
.limit(1)
.offset(offset);
return await qb.getOne();
}
}
BaseDatabase.addModel(LevelPlayed);