UNPKG

couchinator

Version:

Fixtures for Cloudant: Create and destroy cloudant databases with ease

101 lines (91 loc) 2.66 kB
const path = require('path'); const Logger = require('../logger'); const DocUpdater = require('./updater'); const fsu = require('../util'); function Commands(cloudant, resourcePath, prefix, suffix, visitor) { const logger = Logger(visitor); const databaseStateMap = new Map(); return { create(opts = { designDocsOnly: false }) { const allDocs = !opts.designDocsOnly; const createDbsAndUpdateDocs = dbs => Promise.all( dbs.map(db => createDb(db).then(() => DocUpdater( cloudant, buildDbName(db), // db name db, // dir name resourcePath, databaseStateMap, logger ).updateDocs(allDocs, true) ) ) ); return fsu .directories(resourcePath) .then(createDbsAndUpdateDocs) .then(() => logger.info('Done.')) .catch(e => { const m = `Database create failed: ${e.message || e.reason}`; logger.error(m, e); throw Error(m); }); }, destroy() { const destroyDbs = dbs => Promise.all(dbs.map(destroyDb)); return fsu .directories(resourcePath) .then(destroyDbs) .then(() => logger.info('Done.')) .catch(e => { const m = `Database destroy failed: ${e.message || e.reason}`; logger.error(m, e); throw Error(m); }); }, recreate(opts = { designDocsOnly: false }) { // TODO HANDLE DESTROY FAIL return this.destroy() .catch(e => {}) .then(r => this.create(opts)); }, }; function createDb(dbName) { const name = buildDbName(dbName); return cloudant.db .create(name) .then(() => logger.debug(`Create db ${name}`)) .catch(e => { if (e.statusCode === 412) { databaseStateMap.set(name, true); logger.debug(`Found db ${name}`); } else { logger.error( `Failed to create db ${name}: ${e.message} - ${e.reason}`, e ); } }); } function destroyDb(dbName) { const name = buildDbName(dbName); return cloudant.db .destroy(name) .then(() => logger.info(`Destroy db ${name}`)) .catch(e => logger.error( `Failed to destroy db ${name}: ${e.message || e.reason}`, e ) ); } function buildDbName(name) { if (prefix && suffix) return prefix + name + suffix; if (prefix) return prefix + name; if (suffix) return name + suffix; return name; } } module.exports = Commands;