diff --git a/public/src/client/register.js b/public/src/client/register.js index d2fca2b7f5..0a98b324fa 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -2,8 +2,8 @@ define('forum/register', [ - 'translator', 'zxcvbn', 'slugify', 'jquery-form', -], function (translator, zxcvbn, slugify) { + 'translator', 'zxcvbn', 'slugify', 'api', 'jquery-form', +], function (translator, zxcvbn, slugify, api) { var Register = {}; var validationError = false; var successIcon = ''; @@ -159,21 +159,14 @@ define('forum/register', [ } else if (!utils.isUserNameValid(username) || !slugify(username)) { showError(username_notify, '[[error:invalid-username]]'); } else { - socket.emit('user.exists', { - username: username, - }, function (err, exists) { - if (err) { - return app.alertError(err.message); - } - - if (exists) { + api.head(`/users/bySlug/${username}`, {}) + .then(() => { showError(username_notify, '[[error:username-taken]]'); - } else { + }) + .catch(() => { showSuccess(username_notify, successIcon); - } - - callback(); - }); + }) + .finally(callback); } } diff --git a/public/src/modules/api.js b/public/src/modules/api.js index 7b01f367c1..207342d1c1 100644 --- a/public/src/modules/api.js +++ b/public/src/modules/api.js @@ -13,14 +13,17 @@ define('api', () => { $.ajax(options) .done((res) => { cb(null, - res.hasOwnProperty('status') && res.hasOwnProperty('response') ? - res.response : res + res && res.hasOwnProperty('status') && res.hasOwnProperty('response') ? + res.response : (res || {}) ); }) .fail((ev) => { - const errMessage = ev.responseJSON.status && ev.responseJSON.status.message ? - ev.responseJSON.status.message : - ev.responseJSON.error; + let errMessage; + if (ev.responseJSON) { + errMessage = ev.responseJSON.status && ev.responseJSON.status.message ? + ev.responseJSON.status.message : + ev.responseJSON.error; + } cb(new Error(errMessage || ev.statusText)); }); @@ -39,10 +42,15 @@ define('api', () => { }); } - api.get = (route, payload, onSuccess) => call({ + api.get = (route, payload = {}, onSuccess) => call({ url: route + (Object.keys(payload).length ? ('?' + $.param(payload)) : ''), }, onSuccess); + api.head = (route, payload, onSuccess) => call({ + url: route + (Object.keys(payload).length ? ('?' + $.param(payload)) : ''), + method: 'head', + }, onSuccess); + api.post = (route, payload, onSuccess) => call({ url: route, method: 'post', diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index e64ac024b2..cf07d469cb 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -341,6 +341,10 @@ helpers.getHomePageRoutes = async function (uid) { }; helpers.formatApiResponse = async (statusCode, res, payload) => { + if (res.req.method === 'HEAD') { + return res.sendStatus(statusCode); + } + if (String(statusCode).startsWith('2')) { res.status(statusCode).json({ status: { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 4e5f9b06d1..292fb1ea48 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -30,6 +30,8 @@ require('./user/ban')(SocketUser); require('./user/registration')(SocketUser); SocketUser.exists = async function (socket, data) { + sockets.warnDeprecated(socket, 'HEAD /api/v3/users/bySlug/:userslug'); + if (!data || !data.username) { throw new Error('[[error:invalid-data]]'); }