habitica-self-host/website/server/libs/inbox/index.js
Matteo Pagliazzi 26c8323e70
Move inbox to its own model (#10428)
* shared model for chat and inbox

* disable inbox schema

* inbox: use separate model

* remove old code that used group.chat

* add back chat field (not used) and remove old tests

* remove inbox exclusions when loading user

* add GET /api/v3/inbox/messages

* add comment

* implement DELETE /inbox/messages/:messageid in v4

* implement GET /inbox/messages in v4 and update tests

* implement DELETE /api/v4/inbox/clear

* fix url

* fix doc

* update /export/inbox.html

* update other data exports

* add back messages in user schema

* add user.toJSONWithInbox

* add compativility until migration is done

* more compatibility

* fix tojson called twice

* add compatibility methods

* fix common tests

* fix v4 integration tests

* v3 get user -> with inbox

* start to fix tests

* fix v3 integration tests

* wip

* wip, client use new route

* update tests for members/send-private-message

* tests for get user in v4

* add tests for DELETE /inbox/messages/:messageId

* add tests for DELETE /inbox/clear in v4

* update docs

* fix tests

* initial migration

* fix migration

* fix migration

* migration fixes

* migrate api.enterCouponCode

* migrate api.castSpell

* migrate reset, reroll, rebirth

* add routes to v4 version

* fix tests

* fixes

* api.updateUser

* remove .only

* get user -> userLib

* refactor inbox.vue to work with new data model

* fix return message when messaging yourself

* wip fix bug with new conversation

* wip

* fix remaining ui issues

* move api.registerLocal, fixes

* keep only v3 version of GET /inbox/messages
2018-09-21 15:12:20 +02:00

47 lines
1.2 KiB
JavaScript

import { inboxModel as Inbox } from '../../models/message';
import { toArray, orderBy } from 'lodash';
export async function getUserInbox (user, asArray = true) {
const messages = (await Inbox
.find({ownerId: user._id})
.exec()).map(msg => msg.toJSON());
const messagesObj = Object.assign({}, user.inbox.messages); // copy, shallow clone
if (asArray) {
messages.push(...toArray(messagesObj));
return orderBy(messages, ['timestamp'], ['desc']);
} else {
messages.forEach(msg => messagesObj[msg._id] = msg);
return messagesObj;
}
}
export async function deleteMessage (user, messageId) {
if (user.inbox.messages[messageId]) { // compatibility
delete user.inbox.messages[messageId];
user.markModified(`inbox.messages.${messageId}`);
await user.save();
} else {
const message = await Inbox.findOne({_id: messageId, ownerId: user._id }).exec();
if (!message) return false;
await Inbox.remove({_id: message._id, ownerId: user._id}).exec();
}
return true;
}
export async function clearPMs (user) {
user.inbox.newMessages = 0;
// compatibility
user.inbox.messages = {};
user.markModified('inbox.messages');
await Promise.all([
user.save(),
Inbox.remove({ownerId: user._id}).exec(),
]);
}