grungnet/src/database.ts

58 lines
1.7 KiB
TypeScript

// eslint-disable-next-line no-unused-vars
import Dexie, { DexieOptions } from "dexie";
import { v4 as uuid } from "uuid";
import { loadVersions, UpgradeEventHandler } from "./upgrade";
import { getDefaultMaps } from "./maps";
import { getDefaultTokens } from "./tokens";
import { getRandomMonster } from "./helpers/monsters";
/**
* Populate DB with initial data
* @param {Dexie} db
*/
function populate(db: Dexie) {
db.on("populate", () => {
const userId = uuid();
db.table("user").add({ key: "userId", value: userId });
const nickname = getRandomMonster();
db.table("user").add({ key: "nickname", value: nickname });
const { maps, mapStates } = getDefaultMaps(userId);
db.table("maps").bulkAdd(maps);
db.table("states").bulkAdd(mapStates);
const tokens = getDefaultTokens(userId);
db.table("tokens").bulkAdd(tokens);
db.table("groups").bulkAdd([
{ id: "maps", items: maps.map((map) => ({ id: map.id, type: "item" })) },
{
id: "tokens",
items: tokens.map((token) => ({ id: token.id, type: "item" })),
},
]);
});
}
/**
* Get a Dexie database with a name and versions applied
* @param {DexieOptions} options
* @param {string=} name
* @param {number=} versionNumber
* @param {boolean=} populateData
* @param {UpgradeEventHandler=} onUpgrade
* @returns {Dexie}
*/
export function getDatabase(
options: DexieOptions,
name: string | undefined = "OwlbearRodeoDB",
versionNumber: number | undefined = undefined,
populateData: boolean | undefined = true,
onUpgrade: UpgradeEventHandler | undefined = undefined
): Dexie {
let db = new Dexie(name, options);
loadVersions(db, versionNumber, onUpgrade);
if (populateData) {
populate(db);
}
return db;
}