358 lines
14 KiB
JavaScript
358 lines
14 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var LockScope_1 = require("../lock/LockScope");
|
|
var Workflow_1 = require("../../../helper/Workflow");
|
|
var LockType_1 = require("../lock/LockType");
|
|
var LockKind_1 = require("../lock/LockKind");
|
|
var LockBag_1 = require("../lock/LockBag");
|
|
var Errors_1 = require("../../../Errors");
|
|
var mimeTypes = require("mime-types");
|
|
var StandardResource = /** @class */ (function () {
|
|
function StandardResource(parent, fsManager) {
|
|
this.deleteOnMoved = true;
|
|
this.dateCreation = Date.now();
|
|
this.properties = {};
|
|
this.fsManager = fsManager;
|
|
this.lockBag = new LockBag_1.LockBag();
|
|
this.parent = parent;
|
|
this.dateLastModified = this.dateCreation;
|
|
}
|
|
StandardResource.sizeOfSubFiles = function (resource, targetSource, callback) {
|
|
resource.getChildren(function (e, children) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
new Workflow_1.Workflow()
|
|
.each(children, function (child, cb) {
|
|
child.size(targetSource, cb);
|
|
})
|
|
.error(function (e) { return callback(e, 0); })
|
|
.done(function (sizes) { return callback(null, sizes.reduce(function (o, s) { return o + s; }, 0)); });
|
|
});
|
|
};
|
|
// ****************************** Locks ****************************** //
|
|
StandardResource.prototype.getAvailableLocks = function (callback) {
|
|
callback(null, [
|
|
new LockKind_1.LockKind(LockScope_1.LockScope.Exclusive, LockType_1.LockType.Write),
|
|
new LockKind_1.LockKind(LockScope_1.LockScope.Shared, LockType_1.LockType.Write)
|
|
]);
|
|
};
|
|
StandardResource.prototype.getLocks = function (callback) {
|
|
callback(null, this.lockBag.getLocks());
|
|
};
|
|
StandardResource.prototype.setLock = function (lock, callback) {
|
|
var locked = this.lockBag.setLock(lock);
|
|
this.updateLastModified();
|
|
callback(locked ? null : Errors_1.Errors.CannotLockResource);
|
|
};
|
|
StandardResource.prototype.removeLock = function (uuid, callback) {
|
|
this.lockBag.removeLock(uuid);
|
|
this.updateLastModified();
|
|
callback(null, true);
|
|
};
|
|
StandardResource.prototype.getLock = function (uuid, callback) {
|
|
callback(null, this.lockBag.getLock(uuid));
|
|
};
|
|
// ****************************** Properties ****************************** //
|
|
StandardResource.prototype.setProperty = function (name, value, callback) {
|
|
this.properties[name] = value;
|
|
this.updateLastModified();
|
|
callback(null);
|
|
};
|
|
StandardResource.prototype.getProperty = function (name, callback) {
|
|
var value = this.properties[name];
|
|
if (value === undefined)
|
|
callback(Errors_1.Errors.PropertyNotFound, null);
|
|
else
|
|
callback(null, value);
|
|
};
|
|
StandardResource.prototype.removeProperty = function (name, callback) {
|
|
delete this.properties[name];
|
|
this.updateLastModified();
|
|
callback(null);
|
|
};
|
|
StandardResource.prototype.getProperties = function (callback) {
|
|
callback(null, this.properties);
|
|
};
|
|
StandardResource.prototype.moveTo = function (parent, newName, overwrite, callback) {
|
|
StandardResource.standardMoveByCopy(this, parent, newName, overwrite, this.deleteOnMoved, callback);
|
|
};
|
|
// ****************************** Std meta-data ****************************** //
|
|
StandardResource.prototype.creationDate = function (callback) {
|
|
callback(null, this.dateCreation);
|
|
};
|
|
StandardResource.prototype.lastModifiedDate = function (callback) {
|
|
callback(null, this.dateLastModified);
|
|
};
|
|
StandardResource.prototype.updateLastModified = function () {
|
|
this.dateLastModified = Date.now();
|
|
};
|
|
StandardResource.prototype.removeFromParent = function (callback) {
|
|
StandardResource.standardRemoveFromParent(this, callback);
|
|
};
|
|
StandardResource.prototype.addToParent = function (parent, callback) {
|
|
StandardResource.standardAddToParent(this, parent, callback);
|
|
};
|
|
StandardResource.standardRemoveFromParent = function (resource, callback) {
|
|
var parent = resource.parent;
|
|
if (parent)
|
|
parent.removeChild(resource, function (e) {
|
|
if (!e && resource.parent === parent) // resource.parent didn't change
|
|
resource.parent = null;
|
|
callback(e);
|
|
});
|
|
else
|
|
callback(null);
|
|
};
|
|
StandardResource.standardAddToParent = function (resource, parent, callback) {
|
|
parent.addChild(resource, function (e) {
|
|
if (!e)
|
|
resource.parent = parent;
|
|
callback(e);
|
|
});
|
|
};
|
|
StandardResource.standardFindChildren = function (parent, predicate, callback) {
|
|
parent.getChildren(function (e, children) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
new Workflow_1.Workflow()
|
|
.each(children, function (child, cb) {
|
|
predicate(child, function (e, isMatching) { return cb(e, isMatching ? child : null); });
|
|
})
|
|
.error(function (e) { return callback(e, null); })
|
|
.done(function (conflictingChildren) { return callback(null, conflictingChildren.filter(function (c) { return !!c; })); });
|
|
});
|
|
};
|
|
StandardResource.standardFindChildByName = function (parent, name, callback) {
|
|
this.standardFindChildren(parent, function (r, cb) { return r.webName(function (e, rname) {
|
|
if (e)
|
|
cb(e);
|
|
else if (name === rname)
|
|
cb(null, true);
|
|
else
|
|
cb(null, false);
|
|
}); }, function (e, rs) {
|
|
if (e)
|
|
callback(e, null);
|
|
else if (rs.length > 0)
|
|
callback(null, rs[0]);
|
|
else
|
|
callback(Errors_1.Errors.ResourceNotFound, null);
|
|
});
|
|
};
|
|
StandardResource.standardMoveByCopy = function (resource, parent, newName, overwrite, deleteSource, callback) {
|
|
StandardResource.standardFindChildByName(parent, newName, function (e, r) {
|
|
if (e === Errors_1.Errors.ResourceNotFound)
|
|
copy();
|
|
else if (e)
|
|
callback(e, null);
|
|
else if (!overwrite)
|
|
callback(Errors_1.Errors.ResourceAlreadyExists, null);
|
|
else
|
|
r.delete(function (e) {
|
|
if (e)
|
|
callback(e, null);
|
|
else
|
|
copy();
|
|
});
|
|
});
|
|
function copy() {
|
|
resource.type(function (e, type) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
var destination = parent.fsManager.newResource(null, newName, type, parent);
|
|
destination.create(function (e) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
parent.addChild(destination, function (e) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
if (type.isDirectory)
|
|
copyDir(destination);
|
|
else
|
|
copyFile(destination);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
function copyProperties(destination, callback) {
|
|
resource.getProperties(function (e, props) {
|
|
if (e) {
|
|
callback(e);
|
|
return;
|
|
}
|
|
new Workflow_1.Workflow()
|
|
.each(Object.keys(props), function (key, cb) { return destination.setProperty(key, props[key], cb); })
|
|
.error(callback)
|
|
.done(function () { return callback(null); });
|
|
});
|
|
}
|
|
function copyLocks(destination, callback) {
|
|
resource.getLocks(function (e, locks) {
|
|
if (e === Errors_1.Errors.MustIgnore) {
|
|
callback(null);
|
|
return;
|
|
}
|
|
if (e) {
|
|
callback(e);
|
|
return;
|
|
}
|
|
new Workflow_1.Workflow()
|
|
.each(locks, function (lock, cb) { return destination.setLock(lock, cb); })
|
|
.error(callback)
|
|
.done(function () { return callback(null); });
|
|
});
|
|
}
|
|
function finalizeCopy(destination) {
|
|
copyProperties(destination, function (e) {
|
|
if (e)
|
|
callback(e, null);
|
|
else
|
|
copyLocks(destination, function (e) {
|
|
if (e)
|
|
callback(e, null);
|
|
else if (deleteSource)
|
|
resource.delete(function (e) { return callback(e, destination); });
|
|
else
|
|
resource.parent.removeChild(resource, function (e) { return callback(e, destination); });
|
|
});
|
|
});
|
|
}
|
|
function copyDir(destination) {
|
|
resource.getChildren(function (e, children) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
new Workflow_1.Workflow()
|
|
.each(children, function (child, cb) { return child.webName(function (e, name) {
|
|
if (e)
|
|
cb(e);
|
|
else
|
|
child.moveTo(destination, name, overwrite, cb);
|
|
}); })
|
|
.error(function (e) { return callback(e, null); })
|
|
.done(function () { return finalizeCopy(destination); });
|
|
});
|
|
}
|
|
function copyFile(destination) {
|
|
resource.read(true, function (e, rStream) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
destination.write(true, function (e, wStream) {
|
|
if (e) {
|
|
callback(e, null);
|
|
return;
|
|
}
|
|
rStream.pipe(wStream);
|
|
wStream.on('error', callback);
|
|
wStream.on('finish', function () { return finalizeCopy(destination); });
|
|
});
|
|
});
|
|
}
|
|
};
|
|
StandardResource.standardMoveTo = function (resource, parent, newName, overwrite, callback) {
|
|
StandardResource.standardMoveByCopy(resource, parent, newName, overwrite, true, callback);
|
|
};
|
|
/**
|
|
* @deprecated Prefer calling 'standardMoveByCopy(...)' instead to avoid compatibility issue between file systems.
|
|
*/
|
|
StandardResource.standardMoveWithoutCopy = function (resource, parent, newName, overwrite, callback) {
|
|
StandardResource.standardFindChildByName(parent, newName, function (e, r) {
|
|
if (e === Errors_1.Errors.ResourceNotFound)
|
|
move();
|
|
else if (e)
|
|
callback(e);
|
|
else if (!overwrite)
|
|
callback(Errors_1.Errors.ResourceAlreadyExists);
|
|
else
|
|
r.delete(function (e) {
|
|
if (e)
|
|
callback(e);
|
|
else
|
|
move();
|
|
});
|
|
});
|
|
function move() {
|
|
if (parent === resource.parent) {
|
|
resource.rename(newName, function (e, oldName, newName) {
|
|
callback(e);
|
|
});
|
|
return;
|
|
}
|
|
StandardResource.standardRemoveFromParent(resource, function (e) {
|
|
if (e) {
|
|
callback(e);
|
|
return;
|
|
}
|
|
resource.webName(function (e, name) {
|
|
if (e || name === newName) {
|
|
parent.addChild(resource, function (e) {
|
|
callback(e);
|
|
});
|
|
return;
|
|
}
|
|
resource.rename(newName, function (e, oldName, newName) {
|
|
if (e)
|
|
callback(e);
|
|
else
|
|
parent.addChild(resource, function (e) {
|
|
callback(e);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
};
|
|
StandardResource.standardMimeType = function (resource, targetSource, _defaultMimeType, _useWebName, _callback) {
|
|
var callback;
|
|
var useWebName = false;
|
|
var defaultMimeType = 'application/octet-stream';
|
|
if (_defaultMimeType.constructor === Function) {
|
|
callback = _defaultMimeType;
|
|
}
|
|
else if (_defaultMimeType.constructor === Boolean) {
|
|
callback = _useWebName;
|
|
if (_defaultMimeType !== undefined && _defaultMimeType !== null)
|
|
useWebName = _defaultMimeType;
|
|
}
|
|
else {
|
|
callback = _callback;
|
|
if (_useWebName !== undefined && _useWebName !== null)
|
|
useWebName = _useWebName;
|
|
if (_defaultMimeType !== undefined && _defaultMimeType !== null)
|
|
defaultMimeType = _defaultMimeType;
|
|
}
|
|
resource.type(function (e, type) {
|
|
if (e)
|
|
callback(e, null);
|
|
else if (type.isFile) {
|
|
var fn = !useWebName && resource.displayName ? resource.displayName : resource.webName;
|
|
fn(function (e, name) {
|
|
if (e)
|
|
callback(e, null);
|
|
else {
|
|
var mt = mimeTypes.contentType(name);
|
|
callback(null, mt ? mt : defaultMimeType);
|
|
}
|
|
});
|
|
}
|
|
else
|
|
callback(Errors_1.Errors.NoMimeTypeForAFolder, null);
|
|
});
|
|
};
|
|
return StandardResource;
|
|
}());
|
|
exports.StandardResource = StandardResource;
|