Skip to content

Commit

Permalink
Allow performing of specific actions
Browse files Browse the repository at this point in the history
  • Loading branch information
alxndrsn committed May 29, 2017
1 parent 14cb2ac commit c14ef80
Show file tree
Hide file tree
Showing 12 changed files with 109 additions and 47 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,15 @@ Medic Project Configurer

# Use

## Upload all config

medic-config lg-uganda http://admin:pass@localhost:5984

## Perform specific action

medic-config <action> lg-uganda http://admin:pass@localhost:5984

The list of available actions can be seen in [`supported-actions.js`](https://github.com/alxndrsn/medic-configurer/blob/master/src/cli/supported-actions.js).

# Project Layout

Expand Down
36 changes: 28 additions & 8 deletions bin/medic-conf
Original file line number Diff line number Diff line change
@@ -1,15 +1,35 @@
#!/usr/bin/env node

const usage = require('../src/cli/usage');
const supportedActions = require('../src/cli/supported-actions');

if(process.argv.length < 4) {
usage();
process.exit(1);
}
switch(process.argv.length) {
case 4: {
const project = process.argv[2];
const instanceUrl = process.argv[3];
const couchUrl = `${instanceUrl}/medic`;

return require('../src/cli/all.js')(project, couchUrl);
}

case 5: {
const project = process.argv[3];
const instanceUrl = process.argv[4];
const couchUrl = `${instanceUrl}/medic`;

const project = process.argv[2];
const instanceUrl = process.argv[3];
const couchUrl = `${instanceUrl}/medic`;
const action = process.argv[2];

if(supportedActions.includes(action)) {
const log = require('../src/lib/log');

require('../src/cli/all.js')(project, couchUrl);
log('##', `Performing ${action} on ${instanceUrl}...`);
return require(`../src/fn/${action}`)(project, couchUrl)
.then(() => log('##', action, 'complete.'));
}
}

/* falls through */
default:
usage();
process.exit(1);
}
4 changes: 2 additions & 2 deletions src/cli/all.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ module.exports = (project, couchUrl) => {
.then(() => big_log(`Uploading project configuration for ${project} to ${couchUrl}...`))

.then(() => big_log('Compiling app settings...'))
.then(() => compileAppSettings(project))
.then(() => compileAppSettings(project, couchUrl))
.then(() => big_log('Tasks updated.'))

.then(() => big_log('Backing up app_settings...'))
Expand All @@ -30,7 +30,7 @@ module.exports = (project, couchUrl) => {
.then(() => big_log('Forms backed up.'))

.then(() => big_log('Deleting forms...'))
.then(() => deleteForms(couchUrl))
.then(() => deleteForms(project, couchUrl))
.then(() => big_log('Forms deleted.'))

.then(() => big_log('Uploading forms...'))
Expand Down
9 changes: 9 additions & 0 deletions src/cli/supported-actions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = [
'backup-app-settings',
'backup-forms',
'compile-app-settings',
'delete-forms',
'upload-app-settings',
'upload-forms',
'upload-resources',
];
10 changes: 9 additions & 1 deletion src/cli/usage.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const supportedActions = require('./supported-actions');

module.exports = () => {
console.log(`
# This script will update and upload all of a particular project configuration
Expand All @@ -8,6 +10,12 @@ module.exports = () => {
# structured projects.
Usage:
$0 <projectName> <instanceUrl>
$0 <projectName> <instanceUrl>
Or:
$0 <action> <projectName> <instanceUrl>
Supported actions:
* ${supportedActions.join('\n * ')}
`);
};
6 changes: 5 additions & 1 deletion src/fn/backup-app-settings.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
const fs = require('../lib/sync-fs');
const request = require('request-promise-native');

const log = require('../lib/log');
const backupFileFor = require('../lib/backup-file-for');

module.exports = (project, couchUrl) => {
const backupLocation = backupFileFor(project, 'app_settings.json');

return request({
url: `${couchUrl}/_design/medic/_rewrite/app_settings/medic`,
json: true,
})
.then(body => fs.writeJson(backupFileFor(project, 'app_settings.json'), body.settings));
.then(body => fs.writeJson(backupLocation, body.settings))
.then(() => log('Backed up to:', backupLocation));
};
8 changes: 7 additions & 1 deletion src/fn/backup-forms.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
const log = require('../lib/log');
const fs = require('../lib/sync-fs');
const PouchDB = require('pouchdb');

const backupFileFor = require('../lib/backup-file-for');

module.exports = (project, couchUrl) => {
const db = new PouchDB(couchUrl);
const parentBackupDir = backupFileFor(project, 'forms');

log('Backing up forms to:', parentBackupDir);
fs.mkdir(parentBackupDir);

function backup(form) {
const backupDir = backupFileFor(project, form.id);
const backupDir = `${parentBackupDir}/${form.id}`;

fs.mkdir(backupDir);
db.get(form.id, { attachments:true, binary:true })
.then(form => {
Expand Down
39 changes: 21 additions & 18 deletions src/fn/compile-app-settings.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
const fs = require('../lib/sync-fs');

module.exports = project => {
const readProjectFile = f => fs.read(`${project}/${f}`);
module.exports = (project /*, couchUrl */) => {
return Promise.resolve()
.then(() => {
const readProjectFile = f => fs.read(`${project}/${f}`);

const files = {};
[
'app_settings.json',
'contact-summary.js',
'nools.js',
'schedules.json',
'targets.json',
].forEach(f => files[simple(f)] = readProjectFile(f));
const files = {};
[
'app_settings.json',
'contact-summary.js',
'nools.js',
'schedules.json',
'targets.json',
].forEach(f => files[simple(f)] = readProjectFile(f));

const app_settings = JSON.parse(files.app_settings);
const app_settings = JSON.parse(files.app_settings);

app_settings.contact_summary = cleanJs(files.contact_summary);
app_settings.contact_summary = cleanJs(files.contact_summary);

app_settings.tasks = {
rules: cleanJs(files.nools),
schedules: JSON.parse(files.schedules),
targets: JSON.parse(files.targets),
};
app_settings.tasks = {
rules: cleanJs(files.nools),
schedules: JSON.parse(files.schedules),
targets: JSON.parse(files.targets),
};

fs.writeJson(`${project}/app_settings.json`, app_settings);
fs.writeJson(`${project}/app_settings.json`, app_settings);
});
};

const simple = s => s.replace(/\..*/, '').replace('-', '_');
Expand Down
2 changes: 1 addition & 1 deletion src/fn/delete-forms.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const PouchDB = require('pouchdb');

module.exports = couchUrl => {
module.exports = (project, couchUrl) => {
const db = new PouchDB(couchUrl);

return db.query('medic-client/forms', { include_docs:true })
Expand Down
7 changes: 4 additions & 3 deletions src/fn/upload-forms.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
const fs = require('../lib/sync-fs');
const attachmentsFromDir = require('../lib/attachments-from-dir');
const warn = require('../lib/log').warn;

const PouchDB = require('pouchdb');

const attachmentsFromDir = require('../lib/attachments-from-dir');
const insertOrUpdate = require('../lib/insert-or-update');

module.exports = (project, couchUrl) => {
const db = new PouchDB(couchUrl);

Expand Down Expand Up @@ -37,6 +38,6 @@ module.exports = (project, couchUrl) => {

doc._attachments = attachmentsFromDir(formDir);

return db.put(doc);
return insertOrUpdate(db, doc);
}));
};
20 changes: 8 additions & 12 deletions src/fn/upload-resources.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
const fs = require('../lib/sync-fs');
const attachmentsFromDir = require('../lib/attachments-from-dir');

const PouchDB = require('pouchdb');

const attachmentsFromDir = require('../lib/attachments-from-dir');
const insertOrUpdate = require('../lib/insert-or-update');

module.exports = (project, couchUrl) => {
const db = new PouchDB(couchUrl);

return db.get('resources')
.catch(e => {
if(e.status === 404) return { _id:'resources' };
else throw e;
})
.then(doc => {
doc.resources = fs.readJson(`${project}/resources.json`);
doc._attachments = attachmentsFromDir(`${project}/resources`);
return db.put(doc);
});
return insertOrUpdate(db, {
_id: 'resources',
resources: fs.readJson(`${project}/resources.json`),
_attachments: attachmentsFromDir(`${project}/resources`),
});
};
8 changes: 8 additions & 0 deletions src/lib/insert-or-update.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = (db, doc) =>
db.get(doc._id)
.then(existingDoc => doc._rev = existingDoc._rev)
.catch(e => {
if(e.status === 404) return;
else throw e;
})
.then(() => db.put(doc));

0 comments on commit c14ef80

Please sign in to comment.