feat: comments post min delay

This commit is contained in:
NGPixel 2020-05-31 15:54:20 -04:00
parent 8a74904731
commit e74605501f
4 changed files with 133 additions and 103 deletions

View File

@ -131,11 +131,12 @@ export default {
methods: {
onIntersect (entries, observer, isIntersecting) {
if (isIntersecting) {
this.fetch()
this.fetch(true)
}
},
async fetch () {
async fetch (silent = false) {
this.isLoading = true
try {
const results = await this.$apollo.query({
query: gql`
query ($locale: String!, $path: String!) {
@ -165,6 +166,16 @@ export default {
c.initials = initials
return c
})
} catch (err) {
console.warn(err)
if (!silent) {
this.$store.commit('showNotification', {
style: 'red',
message: err.message,
icon: 'alert'
})
}
}
this.isLoading = false
this.hasLoadedOnce = true
},
@ -214,6 +225,7 @@ export default {
return
}
try {
const resp = await this.$apollo.mutate({
mutation: gql`
mutation (
@ -264,9 +276,12 @@ export default {
this.$vuetify.goTo(`#comment-post-id-${_.get(resp, 'data.comments.create.id', 0)}`, this.scrollOpts)
})
} else {
throw new Error(_.get(resp, 'data.comments.create.responseResult.message', 'An unexpected error occured.'))
}
} catch (err) {
this.$store.commit('showNotification', {
style: 'red',
message: _.get(resp, 'data.comments.create.responseResult.message', 'An unexpected error occured.'),
message: err.message,
icon: 'alert'
})
}
@ -286,6 +301,7 @@ export default {
this.isBusy = true
this.deleteCommentDialogShown = false
try {
const resp = await this.$apollo.mutate({
mutation: gql`
mutation (
@ -319,9 +335,12 @@ export default {
this.comments = _.reject(this.comments, ['id', this.commentToDelete.id])
} else {
throw new Error(_.get(resp, 'data.comments.delete.responseResult.message', 'An unexpected error occured.'))
}
} catch (err) {
this.$store.commit('showNotification', {
style: 'red',
message: _.get(resp, 'data.comments.delete.responseResult.message', 'An unexpected error occured.'),
message: err.message,
icon: 'alert'
})
}
@ -362,6 +381,7 @@ export default {
img {
max-width: 100%;
border-radius: 5px;
}
code {

View File

@ -42,7 +42,7 @@ type CommentMutation {
content: String!
guestName: String
guestEmail: String
): CommentCreateResponse @auth(requires: ["write:comments", "manage:system"])
): CommentCreateResponse @auth(requires: ["write:comments", "manage:system"]) @rateLimit(limit: 1, duration: 15)
update(
id: Int!

View File

@ -4,6 +4,7 @@ const { JSDOM } = require('jsdom')
const createDOMPurify = require('dompurify')
const _ = require('lodash')
const { AkismetClient } = require('akismet-api')
const moment = require('moment')
/* global WIKI */
@ -106,6 +107,14 @@ module.exports = {
}
}
// -> Check for minimum delay between posts
if (WIKI.data.commentProvider.config.minDelay > 0) {
const lastComment = await WIKI.models.comments.query().select('updatedAt').findOne('authorId', user.id).orderBy('updatedAt', 'desc')
if (lastComment && moment().subtract(WIKI.data.commentProvider.config.minDelay, 'seconds').isBefore(lastComment.updatedAt)) {
throw new Error('Your administrator has set a time limit before you can post another comment. Try again later.')
}
}
// -> Save Comment to DB
const cm = await WIKI.models.comments.query().insert(newComment)

View File

@ -12,11 +12,12 @@ props:
title: Akismet API Key
default: ''
hint: 'Prevent spam by using the Akismet service. Enter your API key here to enable. Leave empty to disable.'
maxWidth: 650
order: 1
minDelay:
type: Number
title: Post delay
default: 30
hint: 'Minimum delay (in seconds) between comments per IP address.'
hint: 'Minimum delay (in seconds) between comments per account. Note that all guests are considered as a single account.'
maxWidth: 400
order: 2