diff --git a/core/frontend/services/rendering/format-response.js b/core/frontend/services/rendering/format-response.js index 1ec9ca86b6..48d70d5cee 100644 --- a/core/frontend/services/rendering/format-response.js +++ b/core/frontend/services/rendering/format-response.js @@ -53,7 +53,8 @@ function formatResponse(post, context) { post: post }; - if (context?.includes('page')) { + // NOTE: preview context is a special case where the internal preview api returns the post model's type field + if (context?.includes('page') || (context?.includes('preview') && post.type === 'page')) { entry.page = post; } diff --git a/core/frontend/services/routing/controllers/previews.js b/core/frontend/services/routing/controllers/previews.js index d758f6d533..8769b999b6 100644 --- a/core/frontend/services/routing/controllers/previews.js +++ b/core/frontend/services/routing/controllers/previews.js @@ -40,7 +40,7 @@ module.exports = function previewController(req, res, next) { // @TODO: we don't know which resource type it is, because it's a generic preview handler and the // preview API returns {previews: []} // @TODO: figure out how to solve better - const resourceType = post.page ? 'page' : 'post'; + const resourceType = post.type; // CASE: last param of the url is /edit, redirect to admin return urlUtils.redirectToAdmin(302, res, `/#/editor/${resourceType}/${post.id}`); diff --git a/core/server/api/canary/utils/serializers/output/previews.js b/core/server/api/canary/utils/serializers/output/previews.js index 96f400209d..27c6e1eed5 100644 --- a/core/server/api/canary/utils/serializers/output/previews.js +++ b/core/server/api/canary/utils/serializers/output/previews.js @@ -12,6 +12,6 @@ module.exports = { frame.response = { previews: [data] }; - frame.response.previews[0].page = model.get('type') === 'page'; + frame.response.previews[0].type = model.get('type'); } }; diff --git a/test/e2e-frontend/preview_routes.test.js b/test/e2e-frontend/preview_routes.test.js index 77aece78e7..ec28e89db3 100644 --- a/test/e2e-frontend/preview_routes.test.js +++ b/test/e2e-frontend/preview_routes.test.js @@ -60,6 +60,24 @@ describe('Frontend Routing: Preview Routes', function () { }); }); + it('should redirect draft posts accessed via uuid and edit to admin post edit screen', async function () { + await request.get('/p/d52c42ae-2755-455c-80ec-70b2ec55c903/edit/') + .expect('Content-Type', /text\/plain/) + .expect(302) + .expect('Location', /ghost\/#\/editor\/post\/\w+/) + .expect('Cache-Control', testUtils.cacheRules.public) + .expect(assertCorrectFrontendHeaders); + }); + + it('should redirect draft page accessed via uuid and edit to admin page edit screen', async function () { + await request.get('/p/d52c42ae-2755-455c-80ec-70b2ec55c904/edit/') + .expect('Content-Type', /text\/plain/) + .expect(302) + .expect('Location', /ghost\/#\/editor\/page\/\w+/) + .expect('Cache-Control', testUtils.cacheRules.public) + .expect(assertCorrectFrontendHeaders); + }); + it('should redirect published posts to their live url', async function () { await request.get('/p/2ac6b4f6-e1f3-406c-9247-c94a0496d39d/') .expect(301) diff --git a/test/unit/api/canary/utils/serializers/output/previews.test.js b/test/unit/api/canary/utils/serializers/output/previews.test.js index 6732eb5f78..8b5b8dde7a 100644 --- a/test/unit/api/canary/utils/serializers/output/previews.test.js +++ b/test/unit/api/canary/utils/serializers/output/previews.test.js @@ -51,6 +51,6 @@ describe('Unit: canary/utils/serializers/output/previews', function () { mappers.posts.callCount.should.equal(1); mappers.posts.getCall(0).args.should.eql([ctrlResponse, frame, {tiers: []}]); - frame.response.previews[0].page.should.equal(true); + frame.response.previews[0].type.should.equal('page'); }); }); diff --git a/test/utils/fixtures/data-generator.js b/test/utils/fixtures/data-generator.js index 3614997b94..ce61c6c26c 100644 --- a/test/utils/fixtures/data-generator.js +++ b/test/utils/fixtures/data-generator.js @@ -80,7 +80,8 @@ DataGenerator.Content = { slug: 'static-page-draft', mobiledoc: DataGenerator.markdownToMobiledoc('
Hopefully you don\'t find it a bore.
'), type: 'page', - status: 'draft' + status: 'draft', + uuid: 'd52c42ae-2755-455c-80ec-70b2ec55c904' }, { id: '618ba1ffbe2896088840a6ed',