UNPKG

@grouparoo/core

Version:
412 lines (411 loc) 17.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DestinationDestroy = exports.DestinationRecordPreview = exports.DestinationExport = exports.DestinationView = exports.DestinationExportArrayProperties = exports.DestinationMappingOptions = exports.DestinationConnectionOptions = exports.DestinationEdit = exports.DestinationCreate = exports.DestinationConnectionApps = exports.DestinationsList = void 0; const actionhero_1 = require("actionhero"); const authenticatedAction_1 = require("../classes/actions/authenticatedAction"); const Destination_1 = require("../models/Destination"); const App_1 = require("../models/App"); const GrouparooRecord_1 = require("../models/GrouparooRecord"); const Group_1 = require("../models/Group"); const GroupMember_1 = require("../models/GroupMember"); const optionHelper_1 = require("../modules/optionHelper"); const destinationTypeConversions_1 = require("../modules/destinationTypeConversions"); const configWriter_1 = require("../modules/configWriter"); const apiData_1 = require("../modules/apiData"); const destination_1 = require("../modules/ops/destination"); class DestinationsList extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destinations:list"; this.description = "list all the destinations"; this.outputExample = {}; this.permission = { topic: "destination", mode: "read" }; this.inputs = { limit: { required: true, default: 100, formatter: apiData_1.APIData.ensureNumber }, offset: { required: true, default: 0, formatter: apiData_1.APIData.ensureNumber }, state: { required: false }, modelId: { required: false }, order: { required: false, formatter: apiData_1.APIData.ensureArray, default: [ ["name", "desc"], ["createdAt", "desc"], ], }, }; } async runWithinTransaction({ params, }) { const where = {}; if (params.state) where["state"] = params.state; if (params.modelId) where["modelId"] = params.modelId; const total = await Destination_1.Destination.scope(null).count({ where }); const destinations = await Destination_1.Destination.scope(null).findAll({ where, limit: params.limit, offset: params.offset, order: params.order, }); return { total, destinations: await Promise.all(destinations.map((d) => d.apiData())), }; } } exports.DestinationsList = DestinationsList; class DestinationConnectionApps extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destinations:connectionApps"; this.description = "enumerate the connection and app pairs for creating a new destination"; this.outputExample = {}; this.permission = { topic: "destination", mode: "read" }; } async runWithinTransaction() { const connectionApps = []; const apps = await App_1.App.findAll(); const existingAppTypes = apps.map((a) => a.type); let importConnections = []; actionhero_1.api.plugins.plugins.forEach((plugin) => { if (plugin.connections) { plugin.connections .filter((c) => c.direction === "export") .filter((c) => { let match = false; for (const app of c.apps) { if (existingAppTypes.includes(app)) match = true; } return match; }) .map((c) => importConnections.push(c)); } }); for (const app of apps) { for (const connection of importConnections) { if (connection.apps.includes(app.type)) { connectionApps.push({ app: await app.apiData(), connection, }); } } } const environmentVariableOptions = optionHelper_1.OptionHelper.getEnvironmentVariableOptionsForTopic("destination"); return { connectionApps, environmentVariableOptions }; } } exports.DestinationConnectionApps = DestinationConnectionApps; class DestinationCreate extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:create"; this.description = "create a destination"; this.outputExample = {}; this.permission = { topic: "destination", mode: "write" }; this.inputs = { name: { required: false }, type: { required: true }, modelId: { required: true }, state: { required: false }, appId: { required: true }, options: { required: false, formatter: apiData_1.APIData.ensureObject }, mapping: { required: false, formatter: apiData_1.APIData.ensureObject, default: {}, }, syncMode: { required: false }, destinationGroupMemberships: { required: false, formatter: apiData_1.APIData.ensureObject, }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.create({ name: params.name, type: params.type, modelId: params.modelId, appId: params.appId, syncMode: params.syncMode, }); if (params.options) await destination.setOptions(params.options); if (params.mapping) { await destination.setMapping(params.mapping, undefined, false); } if (params.destinationGroupMemberships) await destination.setDestinationGroupMemberships(params.destinationGroupMemberships); if (params.state) await destination.update({ state: params.state }); await configWriter_1.ConfigWriter.run(); return { destination: await destination.apiData() }; } } exports.DestinationCreate = DestinationCreate; class DestinationEdit extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:edit"; this.description = "edit a destination"; this.outputExample = {}; this.permission = { topic: "destination", mode: "write" }; this.inputs = { id: { required: true }, name: { required: false }, state: { required: false }, options: { required: false, formatter: apiData_1.APIData.ensureObject }, mapping: { required: false, formatter: apiData_1.APIData.ensureObject }, syncMode: { required: false }, destinationGroupMemberships: { required: false, formatter: apiData_1.APIData.ensureObject, }, groupId: { required: false }, collection: { required: false, formatter: (p) => p, }, triggerExport: { required: false, formatter: apiData_1.APIData.ensureBoolean }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); if (params.options) await destination.setOptions(params.options); if (params.mapping) { await destination.setMapping(params.mapping, undefined, false); } if (params.destinationGroupMemberships) { await destination.setDestinationGroupMemberships(params.destinationGroupMemberships); } // do not set groupId or collection here, that's handled within the updateTracking method await destination.update({ name: params.name, state: params.state, syncMode: params.syncMode, }); let oldRun; let newRun; if (params.collection !== undefined || params.groupId !== undefined) { const updateResponse = await destination.updateTracking(params.collection, params.groupId); oldRun = updateResponse.oldRun; newRun = updateResponse.newRun; } if (params.triggerExport && !newRun && !oldRun) { newRun = await destination.exportMembers(); } await configWriter_1.ConfigWriter.run(); return { destination: await destination.apiData(), oldRun: oldRun ? await oldRun.apiData() : undefined, newRun: newRun ? await newRun.apiData() : undefined, }; } } exports.DestinationEdit = DestinationEdit; class DestinationConnectionOptions extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:connectionOptions"; this.description = "return option choices from this destination"; this.outputExample = {}; this.permission = { topic: "destination", mode: "read" }; this.inputs = { id: { required: true }, options: { required: false, formatter: apiData_1.APIData.ensureObject }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); return { options: await destination.destinationConnectionOptions(params.options), }; } } exports.DestinationConnectionOptions = DestinationConnectionOptions; class DestinationMappingOptions extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:mappingOptions"; this.description = "return option choices from this destination mapping"; this.outputExample = {}; this.permission = { topic: "destination", mode: "read" }; this.inputs = { id: { required: true }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); const options = await destination.destinationMappingOptions(false); // never use cache when displaying to the user const _destinationTypeConversions = {}; for (const [k, v] of Object.entries(destinationTypeConversions_1.destinationTypeConversions)) { _destinationTypeConversions[k] = Object.keys(v); } return { options, destinationTypeConversions: _destinationTypeConversions }; } } exports.DestinationMappingOptions = DestinationMappingOptions; class DestinationExportArrayProperties extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:exportArrayProperties"; this.description = "get the list of record properties this destination can handle as arrays"; this.outputExample = {}; this.permission = { topic: "destination", mode: "read" }; this.inputs = { id: { required: true }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); return { exportArrayProperties: await destination.getExportArrayProperties(), }; } } exports.DestinationExportArrayProperties = DestinationExportArrayProperties; class DestinationView extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:view"; this.description = "view a destination"; this.permission = { topic: "destination", mode: "read" }; this.inputs = { id: { required: true }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); return { destination: await destination.apiData() }; } } exports.DestinationView = DestinationView; class DestinationExport extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:export"; this.description = "export the member or members of the groups tracked by this destination"; this.permission = { topic: "destination", mode: "write" }; this.inputs = { id: { required: true }, recordId: { required: false }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); if (params.recordId) { const record = await GrouparooRecord_1.GrouparooRecord.findById(params.recordId); await destination.exportRecord(record, true); } else { await destination.exportMembers(); } return { success: true }; } } exports.DestinationExport = DestinationExport; class DestinationRecordPreview extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:recordPreview"; this.description = "view a preview of a record being exported to this destination"; this.outputExample = {}; this.permission = { topic: "destination", mode: "read" }; this.inputs = { id: { required: true }, collection: { required: false }, groupId: { required: false }, modelId: { required: false }, recordId: { required: false }, mapping: { required: false, formatter: apiData_1.APIData.ensureObject }, destinationGroupMemberships: { required: false, formatter: apiData_1.APIData.ensureObject, }, }; } async runWithinTransaction({ params, }) { var _a; const destination = await Destination_1.Destination.findById(params.id); let record; const collection = (_a = params.collection) !== null && _a !== void 0 ? _a : destination.collection; if (params.recordId) { record = await GrouparooRecord_1.GrouparooRecord.findById(params.recordId); } else if (collection === "group" && params.groupId) { const group = await Group_1.Group.findById(params.groupId); const groupMember = await GroupMember_1.GroupMember.findOne({ where: { groupId: group.id }, }); if (groupMember) { record = await GrouparooRecord_1.GrouparooRecord.findById(groupMember.recordId); } } else if (params.modelId) { record = await GrouparooRecord_1.GrouparooRecord.findOne({ where: { modelId: params.modelId }, }); } if (!record) return; await record.buildNullProperties(); // the preview may include a brand new property let mapping = params.mapping; if (!mapping) { mapping = await destination.getMapping(); } let destinationGroupMemberships = params.destinationGroupMemberships; if (!destinationGroupMemberships) { const destinationGroupMembershipsArray = await destination.getDestinationGroupMemberships(); destinationGroupMemberships = {}; destinationGroupMembershipsArray.map((dgm) => (destinationGroupMemberships[dgm.groupId] = dgm.remoteKey)); } if (!params.mapping && !params.groupId && !params.destinationGroupMemberships) { await destination.checkRecordWillBeExported(record); } const recordPreview = await destination.recordPreview(record, mapping, destinationGroupMemberships); const groups = await record.$get("groups"); const destinations = await destination_1.DestinationOps.relevantFor(record, groups); return { record: recordPreview, groups: await Promise.all(groups.map((group) => group.apiData())), destinations: await Promise.all(destinations.map((destination) => destination.apiData(false, false))), }; } } exports.DestinationRecordPreview = DestinationRecordPreview; class DestinationDestroy extends authenticatedAction_1.AuthenticatedAction { constructor() { super(...arguments); this.name = "destination:destroy"; this.description = "destroy a destination"; this.outputExample = {}; this.permission = { topic: "destination", mode: "write" }; this.inputs = { id: { required: true }, force: { required: true, default: false, formatter: (p) => p.toString().toLowerCase() === "true", }, }; } async runWithinTransaction({ params, }) { const destination = await Destination_1.Destination.findById(params.id); if (params.force) { await destination.destroy(); } else { // destination:destroy will be enqueued by the `destroy` system task await destination.update({ state: "deleted" }); } await configWriter_1.ConfigWriter.run(); return { success: true }; } } exports.DestinationDestroy = DestinationDestroy;