const CouchDB = require("pouchdb") const PouchDB = require("../../../db") const { uploadAppAssets } = require("./aws") function replicate(local, remote) { return new Promise((resolve, reject) => { const replication = local.sync(remote) replication.on("complete", () => resolve()) replication.on("error", err => reject(err)) }) } async function replicateCouch(instanceId, clientId) { const databases = [`client_${clientId}`, "client_app_lookup", instanceId] const replications = databases.map(local => { const localDb = new PouchDB(local) const remoteDb = new CouchDB( `${process.env.DEPLOYMENT_COUCH_DB_URL}/${local}` ) return replicate(localDb, remoteDb) }) await Promise.all(replications) } exports.deployApp = async function(ctx) { try { const clientAppLookupDB = new PouchDB("client_app_lookup") const { clientId } = await clientAppLookupDB.get(ctx.user.appId) ctx.log.info(`Uploading assets for appID ${ctx.user.appId} assets to s3..`) await uploadAppAssets({ clientId, appId: ctx.user.appId, }) // replicate the DB to the couchDB cluster in prod ctx.log.info("Replicating local PouchDB to remote..") await replicateCouch(ctx.user.instanceId, clientId) ctx.body = { status: "SUCCESS", completed: Date.now(), } } catch (err) { ctx.throw(err.status || 500, `Deployment Failed: ${err.message}`) } }