UNPKG

2.9 kBJavaScriptView Raw
1'use strict';
2
3// foreign modules
4
5const memoize = require('lodash.memoize');
6
7// local modules
8
9const api = require('./api');
10const asyncp = require('./utils/asyncp');
11const progress = require('./progress');
12const resource = require('./resource');
13const validate = require('./validate');
14const values = require('./values');
15
16// this module
17
18const readCachedAnswerSpace = memoize(resource.readAnswerSpace);
19
20function deployAnswerSpace (options) {
21 return readCachedAnswerSpace(options)
22 .then((data) => api.putResource({ id: data.id, type: 'answerspaces', data }));
23}
24
25function deployInteraction (options) {
26 let isNew;
27 return Promise.all([
28 readCachedAnswerSpace({ cwd: options.cwd }),
29 resource.readInteraction(options)
30 ])
31 .then((results) => {
32 const answerSpace = results[0];
33 const data = results[1];
34 isNew = !data.id;
35 data.links = { answerspaces: answerSpace.id };
36 return api.putResource({ id: data.id, type: 'interactions', data });
37 })
38 .then((result) => {
39 if (isNew) {
40 return resource.writeInteraction({
41 cwd: options.cwd,
42 data: result.interactions,
43 name: result.interactions.name
44 });
45 }
46 });
47}
48
49function deployInteractions (options) {
50 return resource.listInteractions(options)
51 .then((results) => results.map((result) => result.name))
52 .then((names) => {
53 progress.addWork(names.length);
54 return asyncp.eachLimit(
55 names,
56 values.MAX_REQUESTS,
57 asyncp.asyncify((name) => {
58 return deployInteraction({ cwd: options.cwd, name })
59 .then(() => progress.completeWork(1));
60 })
61 );
62 });
63}
64
65function deployAll (options) {
66 options = options || {};
67 const cwd = process.env.BMP_WORKING_DIR || process.cwd();
68
69 return validate.validateScopeMatchesContent({ cwd })
70 .then(() => Promise.all([
71 deployAnswerSpace({ cwd }),
72 deployInteractions({ cwd })
73 ]))
74 .then(() => {
75 if (options.prune) {
76 return pruneInteractions({ cwd });
77 }
78 });
79}
80
81function pruneInteractions (options) {
82 return api.getDashboard()
83 .then((obj) => obj.answerSpace.id)
84 .then((id) => Promise.all([
85 api.getResource({ id, type: 'answerspaces' }),
86 resource.listInteractions({ cwd: options.cwd })
87 ]))
88 .then((results) => {
89 const remoteIds = results[0].answerspaces.links.interactions || [];
90 const localIds = results[1].map((i) => i.id);
91 const pruneIds = remoteIds.filter((id) => localIds.indexOf('' + id) === -1);
92 progress.addWork(pruneIds.length);
93 return pruneIds;
94 })
95 .then((pruneIds) => asyncp.eachLimit(pruneIds, values.MAX_REQUESTS, asyncp.asyncify((id) => {
96 return api.deleteResource({ id, type: 'interactions' })
97 .then(() => progress.completeWork(1));
98 })));
99}
100
101module.exports = {
102 deployAll,
103 deployInteraction
104};