From 6421e202e5c36001645ef382b9b94a3fb51e1eee Mon Sep 17 00:00:00 2001 From: Naz Date: Mon, 12 Jun 2023 12:08:37 +0700 Subject: [PATCH] Removed API endpoints adding posts to collections closes https://github.com/TryGhost/Team/issues/3431 - We don't currently have a clear usecase to use the new pattern of updating posts as nested resource (of a collection). To simplify the API we are sticking with the approach of controlling where the post belongs to only through the Posts Admin API. --- .../core/server/api/endpoints/collections.js | 76 -- .../server/web/api/endpoints/admin/routes.js | 2 - .../__snapshots__/collections.test.js.snap | 808 ------------------ .../test/e2e-api/admin/collections.test.js | 102 --- 4 files changed, 988 deletions(-) diff --git a/ghost/core/core/server/api/endpoints/collections.js b/ghost/core/core/server/api/endpoints/collections.js index 6ddb1c8ae1..60e454bf53 100644 --- a/ghost/core/core/server/api/endpoints/collections.js +++ b/ghost/core/core/server/api/endpoints/collections.js @@ -96,47 +96,6 @@ module.exports = { } }, - addPost: { - statusCode: 200, - headers: { - cacheInvalidate: false - }, - options: [ - 'id' - ], - data: [ - 'post_id' - ], - validation: { - options: { - id: { - required: true - } - }, - data: { - post_id: { - required: true - } - } - }, - permissions: { - method: 'edit' - }, - async query(frame) { - const collectionPost = await collectionsService.api.addPostToCollection(frame.options.id, { - id: frame.data.posts[0].id - }); - - if (!collectionPost) { - throw new errors.NotFoundError({ - message: tpl(messages.collectionNotFound) - }); - } - - return collectionPost; - } - }, - destroy: { statusCode: 204, headers: { @@ -156,40 +115,5 @@ module.exports = { async query(frame) { return await collectionsService.api.destroy(frame.options.id); } - }, - - destroyPost: { - statusCode: 200, - headers: { - cacheInvalidate: true - }, - options: [ - 'id', - 'post_id' - ], - validation: { - options: { - id: { - required: true - }, - post_id: { - required: true - } - } - }, - permissions: { - method: 'edit' - }, - async query(frame) { - const collection = await collectionsService.api.removePostFromCollection(frame.options.id, frame.options.post_id); - - if (!collection) { - throw new errors.NotFoundError({ - message: tpl(messages.collectionNotFound) - }); - } - - return collection; - } } }; diff --git a/ghost/core/core/server/web/api/endpoints/admin/routes.js b/ghost/core/core/server/web/api/endpoints/admin/routes.js index 2f790ccf8b..fa3088ed8e 100644 --- a/ghost/core/core/server/web/api/endpoints/admin/routes.js +++ b/ghost/core/core/server/web/api/endpoints/admin/routes.js @@ -24,8 +24,6 @@ module.exports = function apiRoutes() { router.post('/collections', mw.authAdminApi, labs.enabledMiddleware('collections'), http(api.collections.add)); router.put('/collections/:id', mw.authAdminApi, labs.enabledMiddleware('collections'), http(api.collections.edit)); router.del('/collections/:id', mw.authAdminApi, labs.enabledMiddleware('collections'), http(api.collections.destroy)); - router.post('/collections/:id/posts', mw.authAdminApi, labs.enabledMiddleware('collections'), http(api.collections.addPost)); - router.del('/collections/:id/posts/:post_id', mw.authAdminApi, labs.enabledMiddleware('collections'), http(api.collections.destroyPost)); // ## Configuration router.get('/config', mw.authAdminApi, http(api.config.read)); diff --git a/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap b/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap index b35659e8ed..d5de4bc9dd 100644 --- a/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap +++ b/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap @@ -319,69 +319,6 @@ Object { } `; -exports[`Collections API Can edit a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "title": "Test Collection to Edit", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can edit a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "235", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/collections\\\\/\\[a-f0-9\\]\\{24\\}\\\\//, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Can edit a Collection 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can edit a Collection 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "234", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - exports[`Collections API Can read a Collection 1: [body] 1`] = ` Object { "collections": Array [ @@ -477,191 +414,6 @@ Object { } `; -exports[`Collections API Edit Can add Posts and append Post to a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 0, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 1, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 2, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "391", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 0, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 1, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 2, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "391", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 5: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 6: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "440", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 7: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Edit Can add Posts and append Post to a Collection 8: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "440", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - exports[`Collections API Edit Can edit a Collection 1: [body] 1`] = ` Object { "collections": Array [ @@ -694,99 +446,6 @@ Object { } `; -exports[`Collections API Edit Can remove a Post from a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Edit Can remove a Post from a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "440", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Edit Can remove a Post from a Collection 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Edit Can remove a Post from a Collection 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "391", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - exports[`Collections API Edit Fails to edit unexistent Collection 1: [body] 1`] = ` Object { "errors": Array [ @@ -817,470 +476,3 @@ Object { "x-powered-by": "Express", } `; - -exports[`Collections API Fails to edit unexistent Collection 1: [body] 1`] = ` -Object { - "errors": Array [ - Object { - "code": null, - "context": "Collection not found.", - "details": null, - "ghostErrorCode": null, - "help": null, - "id": StringMatching /\\[a-f0-9\\]\\{8\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{12\\}/, - "message": "Resource not found error, cannot edit collection.", - "property": null, - "type": "NotFoundError", - }, - ], -} -`; - -exports[`Collections API Fails to edit unexistent Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "254", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 0, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 1, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 2, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "391", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 0, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 1, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": 2, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "391", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 5: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 6: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "440", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 7: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can add Posts and append Post to a Collection 8: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "440", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can add a Post to a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can add a Post to a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "346", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can add a Post to a Collection 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can add a Post to a Collection 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "346", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can edit a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can edit a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "245", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can remove a Post from a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can remove a Post from a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "440", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can remove a Post from a Collection 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "posts": Array [ - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - Object { - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "sort_order": Any, - }, - ], - "title": "Test Collection Edited", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API edit Can remove a Post from a Collection 3: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Can remove a Post from a Collection 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "391", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API edit Fails to edit unexistent Collection 1: [body] 1`] = ` -Object { - "errors": Array [ - Object { - "code": null, - "context": "Collection not found.", - "details": null, - "ghostErrorCode": null, - "help": null, - "id": StringMatching /\\[a-f0-9\\]\\{8\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{12\\}/, - "message": "Resource not found error, cannot edit collection.", - "property": null, - "type": "NotFoundError", - }, - ], -} -`; - -exports[`Collections API edit Fails to edit unexistent Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "254", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; diff --git a/ghost/core/test/e2e-api/admin/collections.test.js b/ghost/core/test/e2e-api/admin/collections.test.js index 001edf013c..5cd0549352 100644 --- a/ghost/core/test/e2e-api/admin/collections.test.js +++ b/ghost/core/test/e2e-api/admin/collections.test.js @@ -185,108 +185,6 @@ describe('Collections API', function () { etag: anyEtag }); }); - - it('Can add Posts and append Post to a Collection', async function () { - const postsToAttach = [{ - id: fixtureManager.get('posts', 0).id - }, { - id: fixtureManager.get('posts', 2).id - }, { - id: fixtureManager.get('posts', 3).id - }]; - - const collectionId = collectionToEdit.id; - - const editResponse = await agent - .put(`/collections/${collectionId}/`) - .body({ - collections: [{ - posts: postsToAttach - }] - }) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [buildMatcher(3)] - }); - - assert.equal(editResponse.body.collections[0].posts.length, 3, 'Posts should have been added to a Collection'); - - // verify the posts are persisted across requests - let readResponse = await agent - .get(`/collections/${collectionId}/`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [buildMatcher(3)] - }); - - assert.equal(readResponse.body.collections[0].posts.length, 3, 'Posts should have been added to a Collection'); - - //adds a single Post to existing Posts attached to a Collection - await agent - .post(`/collections/${collectionId}/posts`) - .body({ - posts: [{ - id: fixtureManager.get('posts', 4).id - }] - }) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [buildMatcher(4, {withSortOrder: true})] - }); - - // verify the posts are persisted across requests - readResponse = await agent - .get(`/collections/${collectionId}/`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [buildMatcher(4, {withSortOrder: true})] - }); - - assert.equal(readResponse.body.collections[0].posts.length, 4, 'Post should have been added to a Collection'); - }); - - it('Can remove a Post from a Collection', async function () { - const collectionId = collectionToEdit.id; - const readResponse = await agent - .get(`/collections/${collectionId}/`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [buildMatcher(4, {withSortOrder: true})] - }); - - const postIdToRemove = readResponse.body.collections[0].posts[0]?.id; - - await agent - .delete(`/collections/${collectionId}/posts/${postIdToRemove}`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [buildMatcher(3, {withSortOrder: true})] - }); - }); }); it('Can delete a Collection', async function () {