Files
habitica/website/server/models/webhook.js
Matteo Pagliazzi 98c019a0b6 Upgrade lodash to v4 and lint more files (#8495)
* common: import lodash modules separately

* remove test/content from .eslintignore, fix with eslint --fix content/index

* lint test/content

* lint content/index except for lodash methods

* upgrade server/models

* upgrade server/middlewares and server/libs

* port server/controllers/top-level

* port server/controllers/api-v3

* port views and tests

* client old port lodash and _(, missing _.

* upgrade client-old

* port common/script (root level files only)

* port common/script/fns

* port common/libs

* port common/script/ops

* port common/script/content and common/script/libs/shops.js

* misc fixes

* misc fixes

* misc fixes

* more tests fixes

* fix payments test stubbing, down to 2 failing tests

* remove more instances of lodash wrapping

* fix bug where toObject does not clone object

* fix tests

* upgrade migration or add lodash 4 note

* update shrinkwrap

* fix linting

* upgrade eslint-config-habitrpg

* update shrinkwrap

* recompile shrinkwrap
2017-03-01 17:10:48 +01:00

82 lines
2.0 KiB
JavaScript

import mongoose from 'mongoose';
import validator from 'validator';
import baseModel from '../libs/baseModel';
import shared from '../../common';
import {v4 as uuid} from 'uuid';
import _ from 'lodash';
import { BadRequest } from '../libs/errors';
const Schema = mongoose.Schema;
const TASK_ACTIVITY_DEFAULT_OPTIONS = Object.freeze({
created: false,
updated: false,
deleted: false,
scored: true,
});
export let schema = new Schema({
id: {
type: String,
required: true,
validate: [validator.isUUID, shared.i18n.t('invalidWebhookId')],
default: uuid,
},
type: {
type: String,
required: true,
enum: ['taskActivity', 'groupChatReceived'],
default: 'taskActivity',
},
label: {
type: String,
required: false,
default: '',
},
url: {
type: String,
required: true,
validate: [validator.isURL, shared.i18n.t('invalidUrl')],
},
enabled: { type: Boolean, required: true, default: true },
options: {
type: Schema.Types.Mixed,
required: true,
default () {
return {};
},
},
}, {
strict: true,
minimize: false, // So empty objects are returned
_id: false,
});
schema.plugin(baseModel, {
noSet: ['_id'],
timestamps: true,
_id: false,
});
schema.methods.formatOptions = function formatOptions (res) {
if (this.type === 'taskActivity') {
_.defaults(this.options, TASK_ACTIVITY_DEFAULT_OPTIONS);
this.options = _.pick(this.options, 'created', 'updated', 'deleted', 'scored');
let invalidOption = Object.keys(this.options)
.find(option => typeof this.options[option] !== 'boolean');
if (invalidOption) {
throw new BadRequest(res.t('webhookBooleanOption', { option: invalidOption }));
}
} else if (this.type === 'groupChatReceived') {
this.options = _.pick(this.options, 'groupId');
if (!validator.isUUID(this.options.groupId)) {
throw new BadRequest(res.t('groupIdRequired'));
}
}
};
export let model = mongoose.model('Webhook', schema);