Skip to content

Commit

Permalink
Merge pull request #906 from pencilblue/feature/905
Browse files Browse the repository at this point in the history
Fixes #905 - Provides the ability for MediaProvider plugins to be site aware
  • Loading branch information
brianhyder committed Dec 15, 2015
2 parents ec34213 + cdba5fa commit ca7a65f
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 31 deletions.
2 changes: 1 addition & 1 deletion include/service/entities/content/content_object_service.js
Expand Up @@ -460,7 +460,7 @@ module.exports = function(pb) {
},
where: pb.DAO.getIdWhere(content.thumbnail)
};
var mediaService = new pb.MediaService();
var mediaService = new pb.MediaService(null, self.site, false);
mediaService.get(mOpts, function(err, media) {
callback(err, util.isNullOrUndefined(media) ? '' : media.location);
});
Expand Down
72 changes: 54 additions & 18 deletions include/service/entities/media_service.js
Expand Up @@ -37,29 +37,44 @@ module.exports = function MediaServiceModule(pb) {
* or fallback to global if not found in specified site
*/
function MediaService(provider, site, onlyThisSite) {

/**
* @property site
* @type {String}
*/
this.site = pb.SiteService.getCurrentSite(site);
this.siteQueryService = new pb.SiteQueryService({site: this.site, onlyThisSite: onlyThisSite});

var context = {
site: this.site,
onlyThisSite: onlyThisSite
};

/**
* @property siteQueryService
* @type {SiteQueryService}
*/
this.siteQueryService = new pb.SiteQueryService(context);

if (util.isNullOrUndefined(provider)) {
provider = MediaService.loadMediaProvider();
provider = MediaService.loadMediaProvider(context);
}
if (!provider) {
throw new Error('A valid media provider is required. Please check your configuration');
}

/**
*
* @property provider
* @type {MediaProvider}
*/
this.provider = provider;
}

/**
*
* @deprecated
* @private
* @static
* @property INSTANCE
* @
* @type {MediaProvider}
*/
var INSTANCE = null;

Expand All @@ -71,6 +86,17 @@ module.exports = function MediaServiceModule(pb) {
* @type {String}
*/
MediaService.COLL = 'media';

/**
* @private
* @static
* @property MEDIA_PROVIDERS
* @type {Object}
*/
var MEDIA_PROVIDERS = Object.freeze({
fs: pb.media.providers.FsMediaProvider,
mongo: pb.media.providers.MongoMediaProvider
});

/**
* Contains the list of media renderers
Expand Down Expand Up @@ -881,16 +907,19 @@ module.exports = function MediaServiceModule(pb) {

/**
* Retrieves the singleton instance of MediaProvider.
* @deprecated
* @static
* @method getInstance
* @param {Object} [context]
* @return {MediaProvider}
*/
MediaService.getInstance = function() {
MediaService.getInstance = function(context) {
pb.log.warn('MediaService: the "getInstance" function is deprecated as of 0.5.0 and will be removed in the next version');
if (INSTANCE) {
return INSTANCE;
}

INSTANCE = MediaService.loadMediaProvider();
INSTANCE = MediaService.loadMediaProvider(context || {});
if (INSTANCE === null) {
throw new Error('A valid media provider was not available: PROVIDER_PATH: '+pb.config.media.provider+' TRIED='+JSON.stringify(paths));
}
Expand All @@ -900,30 +929,37 @@ module.exports = function MediaServiceModule(pb) {
*
* @static
* @method loadMediaProvider
* @param {Object} context
* @param {String} context.site
* @return {MediaProvider} An instance of a media provider or NULL when no
* provider can be loaded.
*/
MediaService.loadMediaProvider = function() {
if (pb.config.media.provider === 'fs') {
return new pb.media.providers.FsMediaProvider(pb.config.media.parent_dir);
MediaService.loadMediaProvider = function(context) {
var ProviderType = MEDIA_PROVIDERS[pb.config.media.provider];
if (util.isNullOrUndefined(ProviderType)) {
ProviderType = MediaService.findProviderType();
}
else if (pb.config.media.provider === 'mongo') {
return new pb.media.providers.MongoMediaProvider();
}

return !!ProviderType ? new ProviderType(context) : null;
};

/**
* Looks up the prototype for the media provider based on the configuration
* @static
* @method findProviderType
* @return {MediaProvider}
*/
MediaService.findProviderType = function() {
var instance = null;
var paths = [path.join(pb.config.docRoot, pb.config.media.provider), pb.config.media.provider];
for(var i = 0; i < paths.length; i++) {
try{
var ProviderType = require(paths[i])(pb);
instance = new ProviderType();
break;
return require(paths[i])(pb);
}
catch(e){
pb.log.silly(e.stack);
}
}
return instance;
return null;
};

//exports
Expand Down
7 changes: 5 additions & 2 deletions include/service/media/fs_media_provider.js
Expand Up @@ -29,9 +29,12 @@ module.exports = function FsMediaProviderModule(pb) {
* storage.
* @class FsMediaProvider
* @constructor
* @param {Object} context
* @param {String} [context.parentDir]
* @param {String} context.site
*/
function FsMediaProvider(parentDir) {
this.parentDir = parentDir || pb.config.media.parent_dir;
function FsMediaProvider(context) {
this.parentDir = context.parentDir || pb.config.media.parent_dir;
};

/**
Expand Down
4 changes: 3 additions & 1 deletion include/service/media/mongo_media_provider.js
Expand Up @@ -26,8 +26,10 @@ module.exports = function MongoMediaProviderModule(pb) {
* A media provider that uses Mongo's GridFS as the method of storage.
* @class MongoMediaProvider
* @constructor
* @param {Object} context
* @param {String} context.site
*/
function MongoMediaProvider() {};
function MongoMediaProvider(/*context*/) {};

/**
* Retrieves the item in GridFS as a stream.
Expand Down
25 changes: 23 additions & 2 deletions plugins/pencilblue/controllers/api/admin/content/media/get_link.js
Expand Up @@ -28,6 +28,28 @@ module.exports = function(pb) {
*/
function GetMediaLinkApiController(){}
util.inherits(GetMediaLinkApiController, pb.BaseController);

/**
* Initializes the controller
* @method init
* @param {Object} context
* @param {Function} cb
*/
GetMediaLinkApiController.prototype.init = function(context, cb) {
var self = this;
var init = function(err) {

/**
* An instance of MediaService that leverages the default media provider
* @property service
* @type {TopicService}
*/
self.service = new pb.MediaService(null, context.site, true);

cb(err, true);
};
GetMediaLinkApiController.super_.prototype.init.apply(this, [context, init]);
};

/**
* Inspects the provided URL and returns a media descriptor for the URL. If
Expand All @@ -46,8 +68,7 @@ module.exports = function(pb) {
});
}

var service = new pb.MediaService();
service.getMediaDescriptor(get.url, function(err, descriptor) {
this.service.getMediaDescriptor(get.url, function(err, descriptor) {
if (util.isError(err)) {
return self.reqHandler.serveError(err);
}
Expand Down
Expand Up @@ -41,6 +41,28 @@ module.exports = function(pb) {
this.errored = 0;
}
util.inherits(UploadMediaController, pb.BaseController);

/**
* Initializes the controller
* @method init
* @param {Object} context
* @param {Function} cb
*/
UploadMediaController.prototype.init = function(context, cb) {
var self = this;
var init = function(err) {

/**
* An instance of MediaService that leverages the default media provider
* @property service
* @type {TopicService}
*/
self.service = new pb.MediaService(null, context.site, true);

cb(err, true);
};
UploadMediaController.super_.prototype.init.apply(this, [context, init]);
};


UploadMediaController.prototype.render = function(cb) {
Expand Down Expand Up @@ -70,8 +92,7 @@ module.exports = function(pb) {
var fileDescriptor = files[keys[0]];

var stream = fs.createReadStream(fileDescriptor.path);
var mservice = new pb.MediaService();
mservice.setContentStream(stream, fileDescriptor.name, function(err, sresult) {
self.service.setContentStream(stream, fileDescriptor.name, function(err, sresult) {
if (util.isError(err)) {
return self.onDone(err, null, files, cb);
}
Expand Down
31 changes: 26 additions & 5 deletions plugins/pencilblue/controllers/media_content_controller.js
Expand Up @@ -15,7 +15,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

module.exports = function MediaContentController(pb) {
module.exports = function (pb) {

//pb dependencies
var util = pb.util;
Expand All @@ -29,10 +29,32 @@ module.exports = function MediaContentController(pb) {
*/
function MediaContentController() {};
util.inherits(MediaContentController, pb.BaseController);

/**
* Initializes the controller
* @method init
* @param {Object} context
* @param {Function} cb
*/
MediaContentController.prototype.init = function(context, cb) {
var self = this;
var init = function(err) {

/**
* An instance of MediaService that leverages the default media provider
* @property service
* @type {TopicService}
*/
self.service = new pb.MediaService(null, context.site, true);

cb(err, true);
};
MediaContentController.super_.prototype.init.apply(this, [context, init]);
};

/**
*
*
* @method render
* @param {Function} cb
*/
MediaContentController.prototype.render = function(cb) {
var self = this;
Expand All @@ -44,8 +66,7 @@ module.exports = function MediaContentController(pb) {

//load the media if available
var mediaPath = this.req.url;
var mservice = new pb.MediaService();
mservice.getContentStreamByPath(mediaPath, function(err, mstream) {
this.service.getContentStreamByPath(mediaPath, function(err, mstream) {
if(util.isError(err)) {
return self.reqHandler.serveError(err);
}
Expand Down

0 comments on commit ca7a65f

Please sign in to comment.