From 1f7473dbe71f060c727f0e475fc3241bde9a73c8 Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 01:59:14 +0000 Subject: [PATCH 01/10] Added email_templates table migration ref NY-1137 Stores design settings for email templates, initially for welcome emails --- ...3-26-01-56-35-add-email-templates-table.js | 24 +++++++++++++++++++ .../integration/exporter/exporter.test.js | 1 + 2 files changed, 25 insertions(+) create mode 100644 ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js new file mode 100644 index 00000000000..5cf88bc9f75 --- /dev/null +++ b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js @@ -0,0 +1,24 @@ +const {addTable} = require('../../utils'); + +module.exports = addTable('email_templates', { + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'light'}, + header_background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'transparent'}, + header_image: {type: 'string', maxlength: 2000, nullable: true}, + show_header_title: {type: 'boolean', nullable: false, defaultTo: true}, + footer_content: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, + button_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'accent'}, + button_corners: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'rounded'}, + button_style: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'fill'}, + link_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'accent'}, + link_style: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'underline'}, + body_font_category: {type: 'string', maxlength: 191, nullable: false, defaultTo: 'sans_serif'}, + title_font_category: {type: 'string', maxlength: 191, nullable: false, defaultTo: 'sans_serif'}, + title_font_weight: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'bold'}, + image_corners: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'square'}, + divider_color: {type: 'string', maxlength: 50, nullable: true}, + section_title_color: {type: 'string', maxlength: 50, nullable: true}, + show_badge: {type: 'boolean', nullable: false, defaultTo: true}, + created_at: {type: 'dateTime', nullable: false}, + updated_at: {type: 'dateTime', nullable: true} +}); diff --git a/ghost/core/test/integration/exporter/exporter.test.js b/ghost/core/test/integration/exporter/exporter.test.js index a467f575be1..6590e4f655a 100644 --- a/ghost/core/test/integration/exporter/exporter.test.js +++ b/ghost/core/test/integration/exporter/exporter.test.js @@ -41,6 +41,7 @@ describe('Exporter', function () { 'email_recipient_failures', 'email_recipients', 'email_spam_complaint_events', + 'email_templates', 'emails', 'integrations', 'invites', From c869c7e0422ee6b3e54c819851cd03bbe4bd41f2 Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 02:48:50 +0000 Subject: [PATCH 02/10] Aligned email_templates column types with newsletters table ref NY-1137 Added isIn validations, fixed nullable on button_color/link_color, removed fieldtype from footer_content --- .../6.23/2026-03-26-01-56-35-add-email-templates-table.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js index 5cf88bc9f75..55ebfca82da 100644 --- a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js +++ b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js @@ -6,11 +6,11 @@ module.exports = addTable('email_templates', { header_background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'transparent'}, header_image: {type: 'string', maxlength: 2000, nullable: true}, show_header_title: {type: 'boolean', nullable: false, defaultTo: true}, - footer_content: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, - button_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'accent'}, + footer_content: {type: 'text', maxlength: 1000000000, nullable: true}, + button_color: {type: 'string', maxlength: 50, nullable: true, defaultTo: 'accent'}, button_corners: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'rounded'}, button_style: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'fill'}, - link_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'accent'}, + link_color: {type: 'string', maxlength: 50, nullable: true, defaultTo: 'accent'}, link_style: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'underline'}, body_font_category: {type: 'string', maxlength: 191, nullable: false, defaultTo: 'sans_serif'}, title_font_category: {type: 'string', maxlength: 191, nullable: false, defaultTo: 'sans_serif'}, From 891eaa9e4caf6bec312147e4dc6f78dd787147fb Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 05:09:02 +0000 Subject: [PATCH 03/10] Added slug column to email_templates table --- .../6.23/2026-03-26-01-56-35-add-email-templates-table.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js index 55ebfca82da..3c2c5dfc811 100644 --- a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js +++ b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js @@ -2,6 +2,7 @@ const {addTable} = require('../../utils'); module.exports = addTable('email_templates', { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'light'}, header_background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'transparent'}, header_image: {type: 'string', maxlength: 2000, nullable: true}, From c1045b9fb441496c3f2c091702f6e42ccda20efe Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 05:41:04 +0000 Subject: [PATCH 04/10] Renamed email_templates table to email_design_settings --- ...s => 2026-03-26-01-56-35-add-email-design-settings-table.js} | 2 +- ghost/core/test/integration/exporter/exporter.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename ghost/core/core/server/data/migrations/versions/6.23/{2026-03-26-01-56-35-add-email-templates-table.js => 2026-03-26-01-56-35-add-email-design-settings-table.js} (97%) diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js similarity index 97% rename from ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js rename to ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js index 3c2c5dfc811..63aff36bed2 100644 --- a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-templates-table.js +++ b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js @@ -1,6 +1,6 @@ const {addTable} = require('../../utils'); -module.exports = addTable('email_templates', { +module.exports = addTable('email_design_settings', { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'light'}, diff --git a/ghost/core/test/integration/exporter/exporter.test.js b/ghost/core/test/integration/exporter/exporter.test.js index 6590e4f655a..551fa187d92 100644 --- a/ghost/core/test/integration/exporter/exporter.test.js +++ b/ghost/core/test/integration/exporter/exporter.test.js @@ -41,7 +41,7 @@ describe('Exporter', function () { 'email_recipient_failures', 'email_recipients', 'email_spam_complaint_events', - 'email_templates', + 'email_design_settings', 'emails', 'integrations', 'invites', From 061c5ce9c3d8534c9358afebe7d4f5180ff9e47c Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 05:53:41 +0000 Subject: [PATCH 05/10] Inserted default email_design_settings row and added model + fixture ref NY-1179 --- ...nsert-default-email-design-settings-row.js | 42 +++++++++++++++++++ .../server/data/schema/fixtures/fixtures.json | 8 ++++ .../server/models/email-design-setting.js | 30 +++++++++++++ .../unit/server/data/schema/integrity.test.js | 2 +- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js create mode 100644 ghost/core/core/server/models/email-design-setting.js diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js new file mode 100644 index 00000000000..b240df2bc83 --- /dev/null +++ b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js @@ -0,0 +1,42 @@ +const logging = require('@tryghost/logging'); +const {default: ObjectID} = require('bson-objectid'); +const {createTransactionalMigration} = require('../../utils'); + +const DEFAULT_SLUG = 'default-automated-email'; + +module.exports = createTransactionalMigration( + async function up(knex) { + logging.info('Inserting default email_design_settings row'); + + const existing = await knex('email_design_settings').where({slug: DEFAULT_SLUG}).first(); + + if (existing) { + logging.warn('Default email_design_settings row already exists, skipping'); + return; + } + + await knex('email_design_settings').insert({ + id: (new ObjectID()).toHexString(), + slug: DEFAULT_SLUG, + background_color: 'light', + header_background_color: 'transparent', + show_header_title: true, + button_color: 'accent', + button_corners: 'rounded', + button_style: 'fill', + link_color: 'accent', + link_style: 'underline', + body_font_category: 'sans_serif', + title_font_category: 'sans_serif', + title_font_weight: 'bold', + image_corners: 'square', + show_badge: true, + created_at: knex.raw('current_timestamp') + }); + }, + async function down(knex) { + logging.info('Deleting default email_design_settings row'); + + await knex('email_design_settings').where({slug: DEFAULT_SLUG}).del(); + } +); diff --git a/ghost/core/core/server/data/schema/fixtures/fixtures.json b/ghost/core/core/server/data/schema/fixtures/fixtures.json index ca4818246c4..4f2c6e08f66 100644 --- a/ghost/core/core/server/data/schema/fixtures/fixtures.json +++ b/ghost/core/core/server/data/schema/fixtures/fixtures.json @@ -51,6 +51,14 @@ } ] }, + { + "name": "EmailDesignSetting", + "entries": [ + { + "slug": "default-automated-email" + } + ] + }, { "name": "Tag", "entries": [ diff --git a/ghost/core/core/server/models/email-design-setting.js b/ghost/core/core/server/models/email-design-setting.js new file mode 100644 index 00000000000..a83cf2a990f --- /dev/null +++ b/ghost/core/core/server/models/email-design-setting.js @@ -0,0 +1,30 @@ +const ghostBookshelf = require('./base'); + +const EmailDesignSetting = ghostBookshelf.Model.extend({ + tableName: 'email_design_settings', + + /** + * @returns {object} Default values for email design settings columns + */ + defaults() { + return { + background_color: 'light', + header_background_color: 'transparent', + show_header_title: true, + button_color: 'accent', + button_corners: 'rounded', + button_style: 'fill', + link_color: 'accent', + link_style: 'underline', + body_font_category: 'sans_serif', + title_font_category: 'sans_serif', + title_font_weight: 'bold', + image_corners: 'square', + show_badge: true + }; + } +}); + +module.exports = { + EmailDesignSetting: ghostBookshelf.model('EmailDesignSetting', EmailDesignSetting) +}; diff --git a/ghost/core/test/unit/server/data/schema/integrity.test.js b/ghost/core/test/unit/server/data/schema/integrity.test.js index 39841804286..e7107a95a7e 100644 --- a/ghost/core/test/unit/server/data/schema/integrity.test.js +++ b/ghost/core/test/unit/server/data/schema/integrity.test.js @@ -36,7 +36,7 @@ const validateRouteSettings = require('../../../../../core/server/services/route describe('DB version integrity', function () { // Only these variables should need updating const currentSchemaHash = 'c193998d02d13e8b85162315d938772c'; - const currentFixturesHash = '4dcbd7b52bc9ce23e6f5f1673118ba73'; + const currentFixturesHash = '987b256376357b65fb0d9ef7137c0b00'; const currentSettingsHash = 'a102b80d2ab0cd92325ed007c94d7da6'; const currentRoutesHash = '3d180d52c663d173a6be791ef411ed01'; From 4292770ce80e3a77836493e0d15b9ee81b24258c Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 06:02:10 +0000 Subject: [PATCH 06/10] Removed extra whitespace in EmailDesignSetting fixture entry --- ghost/core/core/server/data/schema/fixtures/fixtures.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ghost/core/core/server/data/schema/fixtures/fixtures.json b/ghost/core/core/server/data/schema/fixtures/fixtures.json index 4f2c6e08f66..4f270977a16 100644 --- a/ghost/core/core/server/data/schema/fixtures/fixtures.json +++ b/ghost/core/core/server/data/schema/fixtures/fixtures.json @@ -55,7 +55,7 @@ "name": "EmailDesignSetting", "entries": [ { - "slug": "default-automated-email" + "slug": "default-automated-email" } ] }, From a551b227b31eedb14decedf67a7b06135ddc019e Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 22:12:24 +0000 Subject: [PATCH 07/10] Removed imprecise JSDoc annotation from EmailDesignSetting defaults --- ghost/core/core/server/models/email-design-setting.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/ghost/core/core/server/models/email-design-setting.js b/ghost/core/core/server/models/email-design-setting.js index a83cf2a990f..a26a02fce4c 100644 --- a/ghost/core/core/server/models/email-design-setting.js +++ b/ghost/core/core/server/models/email-design-setting.js @@ -3,9 +3,6 @@ const ghostBookshelf = require('./base'); const EmailDesignSetting = ghostBookshelf.Model.extend({ tableName: 'email_design_settings', - /** - * @returns {object} Default values for email design settings columns - */ defaults() { return { background_color: 'light', From 7df4008c781527d3476db2c4e653cb33b18afe11 Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 22:37:45 +0000 Subject: [PATCH 08/10] Removed duplicate migration; moved new migration to 6.24 --- ...1-56-35-add-email-design-settings-table.js | 25 ------------------- ...sert-default-email-design-settings-row.js} | 0 2 files changed, 25 deletions(-) delete mode 100644 ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js rename ghost/core/core/server/data/migrations/versions/{6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js => 6.24/2026-03-26-15-47-00-insert-default-email-design-settings-row.js} (100%) diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js b/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js deleted file mode 100644 index 63aff36bed2..00000000000 --- a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-01-56-35-add-email-design-settings-table.js +++ /dev/null @@ -1,25 +0,0 @@ -const {addTable} = require('../../utils'); - -module.exports = addTable('email_design_settings', { - id: {type: 'string', maxlength: 24, nullable: false, primary: true}, - slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, - background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'light'}, - header_background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'transparent'}, - header_image: {type: 'string', maxlength: 2000, nullable: true}, - show_header_title: {type: 'boolean', nullable: false, defaultTo: true}, - footer_content: {type: 'text', maxlength: 1000000000, nullable: true}, - button_color: {type: 'string', maxlength: 50, nullable: true, defaultTo: 'accent'}, - button_corners: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'rounded'}, - button_style: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'fill'}, - link_color: {type: 'string', maxlength: 50, nullable: true, defaultTo: 'accent'}, - link_style: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'underline'}, - body_font_category: {type: 'string', maxlength: 191, nullable: false, defaultTo: 'sans_serif'}, - title_font_category: {type: 'string', maxlength: 191, nullable: false, defaultTo: 'sans_serif'}, - title_font_weight: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'bold'}, - image_corners: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'square'}, - divider_color: {type: 'string', maxlength: 50, nullable: true}, - section_title_color: {type: 'string', maxlength: 50, nullable: true}, - show_badge: {type: 'boolean', nullable: false, defaultTo: true}, - created_at: {type: 'dateTime', nullable: false}, - updated_at: {type: 'dateTime', nullable: true} -}); diff --git a/ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js b/ghost/core/core/server/data/migrations/versions/6.24/2026-03-26-15-47-00-insert-default-email-design-settings-row.js similarity index 100% rename from ghost/core/core/server/data/migrations/versions/6.23/2026-03-26-05-50-35-insert-default-email-design-settings-row.js rename to ghost/core/core/server/data/migrations/versions/6.24/2026-03-26-15-47-00-insert-default-email-design-settings-row.js From 5d069fc8cf04936881d7cc9643dfcbe745c2eebd Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Thu, 26 Mar 2026 23:37:29 +0000 Subject: [PATCH 09/10] Removed duplicate email_design_settings item from exporter tests --- ghost/core/test/integration/exporter/exporter.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/ghost/core/test/integration/exporter/exporter.test.js b/ghost/core/test/integration/exporter/exporter.test.js index 551fa187d92..a467f575be1 100644 --- a/ghost/core/test/integration/exporter/exporter.test.js +++ b/ghost/core/test/integration/exporter/exporter.test.js @@ -41,7 +41,6 @@ describe('Exporter', function () { 'email_recipient_failures', 'email_recipients', 'email_spam_complaint_events', - 'email_design_settings', 'emails', 'integrations', 'invites', From f0ff03d9a20433ed00cb39b46c8c15741f8d9437 Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Fri, 27 Mar 2026 20:48:43 +0000 Subject: [PATCH 10/10] Moved migration to 6.25 and bumped to 6.25.0-rc.0 --- ...6-03-26-15-47-00-insert-default-email-design-settings-row.js | 0 ghost/core/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename ghost/core/core/server/data/migrations/versions/{6.24 => 6.25}/2026-03-26-15-47-00-insert-default-email-design-settings-row.js (100%) diff --git a/ghost/core/core/server/data/migrations/versions/6.24/2026-03-26-15-47-00-insert-default-email-design-settings-row.js b/ghost/core/core/server/data/migrations/versions/6.25/2026-03-26-15-47-00-insert-default-email-design-settings-row.js similarity index 100% rename from ghost/core/core/server/data/migrations/versions/6.24/2026-03-26-15-47-00-insert-default-email-design-settings-row.js rename to ghost/core/core/server/data/migrations/versions/6.25/2026-03-26-15-47-00-insert-default-email-design-settings-row.js diff --git a/ghost/core/package.json b/ghost/core/package.json index a1393a819d1..5a600d2897d 100644 --- a/ghost/core/package.json +++ b/ghost/core/package.json @@ -1,6 +1,6 @@ { "name": "ghost", - "version": "6.24.0", + "version": "6.25.0-rc.0", "description": "The professional publishing platform", "author": "Ghost Foundation", "homepage": "https://ghost.org",