mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-04 17:04:59 +03:00
Extended resource lookup in {{get}} helper
refs #10061 - prep task to add authors for content API
This commit is contained in:
parent
3345618731
commit
46c806358b
@ -12,12 +12,33 @@ var proxy = require('./proxy'),
|
|||||||
|
|
||||||
api = proxy.api,
|
api = proxy.api,
|
||||||
labs = proxy.labs,
|
labs = proxy.labs,
|
||||||
resources,
|
|
||||||
pathAliases,
|
pathAliases,
|
||||||
get;
|
get;
|
||||||
|
|
||||||
// Endpoints that the helper is able to access
|
/**
|
||||||
resources = ['posts', 'tags', 'users', 'pages'];
|
* v0.1: users, posts, tags
|
||||||
|
* v2: authors, pages, posts, tags
|
||||||
|
*
|
||||||
|
* @NOTE: if you use "users" in v2, we should fallback to authors
|
||||||
|
*/
|
||||||
|
const RESOURCES = {
|
||||||
|
posts: {
|
||||||
|
alias: 'posts',
|
||||||
|
resource: 'posts'
|
||||||
|
},
|
||||||
|
tags: {
|
||||||
|
alias: 'tags',
|
||||||
|
resource: 'tags'
|
||||||
|
},
|
||||||
|
users: {
|
||||||
|
alias: 'authors',
|
||||||
|
resource: 'users'
|
||||||
|
},
|
||||||
|
pages: {
|
||||||
|
alias: 'pages',
|
||||||
|
resource: 'posts'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Short forms of paths which we should understand
|
// Short forms of paths which we should understand
|
||||||
pathAliases = {
|
pathAliases = {
|
||||||
@ -32,7 +53,7 @@ pathAliases = {
|
|||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
function isBrowse(resource, options) {
|
function isBrowse(options) {
|
||||||
var browse = true;
|
var browse = true;
|
||||||
|
|
||||||
if (options.id || options.slug) {
|
if (options.id || options.slug) {
|
||||||
@ -108,7 +129,6 @@ get = function get(resource, options) {
|
|||||||
const data = createFrame(options.data);
|
const data = createFrame(options.data);
|
||||||
const apiVersion = data.root._locals.apiVersion;
|
const apiVersion = data.root._locals.apiVersion;
|
||||||
let apiOptions = options.hash;
|
let apiOptions = options.hash;
|
||||||
let apiMethod;
|
|
||||||
|
|
||||||
if (!options.fn) {
|
if (!options.fn) {
|
||||||
data.error = i18n.t('warnings.helpers.mustBeCalledAsBlock', {helperName: 'get'});
|
data.error = i18n.t('warnings.helpers.mustBeCalledAsBlock', {helperName: 'get'});
|
||||||
@ -116,18 +136,19 @@ get = function get(resource, options) {
|
|||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_.includes(resources, resource)) {
|
if (!RESOURCES[resource]) {
|
||||||
data.error = i18n.t('warnings.helpers.get.invalidResource');
|
data.error = i18n.t('warnings.helpers.get.invalidResource');
|
||||||
logging.warn(data.error);
|
logging.warn(data.error);
|
||||||
return Promise.resolve(options.inverse(self, {data: data}));
|
return Promise.resolve(options.inverse(self, {data: data}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine if this is a read or browse
|
const controller = api[apiVersion][RESOURCES[resource].alias] ? RESOURCES[resource].alias : RESOURCES[resource].resource;
|
||||||
apiMethod = isBrowse(resource, apiOptions) ? api[apiVersion][resource].browse : api[apiVersion][resource].read;
|
const action = isBrowse(apiOptions) ? 'browse' : 'read';
|
||||||
|
|
||||||
// Parse the options we're going to pass to the API
|
// Parse the options we're going to pass to the API
|
||||||
apiOptions = parseOptions(this, apiOptions);
|
apiOptions = parseOptions(this, apiOptions);
|
||||||
|
|
||||||
return apiMethod(apiOptions).then(function success(result) {
|
return api[apiVersion][controller][action](apiOptions).then(function success(result) {
|
||||||
var blockParams;
|
var blockParams;
|
||||||
|
|
||||||
// block params allows the theme developer to name the data using something like
|
// block params allows the theme developer to name the data using something like
|
||||||
|
@ -56,7 +56,7 @@ describe('{{#get}} helper', function () {
|
|||||||
}).catch(done);
|
}).catch(done);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('posts', function () {
|
describe('posts v0.1', function () {
|
||||||
var browsePostsStub, readPostsStub, readTagsStub, readUsersStub, testPostsArr = [
|
var browsePostsStub, readPostsStub, readTagsStub, readUsersStub, testPostsArr = [
|
||||||
{id: 1, title: 'Test Post 1', author: {slug: 'cameron'}},
|
{id: 1, title: 'Test Post 1', author: {slug: 'cameron'}},
|
||||||
{id: 2, title: 'Test Post 2', author: {slug: 'cameron'}, featured: true},
|
{id: 2, title: 'Test Post 2', author: {slug: 'cameron'}, featured: true},
|
||||||
@ -256,6 +256,65 @@ describe('{{#get}} helper', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('users v0.1', function () {
|
||||||
|
let browseUsersStub;
|
||||||
|
const meta = {pagination: {}};
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
browseUsersStub = sandbox.stub(api["v0.1"].users, 'browse');
|
||||||
|
browseUsersStub.returns(new Promise.resolve({users: [], meta: meta}));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('browse users v0.1', function (done) {
|
||||||
|
helpers.get.call(
|
||||||
|
{},
|
||||||
|
'users',
|
||||||
|
{hash: {}, data: locals, fn: fn, inverse: inverse}
|
||||||
|
).then(function () {
|
||||||
|
labsStub.calledOnce.should.be.true();
|
||||||
|
|
||||||
|
fn.called.should.be.true();
|
||||||
|
fn.firstCall.args[0].should.be.an.Object().with.property('users');
|
||||||
|
fn.firstCall.args[0].users.should.eql([]);
|
||||||
|
inverse.called.should.be.false();
|
||||||
|
|
||||||
|
done();
|
||||||
|
}).catch(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('users v2', function () {
|
||||||
|
let browseUsersStub;
|
||||||
|
const meta = {pagination: {}};
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
locals = {root: {_locals: {apiVersion: 'v2'}}};
|
||||||
|
|
||||||
|
browseUsersStub = sandbox.stub(api["v2"], 'users').get(() => {
|
||||||
|
return {
|
||||||
|
browse: sandbox.stub().resolves({users: [], meta: meta})
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('browse users', function (done) {
|
||||||
|
helpers.get.call(
|
||||||
|
{},
|
||||||
|
'users',
|
||||||
|
{hash: {}, data: locals, fn: fn, inverse: inverse}
|
||||||
|
).then(function () {
|
||||||
|
labsStub.calledOnce.should.be.true();
|
||||||
|
|
||||||
|
fn.called.should.be.true();
|
||||||
|
fn.firstCall.args[0].should.be.an.Object().with.property('users');
|
||||||
|
fn.firstCall.args[0].users.should.eql([]);
|
||||||
|
inverse.called.should.be.false();
|
||||||
|
|
||||||
|
done();
|
||||||
|
}).catch(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('general error handling', function () {
|
describe('general error handling', function () {
|
||||||
it('should return an error for an unknown resource', function (done) {
|
it('should return an error for an unknown resource', function (done) {
|
||||||
helpers.get.call(
|
helpers.get.call(
|
||||||
|
Loading…
Reference in New Issue
Block a user