78 lines
2.6 KiB
TypeScript
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); |