From 99184b9568eba49325bac76ced2b0f0ce32855d2 Mon Sep 17 00:00:00 2001 From: b1ek Date: Sun, 5 Mar 2023 19:01:03 +1000 Subject: [PATCH] add some methods to permission class --- models/permission.js | 79 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/models/permission.js b/models/permission.js index e8ff8d6..e69146e 100644 --- a/models/permission.js +++ b/models/permission.js @@ -1,17 +1,82 @@ const { Model, DataTypes } = require('sequelize'); const { sequelize } = require('.'); -class Permission extends Model { +/** @type {{data: Permission[], updated: number, expired: function}} */ +let cached = { + data: undefined, + updated: 0, + expired: () => { + return (Date.now() - updated) >= 1000 + } +} +class Permission extends Model { + static async cache() { + if (!cached.expired()) return; + + cached.data = await Permission.findAll(); + cached.updated = Date.now(); + } + + /** + * Get value from cache + * @param {number} user + * @param {string} permission + * @returns {Permission?} + */ + static async findFromCache(user, permission) { + await this.cache(); + for (const perm of cached.data) { + if (perm.user == userid && perm.permission == permission) + return perm; + } + return null; + } + + /** + * Get a permission for user + * @param {number} user + * @param {string} permission + * @returns {boolean} + */ + static async forUser(user, permission) { + await this.cache(); + const data = await this.findFromCache(user, permission); + if (!data) return false; + return data.value != 0; + } + + /** + * Set a permission for user + * @param {number} user + * @param {string} permission + * @param {number} value + * @returns {Permission} + */ + static async set(user, permission, value) { + const existing = await Permission.findOne({where: {user, permission}}); + + let perm; + + if (!existing) perm = await Permission.create({user, permission, value}); + else perm = await Permission.update({user, permission, value}, {where: {user, permission}}); + await this.cache(); + + return perm; + } + + static async userAllowed(user, permission) { + return this.forUser(user, permission); + } } Permission.structure = { - // id: { - // type: DataTypes.BIGINT, - // primaryKey: true, - // autoIncrement: true, - // allowNull: false - // }, + id: { + type: DataTypes.BIGINT, + primaryKey: true, + autoIncrement: true, + allowNull: false + }, user: { type: DataTypes.BIGINT, allowNull: false