feat: comments post min delay
This commit is contained in:
parent
8a74904731
commit
e74605501f
@ -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 {
|
||||
|
@ -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!
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user