mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-15 05:37:22 +01:00
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
This commit is contained in:
124
website/server/models/message.js
Normal file
124
website/server/models/message.js
Normal file
@@ -0,0 +1,124 @@
|
||||
import mongoose from 'mongoose';
|
||||
import baseModel from '../libs/baseModel';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { defaults } from 'lodash';
|
||||
|
||||
const defaultSchema = () => ({
|
||||
id: String,
|
||||
timestamp: Date,
|
||||
text: String,
|
||||
|
||||
// sender properties
|
||||
user: String, // profile name
|
||||
contributor: {type: mongoose.Schema.Types.Mixed},
|
||||
backer: {type: mongoose.Schema.Types.Mixed},
|
||||
uuid: String, // sender uuid
|
||||
userStyles: {type: mongoose.Schema.Types.Mixed},
|
||||
|
||||
flags: {type: mongoose.Schema.Types.Mixed, default: {}},
|
||||
flagCount: {type: Number, default: 0},
|
||||
likes: {type: mongoose.Schema.Types.Mixed},
|
||||
_meta: {type: mongoose.Schema.Types.Mixed},
|
||||
});
|
||||
|
||||
const chatSchema = new mongoose.Schema({
|
||||
...defaultSchema(),
|
||||
groupId: {type: String, ref: 'Group'},
|
||||
}, {
|
||||
minimize: false, // Allow for empty flags to be saved
|
||||
});
|
||||
|
||||
chatSchema.plugin(baseModel, {
|
||||
noSet: ['_id'],
|
||||
});
|
||||
|
||||
const inboxSchema = new mongoose.Schema({
|
||||
sent: {type: Boolean, default: false}, // if the owner sent this message
|
||||
// the uuid of the user where the message is stored,
|
||||
// we store two copies of each inbox messages:
|
||||
// one for the sender and one for the receiver
|
||||
ownerId: {type: String, ref: 'User'},
|
||||
...defaultSchema(),
|
||||
}, {
|
||||
minimize: false, // Allow for empty flags to be saved
|
||||
});
|
||||
|
||||
inboxSchema.plugin(baseModel, {
|
||||
noSet: ['_id'],
|
||||
});
|
||||
|
||||
export const chatModel = mongoose.model('Chat', chatSchema);
|
||||
export const inboxModel = mongoose.model('Inbox', inboxSchema);
|
||||
|
||||
export function setUserStyles (newMessage, user) {
|
||||
let userStyles = {};
|
||||
userStyles.items = {gear: {}};
|
||||
|
||||
let userCopy = user;
|
||||
if (user.toObject) userCopy = user.toObject();
|
||||
|
||||
if (userCopy.items) {
|
||||
userStyles.items.gear = {};
|
||||
userStyles.items.gear.costume = Object.assign({}, userCopy.items.gear.costume);
|
||||
userStyles.items.gear.equipped = Object.assign({}, userCopy.items.gear.equipped);
|
||||
|
||||
userStyles.items.currentMount = userCopy.items.currentMount;
|
||||
userStyles.items.currentPet = userCopy.items.currentPet;
|
||||
}
|
||||
|
||||
|
||||
if (userCopy.preferences) {
|
||||
userStyles.preferences = {};
|
||||
if (userCopy.preferences.style) userStyles.preferences.style = userCopy.preferences.style;
|
||||
userStyles.preferences.hair = userCopy.preferences.hair;
|
||||
userStyles.preferences.skin = userCopy.preferences.skin;
|
||||
userStyles.preferences.shirt = userCopy.preferences.shirt;
|
||||
userStyles.preferences.chair = userCopy.preferences.chair;
|
||||
userStyles.preferences.size = userCopy.preferences.size;
|
||||
userStyles.preferences.chair = userCopy.preferences.chair;
|
||||
userStyles.preferences.background = userCopy.preferences.background;
|
||||
userStyles.preferences.costume = userCopy.preferences.costume;
|
||||
}
|
||||
|
||||
if (userCopy.stats) {
|
||||
userStyles.stats = {};
|
||||
userStyles.stats.class = userCopy.stats.class;
|
||||
if (userCopy.stats.buffs) {
|
||||
userStyles.stats.buffs = {
|
||||
seafoam: userCopy.stats.buffs.seafoam,
|
||||
shinySeed: userCopy.stats.buffs.shinySeed,
|
||||
spookySparkles: userCopy.stats.buffs.spookySparkles,
|
||||
snowball: userCopy.stats.buffs.snowball,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
newMessage.userStyles = userStyles;
|
||||
newMessage.markModified('userStyles');
|
||||
}
|
||||
|
||||
export function messageDefaults (msg, user) {
|
||||
const id = uuid();
|
||||
const message = {
|
||||
id,
|
||||
_id: id,
|
||||
text: msg.substring(0, 3000),
|
||||
timestamp: Number(new Date()),
|
||||
likes: {},
|
||||
flags: {},
|
||||
flagCount: 0,
|
||||
};
|
||||
|
||||
if (user) {
|
||||
defaults(message, {
|
||||
uuid: user._id,
|
||||
contributor: user.contributor && user.contributor.toObject(),
|
||||
backer: user.backer && user.backer.toObject(),
|
||||
user: user.profile.name,
|
||||
});
|
||||
} else {
|
||||
message.uuid = 'system';
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
Reference in New Issue
Block a user