diff --git a/packages/backend/src/controllers/api/v1/admin/config/update.ee.js b/packages/backend/src/controllers/api/v1/admin/config/update.ee.js index 50c76beb..47a5b6ec 100644 --- a/packages/backend/src/controllers/api/v1/admin/config/update.ee.js +++ b/packages/backend/src/controllers/api/v1/admin/config/update.ee.js @@ -11,6 +11,15 @@ export default async (request, response) => { const configParams = (request) => { const { + enableFooter, + footerBackgroundColor, + footerCopyrightText, + footerDocsLink, + footerImprintLink, + footerLogoSvgData, + footerPrivacyPolicyLink, + footerTextColor, + footerTosLink, logoSvgData, palettePrimaryDark, palettePrimaryLight, @@ -19,6 +28,15 @@ const configParams = (request) => { } = request.body; return { + enableFooter, + footerBackgroundColor, + footerCopyrightText, + footerDocsLink, + footerImprintLink, + footerLogoSvgData, + footerPrivacyPolicyLink, + footerTextColor, + footerTosLink, logoSvgData, palettePrimaryDark, palettePrimaryLight, diff --git a/packages/backend/src/controllers/api/v1/admin/config/update.ee.test.js b/packages/backend/src/controllers/api/v1/admin/config/update.ee.test.js index 5984cdbb..11d65ddc 100644 --- a/packages/backend/src/controllers/api/v1/admin/config/update.ee.test.js +++ b/packages/backend/src/controllers/api/v1/admin/config/update.ee.test.js @@ -25,6 +25,18 @@ describe('PATCH /api/v1/admin/config', () => { const palettePrimaryMain = '#00adef'; const palettePrimaryDark = '#222222'; const palettePrimaryLight = '#f90707'; + const enableFooter = true; + const footerCopyrightText = '© AB Software GmbH'; + const footerBackgroundColor = '#FFFFFF'; + const footerTextColor = '#000000'; + const footerDocsLink = 'https://automatisch.io/docs'; + const footerTosLink = 'https://automatisch.io/terms'; + const footerPrivacyPolicyLink = 'https://automatisch.io/privacy'; + const footerImprintLink = 'https://automatisch.io/imprint'; + + const footerLogoSvgData = + 'Sample Footer Logo'; + const logoSvgData = 'A'; @@ -34,6 +46,15 @@ describe('PATCH /api/v1/admin/config', () => { palettePrimaryDark: palettePrimaryDark, palettePrimaryLight: palettePrimaryLight, logoSvgData: logoSvgData, + enableFooter, + footerCopyrightText, + footerBackgroundColor, + footerTextColor, + footerDocsLink, + footerTosLink, + footerPrivacyPolicyLink, + footerImprintLink, + footerLogoSvgData, }; await updateConfig(appConfig); diff --git a/packages/backend/src/controllers/api/v1/automatisch/config.ee.test.js b/packages/backend/src/controllers/api/v1/automatisch/config.ee.test.js index 01ca3365..56a70125 100644 --- a/packages/backend/src/controllers/api/v1/automatisch/config.ee.test.js +++ b/packages/backend/src/controllers/api/v1/automatisch/config.ee.test.js @@ -28,6 +28,15 @@ describe('GET /api/v1/automatisch/config', () => { palettePrimaryMain: '#0059F7', title: 'Sample Title', enableTemplates: true, + enableFooter: true, + footerLogoSvgData: 'Sample Footer Logo', + footerCopyrightText: '© AB Software GmbH', + footerBackgroundColor: '#FFFFFF', + footerTextColor: '#000000', + footerDocsLink: 'https://automatisch.io/docs', + footerTosLink: 'https://automatisch.io/terms', + footerPrivacyPolicyLink: 'https://automatisch.io/privacy', + footerImprintLink: 'https://automatisch.io/imprint', }); const response = await request(app) @@ -41,6 +50,16 @@ describe('GET /api/v1/automatisch/config', () => { additionalDrawerLink: 'link', additionalDrawerLinkIcon: 'icon', additionalDrawerLinkText: 'text', + enableTemplates: true, + enableFooter: true, + footerLogoSvgData: 'Sample Footer Logo', + footerCopyrightText: '© AB Software GmbH', + footerBackgroundColor: '#FFFFFF', + footerTextColor: '#000000', + footerDocsLink: 'https://automatisch.io/docs', + footerTosLink: 'https://automatisch.io/terms', + footerPrivacyPolicyLink: 'https://automatisch.io/privacy', + footerImprintLink: 'https://automatisch.io/imprint', }); expect(response.body).toStrictEqual(expectedPayload); diff --git a/packages/backend/src/db/migrations/20250304095143_add_footer_columns_in_config.js b/packages/backend/src/db/migrations/20250304095143_add_footer_columns_in_config.js new file mode 100644 index 00000000..bff24b62 --- /dev/null +++ b/packages/backend/src/db/migrations/20250304095143_add_footer_columns_in_config.js @@ -0,0 +1,27 @@ +export async function up(knex) { + await knex.schema.table('config', (table) => { + table.boolean('enable_footer').defaultTo(false); + table.text('footer_logo_svg_data'); + table.text('footer_copyright_text'); + table.text('footer_background_color'); + table.text('footer_text_color'); + table.text('footer_docs_link'); + table.text('footer_tos_link'); + table.text('footer_privacy_policy_link'); + table.text('footer_imprint_link'); + }); +} + +export async function down(knex) { + await knex.schema.table('config', (table) => { + table.dropColumn('enable_footer'); + table.dropColumn('footer_copyright_text'); + table.dropColumn('footer_logo_svg_data'); + table.dropColumn('footer_background_color'); + table.dropColumn('footer_text_color'); + table.dropColumn('footer_docs_link'); + table.dropColumn('footer_tos_link'); + table.dropColumn('footer_privacy_policy_link'); + table.dropColumn('footer_imprint_link'); + }); +} diff --git a/packages/backend/src/models/__snapshots__/config.test.js.snap b/packages/backend/src/models/__snapshots__/config.test.js.snap index b3650d4a..c91ed9c6 100644 --- a/packages/backend/src/models/__snapshots__/config.test.js.snap +++ b/packages/backend/src/models/__snapshots__/config.test.js.snap @@ -6,12 +6,63 @@ exports[`Config model > jsonSchema should have correct validations 1`] = ` "createdAt": { "type": "string", }, + "enableFooter": { + "type": "boolean", + }, "enableTemplates": { "type": [ "boolean", "null", ], }, + "footerBackgroundColor": { + "type": [ + "string", + "null", + ], + }, + "footerCopyrightText": { + "type": [ + "string", + "null", + ], + }, + "footerDocsLink": { + "type": [ + "string", + "null", + ], + }, + "footerImprintLink": { + "type": [ + "string", + "null", + ], + }, + "footerLogoSvgData": { + "type": [ + "string", + "null", + ], + }, + "footerPrivacyPolicyLink": { + "type": [ + "string", + "null", + ], + }, + "footerTextColor": { + "type": [ + "string", + "null", + ], + }, + "footerTosLink": { + "type": [ + "string", + "null", + ], + }, "id": { "format": "uuid", "type": "string", diff --git a/packages/backend/src/models/config.js b/packages/backend/src/models/config.js index 7fda0860..9254ed76 100644 --- a/packages/backend/src/models/config.js +++ b/packages/backend/src/models/config.js @@ -16,6 +16,15 @@ class Config extends Base { palettePrimaryMain: { type: ['string', 'null'] }, title: { type: ['string', 'null'] }, enableTemplates: { type: ['boolean', 'null'] }, + enableFooter: { type: 'boolean' }, + footerLogoSvgData: { type: ['string', 'null'] }, + footerCopyrightText: { type: ['string', 'null'] }, + footerBackgroundColor: { type: ['string', 'null'] }, + footerTextColor: { type: ['string', 'null'] }, + footerDocsLink: { type: ['string', 'null'] }, + footerTosLink: { type: ['string', 'null'] }, + footerPrivacyPolicyLink: { type: ['string', 'null'] }, + footerImprintLink: { type: ['string', 'null'] }, createdAt: { type: 'string' }, updatedAt: { type: 'string' }, }, diff --git a/packages/backend/src/serializers/config.js b/packages/backend/src/serializers/config.js index 44308938..fb8180b1 100644 --- a/packages/backend/src/serializers/config.js +++ b/packages/backend/src/serializers/config.js @@ -15,6 +15,15 @@ const configSerializer = (config) => { palettePrimaryLight: config.palettePrimaryLight, installationCompleted: config.installationCompleted, title: config.title, + enableFooter: config.enableFooter, + footerLogoSvgData: config.footerLogoSvgData, + footerCopyrightText: config.footerCopyrightText, + footerBackgroundColor: config.footerBackgroundColor, + footerTextColor: config.footerTextColor, + footerDocsLink: config.footerDocsLink, + footerTosLink: config.footerTosLink, + footerPrivacyPolicyLink: config.footerPrivacyPolicyLink, + footerImprintLink: config.footerImprintLink, }; }; diff --git a/packages/backend/src/serializers/config.test.js b/packages/backend/src/serializers/config.test.js index 025f286a..ec37a3d0 100644 --- a/packages/backend/src/serializers/config.test.js +++ b/packages/backend/src/serializers/config.test.js @@ -24,6 +24,15 @@ describe('configSerializer', () => { additionalDrawerLink: config.additionalDrawerLink, additionalDrawerLinkIcon: config.additionalDrawerLinkIcon, additionalDrawerLinkText: config.additionalDrawerLinkText, + enableFooter: config.enableFooter, + footerBackgroundColor: config.footerBackgroundColor, + footerCopyrightText: config.footerCopyrightText, + footerDocsLink: config.footerDocsLink, + footerImprintLink: config.footerImprintLink, + footerLogoSvgData: config.footerLogoSvgData, + footerPrivacyPolicyLink: config.footerPrivacyPolicyLink, + footerTextColor: config.footerTextColor, + footerTosLink: config.footerTosLink, createdAt: config.createdAt.getTime(), updatedAt: config.updatedAt.getTime(), }; diff --git a/packages/backend/test/mocks/rest/api/v1/automatisch/config.js b/packages/backend/test/mocks/rest/api/v1/automatisch/config.js index eae9202c..04d4a35e 100644 --- a/packages/backend/test/mocks/rest/api/v1/automatisch/config.js +++ b/packages/backend/test/mocks/rest/api/v1/automatisch/config.js @@ -16,6 +16,15 @@ const configMock = (config) => { installationCompleted: config.installationCompleted || false, title: config.title, enableTemplates: config.enableTemplates, + enableFooter: config.enableFooter || false, + footerLogoSvgData: config.footerLogoSvgData, + footerCopyrightText: config.footerCopyrightText, + footerBackgroundColor: config.footerBackgroundColor, + footerTextColor: config.footerTextColor, + footerDocsLink: config.footerDocsLink, + footerTosLink: config.footerTosLink, + footerPrivacyPolicyLink: config.footerPrivacyPolicyLink, + footerImprintLink: config.footerImprintLink, }, meta: { count: 1,