UNPKG

kyper-grout

Version:

Library to communicate with tessellate application building/managing service.

373 lines (314 loc) 10.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _isString = require('lodash/isString'); var _isString2 = _interopRequireDefault(_isString); var _isArray = require('lodash/isArray'); var _isArray2 = _interopRequireDefault(_isArray); var _each = require('lodash/each'); var _each2 = _interopRequireDefault(_each); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _Matter = require('./Matter'); var _Matter2 = _interopRequireDefault(_Matter); var _File2 = require('./File'); var _File3 = _interopRequireDefault(_File2); var _Folder = require('./Folder'); var _Folder2 = _interopRequireDefault(_Folder); var _jszip = require('jszip'); var _jszip2 = _interopRequireDefault(_jszip); var _nodeSafeFilesaver = require('node-safe-filesaver'); var _nodeSafeFilesaver2 = _interopRequireDefault(_nodeSafeFilesaver); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } //Convenience vars var logger = _Matter2.default.utils.logger; var Directory = function () { function Directory(project) { _classCallCheck(this, Directory); logger.debug({ description: 'Directory object constructed.', func: 'constructor', obj: 'Directory', dir: this }); if (!project) { throw new Error('Project is required to create directory'); } this.project = project; } /** * @description File within directory */ _createClass(Directory, [{ key: 'File', value: function File(path) { var file = new _File3.default(this.project, path); logger.debug({ description: 'Projects file action called.', path: path, project: this, file: file, func: 'File', obj: 'Directory' }); return file; } /** * @description Firebase reference of directory */ }, { key: 'get', /** * @description Get directory */ value: function get() { var _this = this; logger.log({ description: 'Directory get called.', func: 'get', obj: 'Directory' }); return new Promise(function (resolve) { _this.fbRef.once('value', function (filesSnap) { logger.info({ description: 'Directory loaded from firebase.', func: 'get', obj: 'Directory' }); _this.fbData = filesSnap.val(); resolve(_this); }); }); } /** * @description Download files from firebase */ }, { key: 'downloadFiles', value: function downloadFiles() { var _this2 = this; logger.debug({ description: 'Download files called.', func: 'downloadFiles', obj: 'Directory' }); return this.get().then(function (directory) { directory = directory.fbData; var zip = new _jszip2.default(); var promiseArray = []; var handleZip = function handleZip(fbChildren) { (0, _each2.default)(fbChildren, function (child) { if (!child.meta || child.meta.entityType === 'folder') { delete child.meta; return handleZip(child); } var promise = _this2.File(child.meta.path).getContent().then(function (content) { return zip.file(child.meta.path, content); }); promiseArray.push(promise); }); }; handleZip(directory); return Promise.all(promiseArray).then(function () { var content = zip.generate({ type: 'blob' }); return _nodeSafeFilesaver2.default.saveAs(content, _this2.project.name + '-devShare-export.zip'); }); }); } /** * @description Get synced files list from firebase */ }, { key: 'sync', value: function sync(callback) { // TODO: get files list from firebase logger.debug({ description: 'Directory sync called.', func: 'sync', obj: 'Directory' }); this.listenerCallback = callback; return this.fbRef.on('value', this.listenerCallback); } /** * @description Get synced files list from firebase */ }, { key: 'unsync', value: function unsync() { // TODO: get files list from firebase logger.debug({ description: 'Directory sync called.', func: 'sync', obj: 'Directory' }); return this.fbRef.off('value', this.listenerCallback); } /** * @description Add a new file or files * @param {Object|Array} fileData - Array of objects or single object containing file data * @param {Object} fileData.path - Path of file relative to project */ }, { key: 'addFile', value: function addFile(path, content) { var file = new _File3.default(this.project, path, content); return file.save(); } /** * @description Add a folder * @param {string} path - Path of where the folder should be saved * @param {String} name - optionally provide name of folder */ }, { key: 'addFolder', value: function addFolder(path) { var folder = new _Folder2.default(this.project, path); return folder.save(); } /** * @description Add multiple files/folders to project files * @param {Array} files - Array of file objects to upload */ }, { key: 'upload', value: function upload(files) { var _this3 = this; //TODO: Allow for options of where to add the file to if (!(0, _isArray2.default)(files)) { return this.addToFb(files); } else { var _ret = function () { logger.warn({ description: 'Upload called with multiple files.', files: files, project: _this3.project, func: 'upload', obj: 'Directory' }); var promises = []; (0, _each2.default)(files, function (file) { promises.push(_this3.addToFb(file)); }); return { v: Promise.all(promises).then(function (resultsArray) { logger.info({ description: 'Directory uploaded successfully.', resultsArray: resultsArray, func: 'upload', obj: 'Directory' }); return Promise.resolve(_this3); }) }; }(); if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } } /** * @description Remove object from files (folder or file) */ }, { key: 'remove', value: function remove(objData) { //TODO: Delete file from S3 as well if it exists return this.delFromFb(objData); } /** * @description Add a file to Firebase * @param {Object} fileData - Data object for new file * @param {String} fileData.path - Path of file within project * @param {String} fileData.content - Content of file */ }, { key: 'addToFb', value: function addToFb(addData) { var _this4 = this; logger.debug({ description: 'Add to fb called.', addData: addData, func: 'addToFb', obj: 'Directory' }); if (!addData) { logger.debug({ description: 'Object data is required to add.', addData: addData, func: 'addToFb', obj: 'Directory' }); return Promise.reject({ message: 'Object data is required to add.' }); } //Array of files/folder to upload if ((0, _isArray2.default)(addData)) { var _ret2 = function () { var promises = []; addData.forEach(function (file) { promises.push(_this4.addToFb(file)); }); return { v: Promise.all(promises) }; }(); if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v; } var size = addData.size; var path = addData.path; var name = addData.name; var type = addData.type; if (size) { return this.addLocalToFb(addData); } if (!path) { logger.error({ description: 'Invalid file data. Path must be included.', func: 'addToFb', obj: 'Directory' }); return Promise.reject({ message: 'Invalid file data. Path must be included.' }); } if (type && type === 'folder') { return new _Folder2.default(this.project, path, name).save(); } else { return new _File3.default(this.project, path, name).save(); } } /** * @description Delete a file or folder from Firebase * @param {Object} objData - Data of file or folder * @param {String} path - Path of file or folder */ }, { key: 'delFromFb', value: function delFromFb(path) { logger.debug({ description: 'Del from fb called.', path: path, func: 'delFromFb', obj: 'Directory' }); if (!path || !(0, _isString2.default)(path)) { logger.error({ description: 'Invalid file path. Path must be included.', func: 'delFromFb', obj: 'Directory' }); return Promise.reject({ message: 'Invalid file path. Path must be included to delete.' }); } var file = new _File3.default(this.project, path); return new Promise(function (resolve, reject) { file.fbRef.remove(file, function (err) { if (err) { logger.error({ description: 'Error deleting from Firebase.', func: 'delFromFb', obj: 'Directory' }); return reject(err); } logger.info({ description: 'Successfully deleted.', func: 'delFromFb', obj: 'Directory' }); resolve({ message: 'Delete successful.' }); }); }); } }, { key: 'fbRef', get: function get() { logger.debug({ description: 'Url created for directory fbRef.', url: this.project.fbRef, func: 'fbRef', obj: 'Directory' }); return this.project.fbRef; } }]); return Directory; }(); exports.default = Directory; module.exports = exports['default'];