TryGhost/Ghost

View on GitHub
ghost/admin/mirage/config/newsletters.js

Summary

Maintainability
A
2 hrs
Test Coverage
import {camelize} from '@ember/string';
import {dasherize} from '@ember/string';
import {isBlank} from '@ember/utils';
import {paginatedResponse} from '../utils';

export default function mockNewsletters(server) {
    server.get('/newsletters/', paginatedResponse('newsletters'));
    server.get('/newsletters/:id/');

    server.post('/newsletters/', function ({newsletters}, {queryParams}) {
        const attrs = this.normalizedRequestAttrs();

        // sender email can't be set without verification
        const senderEmail = attrs.senderEmail;
        attrs.senderEmail = null;

        if (isBlank(attrs.slug) && !isBlank(attrs.name)) {
            attrs.slug = dasherize(attrs.name);
        }

        const newsletter = newsletters.create(attrs);

        // workaround for mirage output of meta
        const collection = newsletters.where({id: newsletter.id});

        if (senderEmail) {
            collection.meta = {
                sent_email_verification: ['sender_email']
            };
        }

        if (queryParams.opt_in_existing === 'true') {
            newsletters.all().models.forEach((n) => {
                newsletter.members.mergeCollection(n.members);
            });
            newsletter.save();
        }

        return collection;
    });

    server.put('/newsletters/:id/', function ({newsletters}, {params}) {
        const attrs = this.normalizedRequestAttrs();
        const newsletter = newsletters.find(params.id);

        const previousSenderEmail = newsletter.senderEmail;
        const newSenderEmail = attrs.senderEmail;

        // sender email can't be changed without verification
        if (newSenderEmail && newSenderEmail !== previousSenderEmail) {
            // It doesn't correctly return to the previous email if previousSenderEmail is undefined
            attrs.senderEmail = previousSenderEmail === undefined ? null : previousSenderEmail;
        }

        newsletter.update(attrs);

        // workaround for mirage output of meta
        const collection = newsletters.where({id: newsletter.id});

        if (newSenderEmail && newSenderEmail !== previousSenderEmail) {
            collection.meta = {
                sent_email_verification: ['sender_email']
            };

            const tokenData = {
                id: newsletter.id,
                email: newSenderEmail,
                type: 'sender_email'
            };
            const token = btoa(JSON.stringify(tokenData));
            const baseUrl = window.location.href.replace(window.location.hash, '');
            const verifyUrl = `${baseUrl}settings/newsletters/?verifyEmail=${token}`;
            // eslint-disable-next-line
            console.warn('Verification email sent. Mocked verification URL:', verifyUrl);
        }

        return collection;
    });

    // verify email update
    server.put('/newsletters/verifications/', function ({newsletters}, request) {
        const requestBody = JSON.parse(request.requestBody);
        const tokenData = JSON.parse(atob(requestBody.token));

        const newsletter = newsletters.find(tokenData.id);

        newsletter[camelize(tokenData.type)] = tokenData.email;

        return newsletter.save();
    });
}