@grouparoo/core
Version:
The Grouparoo Core
191 lines (190 loc) • 7.57 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);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var Import_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Import = void 0;
const sequelize_typescript_1 = require("sequelize-typescript");
const moment_1 = __importDefault(require("moment"));
const sequelize_1 = require("sequelize");
const GrouparooRecord_1 = require("./GrouparooRecord");
const Run_1 = require("./Run");
const plugin_1 = require("../modules/plugin");
const apiData_1 = require("../modules/apiData");
const commonModel_1 = require("../classes/commonModel");
const stateMachine_1 = require("../modules/stateMachine");
const IMPORT_CREATORS = ["run", "group"];
const STATES = [
"associating",
"importing",
"processing",
"failed",
"complete",
];
const STATE_TRANSITIONS = [
{ from: "associating", to: "failed", checks: [] },
{ from: "associating", to: "importing", checks: [] },
{ from: "importing", to: "failed", checks: [] },
{ from: "importing", to: "complete", checks: [] },
{ from: "importing", to: "processing", checks: [] },
{ from: "processing", to: "failed", checks: [] },
{ from: "processing", to: "complete", checks: [] },
];
let Import = Import_1 = class Import extends commonModel_1.CommonModel {
idPrefix() {
return "imp";
}
get data() {
//@ts-ignore
return JSON.parse(this.getDataValue("data") || "{}");
}
set data(value) {
//@ts-ignore
this.setDataValue("data", JSON.stringify(value));
}
async apiData() {
const data = this.data || {};
delete data._meta;
const record = await this.$get("record");
return {
state: this.state,
// IDs
id: this.id,
creatorType: this.creatorType,
creatorId: this.creatorId,
recordId: this.recordId,
modelId: record === null || record === void 0 ? void 0 : record.modelId,
//data
data,
// lifecycle timestamps
createdAt: apiData_1.APIData.formatDate(this.createdAt),
startedAt: apiData_1.APIData.formatDate(this.startedAt),
recordAssociatedAt: apiData_1.APIData.formatDate(this.recordAssociatedAt),
importedAt: apiData_1.APIData.formatDate(this.importedAt),
processedAt: apiData_1.APIData.formatDate(this.processedAt),
createdRecord: this.createdRecord,
// errors
errorMessage: this.errorMessage,
errorMetadata: this.errorMetadata,
};
}
async setError(error, step) {
this.state = "failed";
this.errorMessage = `Error on step ${step}: ${error.message}`;
this.errorMetadata = JSON.stringify({
step,
message: error.message,
stack: error.stack,
});
await this.save();
if (this.creatorType === "run") {
const run = await Run_1.Run.findOne({ where: { id: this.creatorId } });
if (run && run.state === "complete")
await run.buildErrorMessage();
}
}
static async updateState(instance) {
await stateMachine_1.StateMachine.transition(instance, STATE_TRANSITIONS);
}
static async sweep(limit) {
const days = parseInt((await plugin_1.plugin.readSetting("core", "sweeper-delete-old-imports-days"))
.value);
const count = await Import_1.destroy({
where: {
createdAt: {
[sequelize_1.Op.lt]: (0, moment_1.default)().subtract(days, "days").toDate(),
},
},
force: true,
limit,
});
return { count, days };
}
};
// --- Class Methods --- //
Import.defaultState = "associating";
__decorate([
(0, sequelize_typescript_1.AllowNull)(false),
(0, sequelize_typescript_1.Default)("associating"),
(0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.ENUM(...STATES)),
__metadata("design:type", Object)
], Import.prototype, "state", void 0);
__decorate([
(0, sequelize_typescript_1.AllowNull)(false),
(0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.ENUM(...IMPORT_CREATORS)),
__metadata("design:type", Object)
], Import.prototype, "creatorType", void 0);
__decorate([
(0, sequelize_typescript_1.AllowNull)(false),
(0, sequelize_typescript_1.ForeignKey)(() => Run_1.Run),
sequelize_typescript_1.Column,
__metadata("design:type", String)
], Import.prototype, "creatorId", void 0);
__decorate([
(0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.TEXT),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], Import.prototype, "data", null);
__decorate([
(0, sequelize_typescript_1.ForeignKey)(() => GrouparooRecord_1.GrouparooRecord),
sequelize_typescript_1.Column,
__metadata("design:type", String)
], Import.prototype, "recordId", void 0);
__decorate([
(0, sequelize_typescript_1.BelongsTo)(() => GrouparooRecord_1.GrouparooRecord),
__metadata("design:type", GrouparooRecord_1.GrouparooRecord)
], Import.prototype, "record", void 0);
__decorate([
(0, sequelize_typescript_1.AllowNull)(false),
(0, sequelize_typescript_1.Default)(false),
sequelize_typescript_1.Column,
__metadata("design:type", Boolean)
], Import.prototype, "createdRecord", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", Date)
], Import.prototype, "startedAt", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", Date)
], Import.prototype, "recordAssociatedAt", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", Date)
], Import.prototype, "importedAt", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", Date)
], Import.prototype, "processedAt", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", String)
], Import.prototype, "errorMessage", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", String)
], Import.prototype, "errorMetadata", void 0);
__decorate([
(0, sequelize_typescript_1.BelongsTo)(() => Run_1.Run),
__metadata("design:type", Run_1.Run)
], Import.prototype, "run", void 0);
__decorate([
sequelize_typescript_1.BeforeSave,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Import]),
__metadata("design:returntype", Promise)
], Import, "updateState", null);
Import = Import_1 = __decorate([
(0, sequelize_typescript_1.Table)({ tableName: "imports", paranoid: false })
], Import);
exports.Import = Import;