From d41d9a649c20f4c0aea4e9cf41abdfd32dd4a922 Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Fri, 25 Sep 2015 17:53:09 -0700 Subject: [PATCH] Full suite of data commands: get, set, update, push, remove --- commands/data-push.js | 52 +++++++++++++++++++++++++++++++++++++++++ commands/data-remove.js | 39 +++++++++++++++++++++++++++++++ commands/data-set.js | 2 +- commands/data-update.js | 49 ++++++++++++++++++++++++++++++++++++++ commands/index.js | 5 +++- lib/responseToError.js | 1 - 6 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 commands/data-push.js create mode 100644 commands/data-remove.js create mode 100644 commands/data-update.js diff --git a/commands/data-push.js b/commands/data-push.js new file mode 100644 index 00000000..eb8c66b5 --- /dev/null +++ b/commands/data-push.js @@ -0,0 +1,52 @@ +'use strict'; + +var Command = require('../lib/command'); +var requireAccess = require('../lib/requireAccess'); +var getFirebaseName = require('../lib/getFirebaseName'); +var request = require('request'); +var api = require('../lib/api'); +var responseToError = require('../lib/responseToError'); +var FirebaseError = require('../lib/error'); +var RSVP = require('rsvp'); +var utils = require('../lib/utils'); +var querystring = require('querystring'); +var chalk = require('chalk'); +var logger = require('../lib/logger'); +var fs = require('fs'); +var Firebase = require('firebase'); + +module.exports = new Command('data:push ') + .description('add a new JSON object to a list of data in your Firebase') + .option('-f, --firebase ', 'override the app specified in firebase.json') + .option('-a, --auth ', 'authorization token to use (defaults to admin token)') + .option('-i, --input ', 'read data from the specified file') + .before(requireAccess) + .action(function(path, options) { + var firebase = getFirebaseName(options); + + return new RSVP.Promise(function(resolve, reject) { + var fileIn = !!options.input; + var inStream = fileIn ? fs.createReadStream(options.input) : process.stdin; + + var url = utils.addSubdomain(api.realtimeOrigin, firebase) + path + '.json?'; + var query = {auth: options.auth || options.dataToken}; + + url += querystring.stringify(query); + + inStream.pipe(request.post(url, {json: true}, function(err, res, body) { + logger.info(); + if (err) { + return reject(new FirebaseError('Unexpected error while pushing data', {exit: 2})); + } else if (res.statusCode >= 400) { + return reject(responseToError(res, body)); + } + + var refurl = utils.addSubdomain(api.realtimeOrigin, firebase) + path + '/' + body.name; + + utils.logSuccess('Data pushed successfully'); + logger.info(); + logger.info(chalk.bold('View data at:'), refurl); + return resolve(new Firebase(refurl)); + })); + }); + }); diff --git a/commands/data-remove.js b/commands/data-remove.js new file mode 100644 index 00000000..1cfea9e5 --- /dev/null +++ b/commands/data-remove.js @@ -0,0 +1,39 @@ +'use strict'; + +var Command = require('../lib/command'); +var requireAccess = require('../lib/requireAccess'); +var getFirebaseName = require('../lib/getFirebaseName'); +var request = require('request'); +var api = require('../lib/api'); +var responseToError = require('../lib/responseToError'); +var FirebaseError = require('../lib/error'); +var RSVP = require('rsvp'); +var utils = require('../lib/utils'); +var querystring = require('querystring'); + +module.exports = new Command('data:remove ') + .description('remove data from your Firebase at the specified path') + .option('-f, --firebase ', 'override the app specified in firebase.json') + .option('-a, --auth ', 'authorization token to use (defaults to admin token)') + .before(requireAccess) + .action(function(path, options) { + var firebase = getFirebaseName(options); + + return new RSVP.Promise(function(resolve, reject) { + var url = utils.addSubdomain(api.realtimeOrigin, firebase) + path + '.json?'; + var query = {auth: options.auth || options.dataToken}; + + url += querystring.stringify(query); + + request.del(url, {json: true}, function(err, res, body) { + if (err) { + return reject(new FirebaseError('Unexpected error while removing data', {exit: 2})); + } else if (res.statusCode >= 400) { + return reject(responseToError(res, body)); + } + + utils.logSuccess('Data removed successfully'); + return resolve(); + }); + }); + }); diff --git a/commands/data-set.js b/commands/data-set.js index 6ce965ca..65520305 100644 --- a/commands/data-set.js +++ b/commands/data-set.js @@ -12,6 +12,7 @@ var utils = require('../lib/utils'); var querystring = require('querystring'); var chalk = require('chalk'); var logger = require('../lib/logger'); +var fs = require('fs'); module.exports = new Command('data:set ') .description('store JSON data in your Firebase at the specified path') @@ -30,7 +31,6 @@ module.exports = new Command('data:set ') var query = {auth: options.auth || options.dataToken}; url += querystring.stringify(query); - console.log(url); inStream.pipe(request.put(url, {json: true}, function(err, res, body) { logger.info(); diff --git a/commands/data-update.js b/commands/data-update.js new file mode 100644 index 00000000..dd3bf951 --- /dev/null +++ b/commands/data-update.js @@ -0,0 +1,49 @@ +'use strict'; + +var Command = require('../lib/command'); +var requireAccess = require('../lib/requireAccess'); +var getFirebaseName = require('../lib/getFirebaseName'); +var request = require('request'); +var api = require('../lib/api'); +var responseToError = require('../lib/responseToError'); +var FirebaseError = require('../lib/error'); +var RSVP = require('rsvp'); +var utils = require('../lib/utils'); +var querystring = require('querystring'); +var chalk = require('chalk'); +var logger = require('../lib/logger'); +var fs = require('fs'); + +module.exports = new Command('data:update ') + .description('update some of the keys for the defined path in your Firebase') + .option('-f, --firebase ', 'override the app specified in firebase.json') + .option('-a, --auth ', 'authorization token to use (defaults to admin token)') + .option('-i, --input ', 'read data from the specified file') + .before(requireAccess) + .action(function(path, options) { + var firebase = getFirebaseName(options); + + return new RSVP.Promise(function(resolve, reject) { + var fileIn = !!options.input; + var inStream = fileIn ? fs.createReadStream(options.input) : process.stdin; + + var url = utils.addSubdomain(api.realtimeOrigin, firebase) + path + '.json?'; + var query = {auth: options.auth || options.dataToken}; + + url += querystring.stringify(query); + + inStream.pipe(request.patch(url, {json: true}, function(err, res, body) { + logger.info(); + if (err) { + return reject(new FirebaseError('Unexpected error while setting data', {exit: 2})); + } else if (res.statusCode >= 400) { + return reject(responseToError(res, body)); + } + + utils.logSuccess('Data updated successfully'); + logger.info(); + logger.info(chalk.bold('View data at:'), utils.addSubdomain(api.realtimeOrigin, firebase) + path); + return resolve(); + })); + }); + }); diff --git a/commands/index.js b/commands/index.js index aa4c449c..8b97ec77 100644 --- a/commands/index.js +++ b/commands/index.js @@ -12,7 +12,10 @@ module.exports = function(client) { // client.collab.remove = loadCommand('collab-remove'); client.data = { get: loadCommand('data-get'), - set: loadCommand('data-set') + push: loadCommand('data-push'), + set: loadCommand('data-set'), + remove: loadCommand('data-remove'), + update: loadCommand('data-update') }; client.deploy = loadCommand('deploy'); client.disable = { diff --git a/lib/responseToError.js b/lib/responseToError.js index b50f54b5..3bd3d7d9 100644 --- a/lib/responseToError.js +++ b/lib/responseToError.js @@ -1,7 +1,6 @@ 'use strict'; var FirebaseError = require('./error'); -var _ = require('lodash'); module.exports = function(response, body, options) { if (response.statusCode < 400) {