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