diff --git a/backend/migrations/core/084_fix_hero_logo_position.js b/backend/migrations/core/084_fix_hero_logo_position.js new file mode 100644 index 00000000..d687ee64 --- /dev/null +++ b/backend/migrations/core/084_fix_hero_logo_position.js @@ -0,0 +1,21 @@ +/** + * Heal events whose hero_logo_position contains a branding-style value + * (left/right) caused by a prior bug in adminEvents.js getBrandingDefaults + * that mapped branding_logo_position (left/center/right) onto + * hero_logo_position (top/center/bottom). Any non-canonical value is + * reset to 'top' so subsequent PUTs no longer fail validation. + */ + +exports.up = async function up(knex) { + const hasColumn = await knex.schema.hasColumn('events', 'hero_logo_position'); + if (!hasColumn) return; + + await knex('events') + .whereNotIn('hero_logo_position', ['top', 'center', 'bottom']) + .update({ hero_logo_position: 'top' }); +}; + +exports.down = async function down() { + // Data correction is not reversible — the original (incorrect) values + // are not preserved. +}; diff --git a/backend/src/routes/adminEvents.js b/backend/src/routes/adminEvents.js index 7ea50898..a5f0effd 100644 --- a/backend/src/routes/adminEvents.js +++ b/backend/src/routes/adminEvents.js @@ -138,14 +138,20 @@ const getDownloadProtectionDefaults = async () => { return { enable_devtools_protection: await readBooleanSetting('enable_devtools_protection') }; }; -// Helper to get branding defaults for new events (Feature 7: Branding Inheritance) +// Helper to get branding defaults for new events (Feature 7: Branding Inheritance). +// +// Note: `branding_logo_position` (header bar — left/center/right) is a +// different concept from `hero_logo_position` (hero block — top/center/ +// bottom) and must NOT be mapped here. A previous version copied the +// branding value over, which wrote 'left'/'right' into per-event +// hero_logo_position columns and broke any subsequent PUT validation +// (#357). Migration 084 heals existing rows. const getBrandingDefaults = async () => { try { const settings = await db('app_settings') .whereIn('setting_key', [ 'branding_logo_display_hero', - 'branding_logo_size', - 'branding_logo_position' + 'branding_logo_size' ]) .select('setting_key', 'setting_value'); @@ -166,9 +172,6 @@ const getBrandingDefaults = async () => { if (s.setting_key === 'branding_logo_size' && value) { defaults.hero_logo_size = value; } - if (s.setting_key === 'branding_logo_position' && value) { - defaults.hero_logo_position = value; - } }); return defaults;