From 755a3a320eca8f45aab549aad96226bb8d712d80 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 3 Aug 2021 10:15:49 +0400 Subject: [PATCH] Added email_only column to posts_meta table closes https://github.com/TryGhost/Team/issues/893 - We need a place to store email-only flag and posts_meta is the best place for it --- .../api/canary/utils/serializers/output/utils/mapper.js | 4 +++- .../4.12/01-add-email-only-column-to-posts-meta-table.js | 7 +++++++ core/server/data/schema/schema.js | 3 ++- core/server/models/posts-meta.js | 6 ++++++ test/api-acceptance/admin/posts.test.js | 2 ++ test/api-acceptance/admin/utils.js | 3 ++- test/unit/data/schema/integrity.test.js | 2 +- 7 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js diff --git a/core/server/api/canary/utils/serializers/output/utils/mapper.js b/core/server/api/canary/utils/serializers/output/utils/mapper.js index 0b74123620..873fd75ce4 100644 --- a/core/server/api/canary/utils/serializers/output/utils/mapper.js +++ b/core/server/api/canary/utils/serializers/output/utils/mapper.js @@ -52,7 +52,8 @@ const mapPost = (model, frame) => { _(metaAttrs).filter((k) => { return (!frame.options.columns || (frame.options.columns && frame.options.columns.includes(k))); }).each((attr) => { - jsonModel[attr] = _.get(jsonModel.posts_meta, attr) || null; + const defaultValue = (attr === 'email_only') ? false : null; + jsonModel[attr] = _.get(jsonModel.posts_meta, attr) || defaultValue; }); delete jsonModel.posts_meta; @@ -89,6 +90,7 @@ const mapPage = (model, frame) => { delete jsonModel.email_subject; delete jsonModel.email_recipient_filter; + delete jsonModel.email_only; return jsonModel; }; diff --git a/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js b/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js new file mode 100644 index 0000000000..16bf97b9dc --- /dev/null +++ b/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js @@ -0,0 +1,7 @@ +const {createAddColumnMigration} = require('../../utils'); + +module.exports = createAddColumnMigration('posts_meta', 'email_only', { + type: 'bool', + nullable: false, + defaultTo: false +}); diff --git a/core/server/data/schema/schema.js b/core/server/data/schema/schema.js index 92abcf0c81..7069a9bf7b 100644 --- a/core/server/data/schema/schema.js +++ b/core/server/data/schema/schema.js @@ -74,7 +74,8 @@ module.exports = { email_subject: {type: 'string', maxlength: 300, nullable: true}, frontmatter: {type: 'text', maxlength: 65535, nullable: true}, feature_image_alt: {type: 'string', maxlength: 191, nullable: true, validations: {isLength: {max: 125}}}, - feature_image_caption: {type: 'text', maxlength: 65535, nullable: true} + feature_image_caption: {type: 'text', maxlength: 65535, nullable: true}, + email_only: {type: 'bool', nullable: false, defaultTo: false} }, users: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, diff --git a/core/server/models/posts-meta.js b/core/server/models/posts-meta.js index d270573b21..cd682a1313 100644 --- a/core/server/models/posts-meta.js +++ b/core/server/models/posts-meta.js @@ -4,6 +4,12 @@ const urlUtils = require('../../shared/url-utils'); const PostsMeta = ghostBookshelf.Model.extend({ tableName: 'posts_meta', + defaults: function defaults() { + return { + email_only: false + }; + }, + formatOnWrite(attrs) { ['og_image', 'twitter_image'].forEach((attr) => { if (attrs[attr]) { diff --git a/test/api-acceptance/admin/posts.test.js b/test/api-acceptance/admin/posts.test.js index ef7cfe1bc2..6052f76507 100644 --- a/test/api-acceptance/admin/posts.test.js +++ b/test/api-acceptance/admin/posts.test.js @@ -39,6 +39,8 @@ describe('Posts API', function () { localUtils.API.checkResponse(jsonResponse.posts[0], 'post'); localUtils.API.checkResponse(jsonResponse.meta.pagination, 'pagination'); _.isBoolean(jsonResponse.posts[0].featured).should.eql(true); + _.isBoolean(jsonResponse.posts[0].email_only).should.eql(true); + jsonResponse.posts[0].email_only.should.eql(false); // Ensure default order jsonResponse.posts[0].slug.should.eql('scheduled-post'); diff --git a/test/api-acceptance/admin/utils.js b/test/api-acceptance/admin/utils.js index f958c6ab32..04e22a26a0 100644 --- a/test/api-acceptance/admin/utils.js +++ b/test/api-acceptance/admin/utils.js @@ -69,7 +69,8 @@ const expectedProperties = { 'meta_title', 'meta_description', 'email_subject', - 'frontmatter' + 'frontmatter', + 'email_only' ], page: [ diff --git a/test/unit/data/schema/integrity.test.js b/test/unit/data/schema/integrity.test.js index 61eaa269bb..32cfddec82 100644 --- a/test/unit/data/schema/integrity.test.js +++ b/test/unit/data/schema/integrity.test.js @@ -32,7 +32,7 @@ const defaultSettings = require('../../../../core/server/data/schema/default-set */ describe('DB version integrity', function () { // Only these variables should need updating - const currentSchemaHash = 'a2248eaa72a9d08c3753b90a9436dbe3'; + const currentSchemaHash = '6becb030fb054078d95f927bcfcd4f5e'; const currentFixturesHash = '97283c575b1f6c84c27db6e1b1be21d4'; const currentSettingsHash = 'aa3fcbc8ab119b630aeda7366ead5493'; const currentRoutesHash = '3d180d52c663d173a6be791ef411ed01';