kyper-grout
Version:
Library to communicate with tessellate application building/managing service.
150 lines (139 loc) • 3.96 kB
JavaScript
import matter from './Matter';
import { last, omitBy, isUndefined, isString } from 'lodash';
import Firebase from 'firebase';
import firebaseUtil from '../utils/firebase';
const { logger } = matter.utils;
export default class FileSystemEntity {
constructor(project, path) {
logger.debug({
description: 'FileSystemEntity constructor called.', project, path,
func: 'constructor', obj: 'FileSystemEntity'
});
if (!project || !isString(path)) {
logger.error({
description: 'FileSystemEntity that includes path and project is needed to create a FileSystemEntity action.',
func: 'constructor', obj: 'FileSystemEntity'
});
throw new Error('FileSystemEntity with path and project is needed to create file action.');
}
this.project = project;
this.path = path.indexOf('/') === 0 ? path.slice(1) : path;
this.name = last(path.split('/'));
logger.debug({
description: 'FileSystemEntity object constructed.', entity: this,
func: 'constructor', obj: 'FileSystemEntity'
});
}
/**
* @description FileSystemEntity's Firebase reference
* @return {Object} Firebase reference
*/
get fbRef() {
if (!this.project || !this.project.name) {
logger.error({
description: 'App information needed to generate fbUrl for FileSystemEntity.',
entity: this, func: 'fbUrl', obj: 'FileSystemEntity'
});
throw new Error ('App information needed to generate fbUrl for FileSystemEntity.');
}
const url = [this.project.fbUrl, firebaseUtil.pathToSafePath(this.path)].join('/');
logger.debug({
description: 'Fb ref generated.',
url, func: 'fbRef', obj: 'FileSystemEntity'
});
return new Firebase(url);
}
/**
* @description Get a file or folder's content and meta data from default location (Firebase)
*/
get() {
return new Promise((resolve, reject) => {
this.fbRef.once('value', (fileSnap) => {
if (!fileSnap.val()) {
reject('no firebase value found');
}
resolve(fileSnap.val());
});
});
}
/**
* @description Open a file from default location (Firebase) (Alias for get)
*/
open() {
return this.get();
}
/**
* @description Remove a file from default location (Firebase)
*/
remove() {
return this.removeFromFb();
}
//TODO: move file
move() {
return null;
}
/**
* @description Add folder to project
* @return {Promise}
*/
save() {
return this.addToFb();
}
/**
* @description Add file to Firebase located at file's fbRef
*/
addToFb() {
logger.debug({
description: 'addToFb called.', entity: this,
func: 'addToFb', obj: 'FileSystemEntity'
});
const { fbRef, path, name, entityType, fileType, content } = this;
let fbData = {meta: {path, name, entityType, fileType}};
fbData.meta = omitBy(fbData.meta, isUndefined);
if (content){
fbData.original = content;
}
return new Promise((resolve, reject) => {
fbRef.update(fbData, error => {
if (!error) {
logger.info({
description: 'FileSystemEntity successfully added to Firebase.',
func: 'addToFb', obj: 'FileSystemEntity'
});
resolve(fbData);
} else {
logger.error({
description: 'Error creating file on Firebase.',
error, func: 'addToFb', obj: 'FileSystemEntity'
});
reject(error);
}
});
});
}
/**
* @description Remove file from Firebase
*/
removeFromFb() {
logger.debug({
description: 'Remove FileSystemEntity from Firebase called.',
func: 'removeFromFb', obj: 'FileSystemEntity'
});
return new Promise((resolve, reject) => {
this.fbRef.remove(error => {
if (error) {
logger.error({
description: 'Error removing file from Firebase.', entity: this,
error, func: 'removeFromFb', obj: 'FileSystemEntity'
});
return reject(error);
}
logger.info({
description: 'FileSystemEntity successfully removed from Firebase.',
entity: this, func: 'removeFromFb', obj: 'FileSystemEntity'
});
resolve(this);
});
});
}
}