UNPKG

nitrogen-core

Version:

Core services used across ingestion, registry, and consumption servers.

90 lines (70 loc) 2.69 kB
var async = require('async') , core = require('../../lib') , mongoose = require('mongoose'); var canView = function(principal, blob, callback) { core.services.permissions.authorize({ principal: principal.id, principal_for: blob.owner, action: 'view' }, blob, function(err, permission) { if (err) return callback(err); if (!permission.authorized) { core.log.warn('principal: ' + principal.id + ' attempted unauthorized view of blob: ' + blob.id + ' with owner: ' + blob.owner); return callback(core.utils.authorizationError(permission)); } return callback(null); }); }; var create = function(principal, blob, stream, callback) { if (!core.config.blob_provider) return callback(core.utils.internalError('No blob provider configured.')); // TODO: authorization of principal to create blob here. core.config.blob_provider.create(blob, stream, function(err, blob) { if (err) return callback(err); blob.owner = principal; blob.id = new mongoose.Types.ObjectId(); blob.link = new mongoose.Types.ObjectId(); blob.url = core.config.blobs_endpoint + '/' + blob.id; blob.save(function(err, blob) { if (err) return callback(err); core.log.debug('created blob with id: ' + blob.id); callback(null, blob); }); }); }; var findById = function(blobId, callback) { core.models.Blob.findOne({"_id": blobId}, callback); }; var initialize = function(callback) { if (!core.config.blob_provider) return callback(); core.config.blob_provider.initialize(callback); }; var remove = function(principal, query, callback) { if (!principal || !principal.is('service')) { return callback(core.utils.authorizationError()); } core.models.Blob.find(query, function (err, blobs) { async.eachLimit(blobs, 50, function(blob, cb) { core.config.blob_provider.remove(blob, cb); }, function(err) { if (err) return callback(err); core.models.Blob.remove(query, callback); }); }); }; var stream = function(principal, blobId, stream, callback) { findById(blobId, function(err, blob) { if (err) return callback(err); if (!blob) return callback(core.utils.notFoundError()); canView(principal, blob, function(err) { if (err) return callback(err); core.config.blob_provider.stream(blob, stream, callback); }); }); }; module.exports = { create: create, findById: findById, initialize: initialize, remove: remove, stream: stream };