UNPKG

@grouparoo/core

Version:
198 lines (197 loc) 8.06 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Team = void 0; const sequelize_typescript_1 = require("sequelize-typescript"); const actionhero_1 = require("actionhero"); const TeamMember_1 = require("./TeamMember"); const Permission_1 = require("./Permission"); const lockableHelper_1 = require("../modules/lockableHelper"); const apiData_1 = require("../modules/apiData"); const commonModel_1 = require("../classes/commonModel"); let Team = class Team extends commonModel_1.CommonModel { idPrefix() { return "tea"; } async apiData() { const membersCount = await this.$count("teamMembers"); const permissions = await this.$get("permissions", { order: [["topic", "asc"]], }); const permissionsApiData = await Promise.all(permissions.map((prm) => prm.apiData())); return { id: this.id, name: this.name, locked: this.locked, permissionAllRead: this.permissionAllRead, permissionAllWrite: this.permissionAllWrite, createdAt: apiData_1.APIData.formatDate(this.createdAt), updatedAt: apiData_1.APIData.formatDate(this.updatedAt), permissions: permissionsApiData, membersCount, }; } async authorizeAction(topic, mode) { return Permission_1.Permission.authorizeAction(topic, mode, this); } async setPermissions(userPermissions) { const permissions = await this.$get("permissions"); for (const userPermission of userPermissions) { const permission = permissions.find((p) => p.topic === userPermission.topic); if (!permission) { throw new Error(`Cannot find permission for topic ${userPermission.topic}`); } permission.read = this.permissionAllRead !== null ? this.permissionAllRead : userPermission.read; permission.write = this.permissionAllWrite !== null ? this.permissionAllWrite : userPermission.write; await lockableHelper_1.LockableHelper.beforeSave(permission); await permission.save(); } } // --- Class Methods --- // static async checkLockedPermissions(instance) { if (instance.locked && actionhero_1.api.codeConfig.allowLockedModelChanges === false && !instance.isNewRecord && (instance.permissionAllRead !== null || instance.permissionAllWrite !== null)) { throw new Error("locked teams cannot change permissions"); } } static async noUpdateIfLocked(instance) { await lockableHelper_1.LockableHelper.beforeSave(instance); } static async buildPermissions(instance) { const permissionsWithStatus = []; for (const i in Permission_1.PermissionTopics) { const topic = Permission_1.PermissionTopics[i]; let isNew = false; let permission = await Permission_1.Permission.findOne({ where: { topic, ownerId: instance.id, ownerType: "team", }, }); if (!permission) { isNew = true; permission = await Permission_1.Permission.create({ topic, ownerId: instance.id, ownerType: "team", }); } if (isNew) { // default new teams to having full 'read' access await permission.update({ read: true }); } if (instance.permissionAllRead !== null) { await permission.update({ read: instance.permissionAllRead }); } if (instance.permissionAllWrite !== null) { await permission.update({ write: instance.permissionAllWrite }); } if (instance.locked && !permission.locked) { await permission.update({ locked: instance.locked }); } permissionsWithStatus.push({ isNew, permission }); } return permissionsWithStatus; } static async noDestroyIfLocked(instance) { await lockableHelper_1.LockableHelper.beforeDestroy(instance); } static async ensureNoTeamMembers(instance) { const teamMembersCount = await instance.$count("teamMembers"); if (teamMembersCount > 0) { throw new Error("cannot delete a team that has members"); } } static async deletePermissions(instance) { return Permission_1.Permission.destroy({ where: { ownerId: instance.id }, }); } }; __decorate([ (0, sequelize_typescript_1.AllowNull)(false), (0, sequelize_typescript_1.Length)({ min: 3, max: 191 }), sequelize_typescript_1.Column, __metadata("design:type", String) ], Team.prototype, "name", void 0); __decorate([ sequelize_typescript_1.Column, __metadata("design:type", String) ], Team.prototype, "locked", void 0); __decorate([ sequelize_typescript_1.Column, __metadata("design:type", Boolean) ], Team.prototype, "permissionAllRead", void 0); __decorate([ sequelize_typescript_1.Column, __metadata("design:type", Boolean) ], Team.prototype, "permissionAllWrite", void 0); __decorate([ (0, sequelize_typescript_1.HasMany)(() => TeamMember_1.TeamMember), __metadata("design:type", Array) ], Team.prototype, "teamMembers", void 0); __decorate([ (0, sequelize_typescript_1.HasMany)(() => Permission_1.Permission, { foreignKey: "ownerId", scope: { ownerType: "team" }, }), __metadata("design:type", Array) ], Team.prototype, "permissions", void 0); __decorate([ sequelize_typescript_1.BeforeSave, __metadata("design:type", Function), __metadata("design:paramtypes", [Team]), __metadata("design:returntype", Promise) ], Team, "checkLockedPermissions", null); __decorate([ sequelize_typescript_1.BeforeSave, __metadata("design:type", Function), __metadata("design:paramtypes", [Team]), __metadata("design:returntype", Promise) ], Team, "noUpdateIfLocked", null); __decorate([ sequelize_typescript_1.AfterSave, __metadata("design:type", Function), __metadata("design:paramtypes", [Team]), __metadata("design:returntype", Promise) ], Team, "buildPermissions", null); __decorate([ sequelize_typescript_1.BeforeDestroy, __metadata("design:type", Function), __metadata("design:paramtypes", [Team]), __metadata("design:returntype", Promise) ], Team, "noDestroyIfLocked", null); __decorate([ sequelize_typescript_1.BeforeDestroy, __metadata("design:type", Function), __metadata("design:paramtypes", [Team]), __metadata("design:returntype", Promise) ], Team, "ensureNoTeamMembers", null); __decorate([ sequelize_typescript_1.AfterDestroy, __metadata("design:type", Function), __metadata("design:paramtypes", [Team]), __metadata("design:returntype", Promise) ], Team, "deletePermissions", null); Team = __decorate([ (0, sequelize_typescript_1.Table)({ tableName: "teams", paranoid: false }) ], Team); exports.Team = Team;