mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 22:27:26 +01:00
shared-code-private-messages
This commit is contained in:
@@ -104,6 +104,7 @@
|
|||||||
"spellNotFound": "Spell \"<%= spellId %>\" not found.",
|
"spellNotFound": "Spell \"<%= spellId %>\" not found.",
|
||||||
"partyNotFound": "Party not found",
|
"partyNotFound": "Party not found",
|
||||||
"targetIdUUID": "\"targetId\" must be a valid UUID.",
|
"targetIdUUID": "\"targetId\" must be a valid UUID.",
|
||||||
|
"invalidUUID": "UUID must be valid",
|
||||||
"challengeTasksNoCast": "Casting a spell on challenge tasks is not supported.",
|
"challengeTasksNoCast": "Casting a spell on challenge tasks is not supported.",
|
||||||
"spellNotOwned": "You don't own this spell.",
|
"spellNotOwned": "You don't own this spell.",
|
||||||
"spellLevelTooHigh": "You must be level <%= level %> to use this spell.",
|
"spellLevelTooHigh": "You must be level <%= level %> to use this spell.",
|
||||||
|
|||||||
@@ -115,6 +115,9 @@ import sell from './ops/sell';
|
|||||||
import unlock from './ops/unlock';
|
import unlock from './ops/unlock';
|
||||||
import revive from './ops/revive';
|
import revive from './ops/revive';
|
||||||
import rebirth from './ops/rebirth';
|
import rebirth from './ops/rebirth';
|
||||||
|
import blockUser from './ops/blockUser';
|
||||||
|
import clearPMs from './ops/clearPMs';
|
||||||
|
import deletePM from './ops/deletePM';
|
||||||
import reroll from './ops/reroll';
|
import reroll from './ops/reroll';
|
||||||
|
|
||||||
api.ops = {
|
api.ops = {
|
||||||
@@ -147,6 +150,9 @@ api.ops = {
|
|||||||
unlock,
|
unlock,
|
||||||
revive,
|
revive,
|
||||||
rebirth,
|
rebirth,
|
||||||
|
blockUser,
|
||||||
|
clearPMs,
|
||||||
|
deletePM,
|
||||||
reroll,
|
reroll,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
module.exports = function(user, req, cb) {
|
import validator from 'validator';
|
||||||
var i;
|
import i18n from '../../../common/script/i18n';
|
||||||
i = user.inbox.blocks.indexOf(req.params.uuid);
|
import {
|
||||||
if (~i) {
|
BadRequest,
|
||||||
user.inbox.blocks.splice(i, 1);
|
} from '../libs/errors';
|
||||||
} else {
|
|
||||||
|
module.exports = function blockUser (user, req = {}) {
|
||||||
|
if (!validator.isUUID(req.params.uuid)) throw new BadRequest(i18n.t('invalidUUID', req.language));
|
||||||
|
|
||||||
|
let i = user.inbox.blocks.indexOf(req.params.uuid);
|
||||||
|
if (i === -1) {
|
||||||
user.inbox.blocks.push(req.params.uuid);
|
user.inbox.blocks.push(req.params.uuid);
|
||||||
|
} else {
|
||||||
|
user.inbox.blocks.splice(i, 1);
|
||||||
}
|
}
|
||||||
if (typeof user.markModified === "function") {
|
|
||||||
user.markModified('inbox.blocks');
|
user.markModified('inbox.blocks');
|
||||||
}
|
return user.inbox.blocks;
|
||||||
return typeof cb === "function" ? cb(null, user.inbox.blocks) : void 0;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
module.exports = function(user, req, cb) {
|
|
||||||
|
module.exports = function clearPMs (user) {
|
||||||
user.inbox.messages = {};
|
user.inbox.messages = {};
|
||||||
if (typeof user.markModified === "function") {
|
user.markModified('inbox.messages');
|
||||||
user.markModified('inbox.messages');
|
return user.inbox.messages;
|
||||||
}
|
|
||||||
return typeof cb === "function" ? cb(null, user.inbox.messages) : void 0;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module.exports = function(user, req, cb) {
|
import _ from 'lodash';
|
||||||
delete user.inbox.messages[req.params.id];
|
|
||||||
if (typeof user.markModified === "function") {
|
module.exports = function deletePM (user, req = {}) {
|
||||||
user.markModified('inbox.messages.' + req.params.id);
|
delete user.inbox.messages[_.get(req, 'params.id')];
|
||||||
}
|
user.markModified(`inbox.messages.${req.params.id}`);
|
||||||
return typeof cb === "function" ? cb(null, user.inbox.messages) : void 0;
|
return user.inbox.messages;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,9 +11,6 @@ const COMMON_FILES = [
|
|||||||
// @TODO remove these negations as the files are converted over.
|
// @TODO remove these negations as the files are converted over.
|
||||||
'!./common/script/content/index.js',
|
'!./common/script/content/index.js',
|
||||||
'!./common/script/ops/addPushDevice.js',
|
'!./common/script/ops/addPushDevice.js',
|
||||||
'!./common/script/ops/blockUser.js',
|
|
||||||
'!./common/script/ops/clearPMs.js',
|
|
||||||
'!./common/script/ops/deletePM.js',
|
|
||||||
'!./common/script/ops/reset.js',
|
'!./common/script/ops/reset.js',
|
||||||
'!./common/script/fns/crit.js',
|
'!./common/script/fns/crit.js',
|
||||||
'!./common/script/fns/randomDrop.js',
|
'!./common/script/fns/randomDrop.js',
|
||||||
|
|||||||
27
test/api/v3/integration/user/DELETE-user_messages.test.js
Normal file
27
test/api/v3/integration/user/DELETE-user_messages.test.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import {
|
||||||
|
generateUser,
|
||||||
|
} from '../../../../helpers/api-integration/v3';
|
||||||
|
|
||||||
|
describe('DELETE user message', () => {
|
||||||
|
let user;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
user = await generateUser({ inbox: { messages: { first: 'message', second: 'message' } } });
|
||||||
|
expect(user.inbox.messages.first).to.eql('message');
|
||||||
|
expect(user.inbox.messages.second).to.eql('message');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('one message', async () => {
|
||||||
|
let result = await user.del('/user/messages/first');
|
||||||
|
await user.sync();
|
||||||
|
expect(result).to.eql({ second: 'message' });
|
||||||
|
expect(user.inbox.messages).to.eql({ second: 'message' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('clear all', async () => {
|
||||||
|
let result = await user.del('/user/messages');
|
||||||
|
await user.sync();
|
||||||
|
expect(user.inbox.messages).to.eql({});
|
||||||
|
expect(result).to.eql({});
|
||||||
|
});
|
||||||
|
});
|
||||||
34
test/api/v3/integration/user/POST-user_block.test.js
Normal file
34
test/api/v3/integration/user/POST-user_block.test.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import {
|
||||||
|
generateUser,
|
||||||
|
translate as t,
|
||||||
|
} from '../../../../helpers/api-integration/v3';
|
||||||
|
|
||||||
|
describe('block user', () => {
|
||||||
|
let user;
|
||||||
|
let blockedUser;
|
||||||
|
let blockedUser2;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
blockedUser = await generateUser();
|
||||||
|
blockedUser2 = await generateUser();
|
||||||
|
user = await generateUser({ inbox: { blocks: [blockedUser._id] } });
|
||||||
|
expect(user.inbox.blocks.length).to.eql(1);
|
||||||
|
expect(user.inbox.blocks).to.eql([blockedUser._id]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('validates uuid', async () => {
|
||||||
|
await expect(user.post('/user/block/1')).to.eventually.be.rejected.and.eql({
|
||||||
|
code: 400,
|
||||||
|
error: 'BadRequest',
|
||||||
|
message: t('invalidUUID'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully', async () => {
|
||||||
|
let response = await user.post(`/user/block/${blockedUser2._id}`);
|
||||||
|
await user.sync();
|
||||||
|
expect(response).to.eql([blockedUser._id, blockedUser2._id]);
|
||||||
|
expect(user.inbox.blocks.length).to.eql(2);
|
||||||
|
expect(user.inbox.blocks).to.include(blockedUser2._id);
|
||||||
|
});
|
||||||
|
});
|
||||||
44
test/common/ops/blockUser.test.js
Normal file
44
test/common/ops/blockUser.test.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import blockUser from '../../../common/script/ops/blockUser';
|
||||||
|
import {
|
||||||
|
generateUser,
|
||||||
|
} from '../../helpers/common.helper';
|
||||||
|
import i18n from '../../../common/script/i18n';
|
||||||
|
|
||||||
|
describe('shared.ops.blockUser', () => {
|
||||||
|
let user;
|
||||||
|
let blockedUser;
|
||||||
|
let blockedUser2;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
blockedUser = generateUser();
|
||||||
|
blockedUser2 = generateUser();
|
||||||
|
user = generateUser();
|
||||||
|
expect(user.inbox.blocks).to.eql([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('validates uuid', (done) => {
|
||||||
|
try {
|
||||||
|
blockUser(user, { params: { uuid: 1 } });
|
||||||
|
} catch (error) {
|
||||||
|
expect(error.message).to.eql(i18n.t('invalidUUID'));
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('blocks user', () => {
|
||||||
|
let result = blockUser(user, { params: { uuid: blockedUser._id } });
|
||||||
|
expect(user.inbox.blocks).to.eql([blockedUser._id]);
|
||||||
|
expect(result).to.eql([blockedUser._id]);
|
||||||
|
result = blockUser(user, { params: { uuid: blockedUser2._id } });
|
||||||
|
expect(user.inbox.blocks).to.eql([blockedUser._id, blockedUser2._id]);
|
||||||
|
expect(result).to.eql([blockedUser._id, blockedUser2._id]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('blocks, then unblocks user', () => {
|
||||||
|
blockUser(user, { params: { uuid: blockedUser._id } });
|
||||||
|
expect(user.inbox.blocks).to.eql([blockedUser._id]);
|
||||||
|
let result = blockUser(user, { params: { uuid: blockedUser._id } });
|
||||||
|
expect(user.inbox.blocks).to.eql([]);
|
||||||
|
expect(result).to.eql([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
20
test/common/ops/clearPMs.test.js
Normal file
20
test/common/ops/clearPMs.test.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import clearPMs from '../../../common/script/ops/clearPMs';
|
||||||
|
import {
|
||||||
|
generateUser,
|
||||||
|
} from '../../helpers/common.helper';
|
||||||
|
|
||||||
|
describe('shared.ops.clearPMs', () => {
|
||||||
|
let user;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
user = generateUser();
|
||||||
|
user.inbox.messages = { first: 'message', second: 'message' };
|
||||||
|
});
|
||||||
|
|
||||||
|
it('clears messages', () => {
|
||||||
|
expect(user.inbox.messages).to.not.eql({});
|
||||||
|
let result = clearPMs(user);
|
||||||
|
expect(user.inbox.messages).to.eql({});
|
||||||
|
expect(result).to.eql({});
|
||||||
|
});
|
||||||
|
});
|
||||||
20
test/common/ops/deletePM.test.js
Normal file
20
test/common/ops/deletePM.test.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import deletePM from '../../../common/script/ops/deletePM';
|
||||||
|
import {
|
||||||
|
generateUser,
|
||||||
|
} from '../../helpers/common.helper';
|
||||||
|
|
||||||
|
describe('shared.ops.clearPMs', () => {
|
||||||
|
let user;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
user = generateUser();
|
||||||
|
user.inbox.messages = { first: 'message', second: 'message' };
|
||||||
|
});
|
||||||
|
|
||||||
|
it('delete message', () => {
|
||||||
|
expect(user.inbox.messages).to.not.eql({ second: 'message' });
|
||||||
|
let response = deletePM(user, { params: { id: 'first' } });
|
||||||
|
expect(user.inbox.messages).to.eql({ second: 'message' });
|
||||||
|
expect(response).to.eql({ second: 'message' });
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -974,6 +974,63 @@ api.userRebirth = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {post} /user/block/:uuid blocks and unblocks a user
|
||||||
|
* @apiVersion 3.0.0
|
||||||
|
* @apiName BlockUser
|
||||||
|
* @apiGroup User
|
||||||
|
* @apiSuccess {}
|
||||||
|
**/
|
||||||
|
api.blockUser = {
|
||||||
|
method: 'POST',
|
||||||
|
middlewares: [authWithHeaders()],
|
||||||
|
url: '/user/block/:uuid',
|
||||||
|
async handler (req, res) {
|
||||||
|
let user = res.locals.user;
|
||||||
|
let blocks = common.ops.blockUser(user, req);
|
||||||
|
await user.save();
|
||||||
|
res.respond(200, blocks);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {delete} /user/messages/:id delete this message
|
||||||
|
* @apiVersion 3.0.0
|
||||||
|
* @apiName deleteMessage
|
||||||
|
* @apiGroup User
|
||||||
|
* @apiSuccess {}
|
||||||
|
**/
|
||||||
|
api.deleteMessage = {
|
||||||
|
method: 'DELETE',
|
||||||
|
middlewares: [authWithHeaders(), cron],
|
||||||
|
url: '/user/messages/:id',
|
||||||
|
async handler (req, res) {
|
||||||
|
let user = res.locals.user;
|
||||||
|
let messages = common.ops.deletePM(user, req);
|
||||||
|
await user.save();
|
||||||
|
res.respond(200, messages);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {delete} /user/messages delete all messages
|
||||||
|
* @apiVersion 3.0.0
|
||||||
|
* @apiName clearMessages
|
||||||
|
* @apiGroup User
|
||||||
|
* @apiSuccess {}
|
||||||
|
**/
|
||||||
|
api.clearMessages = {
|
||||||
|
method: 'DELETE',
|
||||||
|
middlewares: [authWithHeaders(), cron],
|
||||||
|
url: '/user/messages',
|
||||||
|
async handler (req, res) {
|
||||||
|
let user = res.locals.user;
|
||||||
|
let PMs = common.ops.clearPMs(user, req);
|
||||||
|
await user.save();
|
||||||
|
res.respond(200, PMs);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @api {post} /user/reroll Rerolls a user.
|
* @api {post} /user/reroll Rerolls a user.
|
||||||
* @apiVersion 3.0.0
|
* @apiVersion 3.0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user