import Sequelize, {Op} from "sequelize"; import { validateFindOptions, validateMutation } from "@vostro/c2-utils/lib/auth"; import { C2Utils } from '@vostro/c2-utils/lib/types'; import { getDatabase, createOptions, } from "@vostro/c2-utils/lib/database"; export default { name: "Permission", comment: "This is a permission table", comments: { fields: { name: "This is the permission name that will be displayed.", type: "This is the selection of permission type.", rolesPermission: "permission hasMany role permission", permissionId: "target for role permission", }, }, define: { name: { type: Sequelize.STRING, allowNull: false, comment: "This is the permission name that will be displayed.", }, type: { type: Sequelize.ENUM, values: ["model", "query", "mutation", "subscription", "other"], allowNull: false, comment: "This is the selection of permission type.", }, }, override: {}, relationships: [{ type: "hasMany", model: "RolePermission", name: "roles", options: { as: "roles", sourceKey: "id", foreignKey: "permissionId", }, }], options: { tableName: "permissions", indexes: [{ unique: true, fields: ["name", "type"], }, { fields: ["name"], }], hooks: { beforeFind: [async function beforeFind(options: C2Utils.FindOptions) { return validateFindOptions("Permission", options, "id", async(user, roleLevel) => { const db = await getDatabase(); const {RolePermission} = db.models; const role = await user.getRole({override: true}); const permissionIds = await RolePermission.findAll({ where: { roleId: role.id, }, override: true, }); return { [Op.in]: permissionIds.map((pid: any) => pid.permissionId), }; }, true); }], beforeCreate: [async function beforeCreate(instance: any, options: C2Utils.FindOptions) { return validateMutation("Permission", "create", options, instance, undefined, true); }], beforeUpdate: [async function beforeUpdate(instance: any, options: C2Utils.FindOptions) { return validateMutation("Permission", "update", options, instance, undefined, true); }], beforeDestroy: [async function beforeDestroy(instance: any, options: C2Utils.FindOptions) { return validateMutation("Permission", "destroy", options, instance, undefined, true); }], }, }, };