NodeBB/NodeBB

View on GitHub
public/src/admin/settings/api.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

define('admin/settings/api', ['settings', 'clipboard', 'bootbox', 'benchpress', 'api', 'alerts'], function (settings, clipboard, bootbox, Benchpress, api, alerts) {
    const ACP = {};

    ACP.init = function () {
        settings.load('core.api', $('.core-api-settings'));
        $('#save').on('click', () => {
            settings.save('core.api', $('.core-api-settings'));
        });

        // Click to copy
        const copyEls = document.querySelectorAll('[data-component="acp/tokens"] [data-action="copy"]');
        new clipboard(copyEls);

        $('[data-action="create"]').on('click', handleTokenCreation);

        handleActions();
    };

    function handleActions() {
        const formEl = document.querySelector('#content form');
        if (!formEl) {
            return;
        }

        formEl.addEventListener('click', (e) => {
            const subselector = e.target.closest('[data-action]');
            if (subselector) {
                const action = subselector.getAttribute('data-action');

                switch (action) {
                    case 'edit':
                        handleTokenUpdate(subselector);
                        break;

                    case 'delete':
                        handleTokenDeletion(subselector);
                        break;

                    case 'roll':
                        handleTokenRolling(subselector);
                        break;
                }
            }
        });
    }

    async function handleTokenCreation() {
        const html = await Benchpress.render('admin/partials/edit-token-modal', {});
        const parseForm = async function () {
            const modal = this;
            const formEl = this.get(0).querySelector('form');
            const tokensTableBody = document.querySelector('[data-component="acp/tokens"] tbody');
            const valid = formEl.reportValidity();
            if (formEl && valid) {
                const formData = new FormData(formEl);
                const uid = formData.get('uid');
                const description = formData.get('description');

                try {
                    const tokenObj = await api.post('/admin/tokens', { uid, description });
                    if (!tokensTableBody) {
                        modal.modal('hide');
                        return ajaxify.refresh();
                    }

                    ajaxify.data.tokens.push(tokenObj);
                    const rowEl = (await app.parseAndTranslate(ajaxify.data.template.name, 'tokens', {
                        tokens: [tokenObj],
                    })).get(0);

                    tokensTableBody.append(rowEl);
                    $(rowEl).find('.timeago').timeago();
                    modal.modal('hide');
                } catch (e) {
                    alerts.error(e);
                }
            }

            return false;
        };

        bootbox.dialog({
            title: '[[admin/settings/api:create-token]]',
            message: html,
            buttons: {
                submit: {
                    label: '[[modules:bootbox.submit]]',
                    className: 'btn-primary',
                    callback: parseForm,
                },
            },
        });
    }

    async function handleTokenUpdate(el) {
        const rowEl = el.closest('[data-token]');
        const token = rowEl.getAttribute('data-token');
        const { uid, description } = await api.get(`/admin/tokens/${token}`);
        const parseForm = async function () {
            const modal = this;
            const formEl = this.get(0).querySelector('form');
            const valid = formEl.reportValidity();
            if (formEl && valid) {
                const formData = new FormData(formEl);
                const uid = formData.get('uid');
                const description = formData.get('description');

                try {
                    const tokenObj = await api.put(`/admin/tokens/${token}`, { uid, description });
                    const newEl = (await app.parseAndTranslate(ajaxify.data.template.name, 'tokens', {
                        tokens: [tokenObj],
                    })).get(0);

                    rowEl.replaceWith(newEl);
                    $(newEl).find('.timeago').timeago();
                    modal.modal('hide');
                } catch (e) {
                    alerts.error(e);
                }
            }

            return false;
        };

        const html = await Benchpress.render('admin/partials/edit-token-modal', { uid, description });
        bootbox.dialog({
            title: '[[admin/settings/api:update-token]]',
            message: html,
            buttons: {
                submit: {
                    label: '[[modules:bootbox.submit]]',
                    className: 'btn-primary',
                    callback: parseForm,
                },
            },
        });
    }

    async function handleTokenDeletion(el) {
        const rowEl = el.closest('[data-token]');
        const token = rowEl.getAttribute('data-token');

        bootbox.confirm('[[admin/settings/api:delete-confirm]]', async (ok) => {
            if (ok) {
                try {
                    await api.del(`/admin/tokens/${token}`);
                } catch (e) {
                    alerts.error(e);
                }

                rowEl.remove();
            }
        });
    }

    async function handleTokenRolling(el) {
        const rowEl = el.closest('[data-token]');
        const token = rowEl.getAttribute('data-token');

        bootbox.confirm('[[admin/settings/api:roll-confirm]]', async (ok) => {
            if (ok) {
                try {
                    const tokenObj = await api.post(`/admin/tokens/${token}/roll`);
                    const newEl = (await app.parseAndTranslate(ajaxify.data.template.name, 'tokens', {
                        tokens: [tokenObj],
                    })).get(0);

                    rowEl.replaceWith(newEl);
                    $(newEl).find('.timeago').timeago();
                } catch (e) {
                    alerts.error(e);
                }
            }
        });
    }

    return ACP;
});