Files
DiceCloud/app/imports/api/tabletop/Messages.js
2022-10-09 16:01:36 +02:00

116 lines
2.5 KiB
JavaScript

import SimpleSchema from 'simpl-schema';
import { ValidatedMethod } from 'meteor/mdg:validated-method';
import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
import Creatures from '/imports/api/creature/creatures/Creatures.js';
import Tabletops, { assertUserInTabletop } from '/imports/api/tabletop/Tabletops.js';
let Messages = new Mongo.Collection('messages');
let MessagesSchema = new SimpleSchema({
tabletopId: {
type: String,
regEx: SimpleSchema.RegEx.id,
},
content: {
type: String,
max: 1000,
},
timestamp: {
type: Date,
index: 1,
},
userId: {
type: String,
regEx: SimpleSchema.RegEx.id,
},
username: {
type: String,
},
});
Messages.attachSchema(MessagesSchema);
const sendMessage = new ValidatedMethod({
name: 'messages.send',
validate: new SimpleSchema({
content: {
type: String,
max: 1000,
},
tabletopId: {
type: String,
regEx: SimpleSchema.RegEx.id,
},
}).validator(),
mixins: [RateLimiterMixin],
rateLimit: {
numRequests: 10,
timeInterval: 5000,
},
run({ content, tabletopId }) {
let user = Meteor.user();
if (!user) {
throw new Meteor.Error('messages.send.denied',
'You need to be logged in to send a message');
}
assertUserInTabletop(tabletopId, this.userId);
return Messages.insert({
content,
tabletopId,
timestamp: new Date(),
userId: user._id,
username: user.username,
});
},
});
const removeMessages = new ValidatedMethod({
name: 'messages.remove',
validate: new SimpleSchema({
messageId: {
type: String,
regEx: SimpleSchema.RegEx.id,
},
}).validator(),
mixins: [RateLimiterMixin],
rateLimit: {
numRequests: 5,
timeInterval: 5000,
},
run({ messageId, tabletopId }) {
if (!this.userId) {
throw new Meteor.Error('messages.remove.denied',
'You need to be logged in to remove a tabletop');
}
let message = Messages.findOne(messageId);
let tabletop = Tabletops.findOne(message.tabletopId);
if (this.userId !== message.userId && this.userId !== tabletop.gameMaster) {
throw new Meteor.Error('messages.remove.denied',
'You don\'t have permission to remove this message');
}
let removed = Messages.remove({
_id: messageId,
});
Creatures.update({
tabletop: tabletopId,
}, {
$unset: { tabletop: 1 },
});
return removed;
},
});
export default Messages;
export { sendMessage, removeMessages };