NodeBB/NodeBB

View on GitHub
src/controllers/write/users.js

Summary

Maintainability
C
1 day
Test Coverage
'use strict';

const nconf = require('nconf');
const path = require('path');
const crypto = require('crypto');

const api = require('../../api');
const user = require('../../user');

const helpers = require('../helpers');

const Users = module.exports;

Users.redirectBySlug = async (req, res) => {
    const uid = await user.getUidByUserslug(req.params.userslug);

    if (uid) {
        const path = req.path.split('/').slice(3).join('/');
        const urlObj = new URL(nconf.get('url') + req.url);
        res.redirect(308, nconf.get('relative_path') + encodeURI(`/api/v3/users/${uid}/${path}${urlObj.search}`));
    } else {
        helpers.formatApiResponse(404, res);
    }
};

Users.create = async (req, res) => {
    const userObj = await api.users.create(req, req.body);
    helpers.formatApiResponse(200, res, userObj);
};

Users.exists = async (req, res) => {
    helpers.formatApiResponse(200, res);
};

Users.get = async (req, res) => {
    helpers.formatApiResponse(200, res, await api.users.get(req, { ...req.params }));
};

Users.update = async (req, res) => {
    const userObj = await api.users.update(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res, userObj);
};

Users.delete = async (req, res) => {
    await api.users.delete(req, { ...req.params, password: req.body.password });
    helpers.formatApiResponse(200, res);
};

Users.deleteContent = async (req, res) => {
    await api.users.deleteContent(req, { ...req.params, password: req.body.password });
    helpers.formatApiResponse(200, res);
};

Users.deleteAccount = async (req, res) => {
    await api.users.deleteAccount(req, { ...req.params, password: req.body.password });
    helpers.formatApiResponse(200, res);
};

Users.deleteMany = async (req, res) => {
    await api.users.deleteMany(req, req.body);
    helpers.formatApiResponse(200, res);
};

Users.changePicture = async (req, res) => {
    await api.users.changePicture(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res);
};

Users.getStatus = async (req, res) => {
    helpers.formatApiResponse(200, res, await api.users.getStatus(req, { ...req.params }));
};

Users.checkStatus = async (req, res) => {
    const { uid, status } = req.params;
    const { status: current } = await api.users.getStatus(req, { uid });

    helpers.formatApiResponse(current === status ? 200 : 404, res);
};

Users.getPrivateRoomId = async (req, res) => {
    helpers.formatApiResponse(200, res, await api.users.getPrivateRoomId(req, { ...req.params }));
};

Users.updateSettings = async (req, res) => {
    const settings = await api.users.updateSettings(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res, settings);
};

Users.changePassword = async (req, res) => {
    await api.users.changePassword(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res);
};

Users.follow = async (req, res) => {
    await api.users.follow(req, req.params);
    helpers.formatApiResponse(200, res);
};

Users.unfollow = async (req, res) => {
    await api.users.unfollow(req, req.params);
    helpers.formatApiResponse(200, res);
};

Users.ban = async (req, res) => {
    await api.users.ban(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res);
};

Users.unban = async (req, res) => {
    await api.users.unban(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res);
};

Users.mute = async (req, res) => {
    await api.users.mute(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res);
};

Users.unmute = async (req, res) => {
    await api.users.unmute(req, { ...req.body, uid: req.params.uid });
    helpers.formatApiResponse(200, res);
};

Users.generateToken = async (req, res) => {
    const { description } = req.body;
    const token = await api.users.generateToken(req, { description, ...req.params });
    helpers.formatApiResponse(200, res, token);
};

Users.deleteToken = async (req, res) => {
    const ok = await api.users.deleteToken(req, { ...req.params });
    helpers.formatApiResponse(ok ? 200 : 404, res);
};

Users.revokeSession = async (req, res) => {
    await api.users.revokeSession(req, { ...req.params });
    helpers.formatApiResponse(200, res);
};

Users.invite = async (req, res) => {
    const { emails, groupsToJoin = [] } = req.body;

    try {
        await api.users.invite(req, { emails, groupsToJoin, ...req.params });
        helpers.formatApiResponse(200, res);
    } catch (e) {
        if (e.message.startsWith('[[error:invite-maximum-met')) {
            return helpers.formatApiResponse(403, res, e);
        }

        throw e;
    }
};

Users.getInviteGroups = async function (req, res) {
    return helpers.formatApiResponse(200, res, await api.users.getInviteGroups(req, { ...req.params }));
};

Users.addEmail = async (req, res) => {
    const { email, skipConfirmation } = req.body;
    const emails = await api.users.addEmail(req, { email, skipConfirmation, ...req.params });

    helpers.formatApiResponse(200, res, { emails });
};

Users.listEmails = async (req, res) => {
    const emails = await api.users.listEmails(req, { ...req.params });
    if (emails) {
        helpers.formatApiResponse(200, res, { emails });
    } else {
        helpers.formatApiResponse(204, res);
    }
};

Users.getEmail = async (req, res) => {
    const ok = await api.users.getEmail(req, { ...req.params });
    helpers.formatApiResponse(ok ? 204 : 404, res);
};

Users.confirmEmail = async (req, res) => {
    const ok = await api.users.confirmEmail(req, {
        sessionId: req.session.id,
        ...req.params,
    });
    helpers.formatApiResponse(ok ? 200 : 404, res);
};

Users.checkExportByType = async (req, res) => {
    const stat = await api.users.checkExportByType(req, { ...req.params });
    const modified = new Date(stat.mtimeMs);
    res.set('Last-Modified', modified.toUTCString());
    res.set('ETag', `"${crypto.createHash('md5').update(String(stat.mtimeMs)).digest('hex')}"`);
    res.sendStatus(204);
};

Users.getExportByType = async (req, res, next) => {
    const data = await api.users.getExportByType(req, ({ ...req.params }));
    if (!data) {
        return next();
    }

    res.status(200);
    res.sendFile(data.filename, {
        root: path.join(__dirname, '../../../build/export'),
        headers: {
            'Content-Type': data.mime,
            'Content-Disposition': `attachment; filename=${data.filename}`,
        },
    }, (err) => {
        if (err) {
            throw err;
        }
    });
};

Users.generateExportsByType = async (req, res) => {
    await api.users.generateExport(req, req.params);
    helpers.formatApiResponse(202, res);
};