Untested implementation of the UserFlag database
This commit is contained in:
parent
07b6288408
commit
20cc26cc4e
1 changed files with 106 additions and 19 deletions
|
|
@ -1,32 +1,119 @@
|
||||||
/* eslint-disable no-unused-vars */
|
import { filterPrivateRows, PrivacyMode } from "../privacy.mjs";
|
||||||
const tablesFlag = `tables`;
|
import { Database } from "./Database.mjs";
|
||||||
|
import { Logger } from "../Logger.mjs";
|
||||||
|
|
||||||
export class UserFlagDatabase {
|
const { mergeObject, randomID } = foundry.utils;
|
||||||
static getTables() {
|
|
||||||
/** @type {Array<{ name: string; }>} */
|
const dataFlag = `rows`;
|
||||||
const tableConfig = game.settings.get(__ID__, `tables`);
|
|
||||||
return tableConfig ?? [];
|
export class UserFlagDatabase extends Database {
|
||||||
|
// MARK: Row Ops
|
||||||
|
static async createRow(tableID, userID, row, { rerender = true } = {}) {
|
||||||
|
const table = await this.getTable(tableID);
|
||||||
|
let user = game.users.get(userID);
|
||||||
|
if (!table || !user) { return };
|
||||||
|
|
||||||
|
row._id ||= randomID();
|
||||||
|
row.timestamp = new Date().toISOString();
|
||||||
|
|
||||||
|
const userData = user.getFlag(__ID__, dataFlag);
|
||||||
|
userData[tableID] ??= [];
|
||||||
|
userData[tableID].push(row);
|
||||||
|
await user.setFlag(__ID__, userData);
|
||||||
|
|
||||||
|
if (rerender) {
|
||||||
|
this.render({ userUpdated: userID });
|
||||||
|
};
|
||||||
|
this.triggerListeners();
|
||||||
};
|
};
|
||||||
|
|
||||||
static createRow(table, user, row) {};
|
static async createRows(tableID, userID, rows, { rerender = true } = {}) {
|
||||||
|
const table = await this.getTable(tableID);
|
||||||
|
let user = game.users.get(userID);
|
||||||
|
if (!table || !user) { return };
|
||||||
|
|
||||||
static getRows(tableId, ...users) {
|
const userData = user.getFlag(__ID__, dataFlag);
|
||||||
if (users.length === 0) { users = [game.user] };
|
userData[tableID] ??= [];
|
||||||
|
|
||||||
|
for (const row of rows) {
|
||||||
|
row._id ||= randomID();
|
||||||
|
row.timestamp = new Date().toISOString();
|
||||||
|
userData[tableID].push(row);
|
||||||
|
};
|
||||||
|
|
||||||
|
await user.setFlag(__ID__, userData);
|
||||||
|
|
||||||
|
if (rerender) {
|
||||||
|
this.render({ userUpdated: userID });
|
||||||
|
};
|
||||||
|
this.triggerListeners();
|
||||||
|
};
|
||||||
|
|
||||||
|
static async getRows(tableID, userIDs, privacy = [PrivacyMode.PUBLIC]) {
|
||||||
|
const table = await this.getTable(tableID);
|
||||||
|
if (!table) { return };
|
||||||
|
if (!userIDs || userIDs.length === 0) { userIDs = [game.user.id] };
|
||||||
|
|
||||||
const datasets = {};
|
const datasets = {};
|
||||||
for (const user of users) {
|
for (const userID of userIDs) {
|
||||||
const tables = user.getFlag(__ID__, tablesFlag) ?? {};
|
const user = game.users.get(userID);
|
||||||
if (tables[tableId] === undefined) {
|
if (!user) {
|
||||||
datasets[user.id] = null;
|
Logger.warn(`Failed to find user with ID "${userID}", skipping.`);
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
const userData = user.getFlag(__ID__, dataFlag);
|
||||||
|
datasets[userID] = filterPrivateRows(
|
||||||
|
userData[tableID] ?? [],
|
||||||
|
userID,
|
||||||
|
privacy,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return datasets;
|
return datasets;
|
||||||
};
|
};
|
||||||
|
|
||||||
static updateRow(table, user, rowId, changes) {};
|
static async updateRow(tableID, userID, rowID, changes) {
|
||||||
|
const table = await this.getTable(tableID);
|
||||||
static deleteRow(table, user, rowId) {};
|
if (!table) {
|
||||||
|
Logger.error(`Cannot find the table with ID "${tableID}"`);
|
||||||
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* eslint-enable no-unused-vars */
|
const user = game.users.get(userID);
|
||||||
|
if (!user) {
|
||||||
|
Logger.error(`Can't find the user with ID "${tableID}"`);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
const userData = user.getFlag(__ID__, dataFlag);
|
||||||
|
let row = userData[tableID]?.find(row => row._id === rowID);
|
||||||
|
if (!row) { return };
|
||||||
|
mergeObject(row, changes);
|
||||||
|
await user.setFlag(__ID__, dataFlag, userData);
|
||||||
|
this.render({ userUpdated: userID });
|
||||||
|
this.triggerListeners();
|
||||||
|
};
|
||||||
|
|
||||||
|
static async deleteRow(tableID, userID, rowID) {
|
||||||
|
const table = await this.getTable(tableID);
|
||||||
|
if (!table) {
|
||||||
|
Logger.error(`Cannot find the table with ID "${tableID}"`);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
const user = game.users.get(userID);
|
||||||
|
if (!user) {
|
||||||
|
Logger.error(`Can't find the user with ID "${tableID}"`);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
const userData = user.getFlag(__ID__, dataFlag);
|
||||||
|
let rowIndex = userData[tableID].findIndex(row => row._id === rowID);
|
||||||
|
if (rowIndex === -1) { return };
|
||||||
|
userData[tableID].splice(rowIndex, 1);
|
||||||
|
await user.setFlag(__ID__, dataFlag, userData);
|
||||||
|
this.render({ userUpdated: userID });
|
||||||
|
this.triggerListeners();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue