TryGhost/Ghost

View on GitHub
ghost/core/core/server/models/custom-theme-setting.js

Summary

Maintainability
C
1 day
Test Coverage
const _ = require('lodash');
const ghostBookshelf = require('./base');
const urlUtils = require('../../shared/url-utils');

const CustomThemeSetting = ghostBookshelf.Model.extend({
    tableName: 'custom_theme_settings',

    parse() {
        const attrs = ghostBookshelf.Model.prototype.parse.apply(this, arguments);
        const settingType = attrs.type;

        // transform "0" to false for boolean type
        if (settingType === 'boolean' && (attrs.value === '0' || attrs.value === '1')) {
            attrs.value = !!+attrs.value;
        }

        // transform "false" to false for boolean type
        if (settingType === 'boolean' && (attrs.value === 'false' || attrs.value === 'true')) {
            attrs.value = JSON.parse(attrs.value);
        }

        // transform URLs to absolute for image settings
        if (settingType === 'image' && attrs.value) {
            attrs.value = urlUtils.transformReadyToAbsolute(attrs.value);
        }

        return attrs;
    },

    format() {
        const attrs = ghostBookshelf.Model.prototype.format.apply(this, arguments);
        const settingType = attrs.type;

        if (settingType === 'boolean') {
            // CASE: Ensure we won't forward strings, otherwise model events or model interactions can fail
            if (attrs.value === '0' || attrs.value === '1') {
                attrs.value = !!+attrs.value;
            }

            // CASE: Ensure we won't forward strings, otherwise model events or model interactions can fail
            if (attrs.value === 'false' || attrs.value === 'true') {
                attrs.value = JSON.parse(attrs.value);
            }

            if (_.isBoolean(attrs.value)) {
                attrs.value = attrs.value.toString();
            }
        }

        return attrs;
    },

    formatOnWrite(attrs) {
        if (attrs.type === 'image' && attrs.value) {
            attrs.value = urlUtils.toTransformReady(attrs.value);
        }

        return attrs;
    }
});

module.exports = {
    CustomThemeSetting: ghostBookshelf.model('CustomThemeSetting', CustomThemeSetting)
};