@grouparoo/core
Version:
The Grouparoo Core
262 lines (261 loc) • 11.3 kB
JavaScript
;
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;