UNPKG

@grouparoo/core

Version:
262 lines (261 loc) 11.3 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.GrouparooRecord = void 0; const sequelize_typescript_1 = require("sequelize-typescript"); const GroupMember_1 = require("./GroupMember"); const Group_1 = require("./Group"); const RecordProperty_1 = require("./RecordProperty"); const Import_1 = require("./Import"); const Export_1 = require("./Export"); const stateMachine_1 = require("../modules/stateMachine"); const record_1 = require("../modules/ops/record"); const apiData_1 = require("../modules/apiData"); const GroupRule_1 = require("./GroupRule"); const GrouparooModel_1 = require("./GrouparooModel"); const modelGuard_1 = require("../modules/modelGuard"); const commonModel_1 = require("../classes/commonModel"); const STATES = ["draft", "pending", "ready", "deleted"]; const STATE_TRANSITIONS = [ { from: "draft", to: "pending", checks: [] }, { from: "draft", to: "ready", checks: [] }, { from: "pending", to: "ready", checks: [ async (instance) => await instance.validateRecordPropertiesAreReady(), ], }, { from: "ready", to: "pending", checks: [] }, { from: "draft", to: "deleted", checks: [] }, { from: "pending", to: "deleted", checks: [] }, { from: "ready", to: "deleted", checks: [] }, ]; let GrouparooRecord = class GrouparooRecord extends commonModel_1.CommonModel { idPrefix() { return "rec"; } async apiData() { const model = await this.$get("model"); const properties = await this.getProperties(); const groups = await this.$get("groups"); return { id: this.id, state: this.state, modelId: this.modelId, modelName: model.name, groupIds: groups.map((g) => g.id), invalid: this.invalid, properties, createdAt: apiData_1.APIData.formatDate(this.createdAt), updatedAt: apiData_1.APIData.formatDate(this.updatedAt), }; } async getProperties() { return record_1.RecordOps.getProperties(this); } async simplifiedProperties() { const properties = await this.getProperties(); const simpleProperties = {}; for (const k in properties) simpleProperties[k] = properties[k].values; return simpleProperties; } async addOrUpdateProperties(properties, toLock = true, ignoreMissingProperties = false) { return record_1.RecordOps.addOrUpdateProperties([this], [properties], toLock, ignoreMissingProperties); } async removeProperty(key) { return record_1.RecordOps.removeProperty(this, key); } async removeProperties(properties) { return record_1.RecordOps.removeProperties(this, properties); } async buildNullProperties(state = "pending") { if (this.state !== "deleted") { return record_1.RecordOps.buildNullProperties([this], state); } } async markPending() { await record_1.RecordOps.markPendingByIds([this.id]); await this.reload(); } async sync(force = true, toExport = true) { return record_1.RecordOps.sync(this, force, toExport); } async snapshot(saveExports = false) { const exports = await this.sync(undefined, saveExports); const properties = await this.getProperties(); const groups = await this.$get("groups", { include: [GroupRule_1.GroupRule] }); const groupApiData = (await Promise.all(groups.map((g) => g.apiData()))).sort((a, b) => (a.name > b.name ? 1 : -1)); const exportsApiData = (await Promise.all(exports.map((e) => e.apiData(false)))).sort((a, b) => (a.destinationName > b.destinationName ? 1 : -1)); return { properties, groups: groupApiData, exports: exportsApiData }; } async updateGroupMembership() { const data = await record_1.RecordOps.updateGroupMemberships([this]); return data[this.id]; } async import(toSave = true, toLock = true) { return record_1.RecordOps._import(this, toSave, toLock); } async export(force = false, additionalGroups, saveExports = true, sync = true, toDelete) { return record_1.RecordOps._export(this, force, additionalGroups, saveExports, sync, toDelete); } async validateRecordPropertiesAreReady() { const properties = await this.getProperties(); for (const k in properties) { if (properties[k].state !== "ready") { throw new Error(`cannot transition record ${this.id} to ready state as not all properties are ready (${k})`); } } } async getConfigObject() { var _a; this.model = await this.$get("model"); const modelId = (_a = this.model) === null || _a === void 0 ? void 0 : _a.getConfigId(); const properties = await this.getProperties(); const primaryKeyProperties = {}; for (const k in properties) { const property = properties[k]; if (property.isPrimaryKey && property.values.length > 0) { primaryKeyProperties[property.configId] = property.values; } } if (!modelId) return; if (Object.keys(primaryKeyProperties).length === 0 || Object.values(primaryKeyProperties) .flat() .filter((v) => v !== undefined && v !== null).length === 0) { return; } return { id: this.id, class: "Record", modelId, properties: primaryKeyProperties, }; } // --- Class Methods --- // static async findOrCreateByUniqueRecordProperties(hash, source) { var _a, _b; const response = await record_1.RecordOps.findOrCreateByUniqueRecordProperties([hash], ["_"], source); if ((_a = response[0]) === null || _a === void 0 ? void 0 : _a.error) throw (_b = response[0]) === null || _b === void 0 ? void 0 : _b.error; return response[0]; } static async ensureModel(instance) { return modelGuard_1.ModelGuard.check(instance); } static async updateState(instance) { await stateMachine_1.StateMachine.transition(instance, STATE_TRANSITIONS); } static async buildNullPropertiesForNewRecord(instance) { await instance.buildNullProperties(); } static async destroyRecordProperties(instance) { await RecordProperty_1.RecordProperty.destroy({ where: { recordId: instance.id }, }); } static async destroyGroupMembers(instance) { await GroupMember_1.GroupMember.destroy({ where: { recordId: instance.id }, }); } static async destroyImports(instance) { await Import_1.Import.destroy({ where: { recordId: instance.id }, }); } }; __decorate([ (0, sequelize_typescript_1.AllowNull)(false), (0, sequelize_typescript_1.Default)("pending"), (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.ENUM(...STATES)), __metadata("design:type", Object) ], GrouparooRecord.prototype, "state", void 0); __decorate([ (0, sequelize_typescript_1.AllowNull)(false), (0, sequelize_typescript_1.Default)(false), (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.BOOLEAN), __metadata("design:type", Boolean) ], GrouparooRecord.prototype, "invalid", void 0); __decorate([ (0, sequelize_typescript_1.AllowNull)(false), (0, sequelize_typescript_1.ForeignKey)(() => GrouparooModel_1.GrouparooModel), sequelize_typescript_1.Column, __metadata("design:type", String) ], GrouparooRecord.prototype, "modelId", void 0); __decorate([ (0, sequelize_typescript_1.HasMany)(() => RecordProperty_1.RecordProperty), __metadata("design:type", Array) ], GrouparooRecord.prototype, "recordProperties", void 0); __decorate([ (0, sequelize_typescript_1.HasMany)(() => GroupMember_1.GroupMember), __metadata("design:type", Array) ], GrouparooRecord.prototype, "groupMembers", void 0); __decorate([ (0, sequelize_typescript_1.BelongsToMany)(() => Group_1.Group, () => GroupMember_1.GroupMember), __metadata("design:type", Array) ], GrouparooRecord.prototype, "groups", void 0); __decorate([ (0, sequelize_typescript_1.BelongsTo)(() => GrouparooModel_1.GrouparooModel), __metadata("design:type", GrouparooModel_1.GrouparooModel) ], GrouparooRecord.prototype, "model", void 0); __decorate([ (0, sequelize_typescript_1.HasMany)(() => Import_1.Import), __metadata("design:type", Array) ], GrouparooRecord.prototype, "imports", void 0); __decorate([ (0, sequelize_typescript_1.HasMany)(() => Export_1.Export), __metadata("design:type", Array) ], GrouparooRecord.prototype, "exports", void 0); __decorate([ sequelize_typescript_1.BeforeCreate, sequelize_typescript_1.BeforeSave, __metadata("design:type", Function), __metadata("design:paramtypes", [GrouparooRecord]), __metadata("design:returntype", Promise) ], GrouparooRecord, "ensureModel", null); __decorate([ sequelize_typescript_1.BeforeSave, __metadata("design:type", Function), __metadata("design:paramtypes", [GrouparooRecord]), __metadata("design:returntype", Promise) ], GrouparooRecord, "updateState", null); __decorate([ sequelize_typescript_1.AfterCreate, __metadata("design:type", Function), __metadata("design:paramtypes", [GrouparooRecord]), __metadata("design:returntype", Promise) ], GrouparooRecord, "buildNullPropertiesForNewRecord", null); __decorate([ sequelize_typescript_1.AfterDestroy, __metadata("design:type", Function), __metadata("design:paramtypes", [GrouparooRecord]), __metadata("design:returntype", Promise) ], GrouparooRecord, "destroyRecordProperties", null); __decorate([ sequelize_typescript_1.AfterDestroy, __metadata("design:type", Function), __metadata("design:paramtypes", [GrouparooRecord]), __metadata("design:returntype", Promise) ], GrouparooRecord, "destroyGroupMembers", null); __decorate([ sequelize_typescript_1.AfterDestroy, __metadata("design:type", Function), __metadata("design:paramtypes", [GrouparooRecord]), __metadata("design:returntype", Promise) ], GrouparooRecord, "destroyImports", null); GrouparooRecord = __decorate([ (0, sequelize_typescript_1.Table)({ tableName: "records", paranoid: false }) ], GrouparooRecord); exports.GrouparooRecord = GrouparooRecord;