Commit e7460550 authored by NGPixel's avatar NGPixel

feat: comments post min delay

parent 8a749047
...@@ -131,11 +131,12 @@ export default { ...@@ -131,11 +131,12 @@ export default {
methods: { methods: {
onIntersect (entries, observer, isIntersecting) { onIntersect (entries, observer, isIntersecting) {
if (isIntersecting) { if (isIntersecting) {
this.fetch() this.fetch(true)
} }
}, },
async fetch () { async fetch (silent = false) {
this.isLoading = true this.isLoading = true
try {
const results = await this.$apollo.query({ const results = await this.$apollo.query({
query: gql` query: gql`
query ($locale: String!, $path: String!) { query ($locale: String!, $path: String!) {
...@@ -165,6 +166,16 @@ export default { ...@@ -165,6 +166,16 @@ export default {
c.initials = initials c.initials = initials
return c return c
}) })
} catch (err) {
console.warn(err)
if (!silent) {
this.$store.commit('showNotification', {
style: 'red',
message: err.message,
icon: 'alert'
})
}
}
this.isLoading = false this.isLoading = false
this.hasLoadedOnce = true this.hasLoadedOnce = true
}, },
...@@ -214,6 +225,7 @@ export default { ...@@ -214,6 +225,7 @@ export default {
return return
} }
try {
const resp = await this.$apollo.mutate({ const resp = await this.$apollo.mutate({
mutation: gql` mutation: gql`
mutation ( mutation (
...@@ -264,9 +276,12 @@ export default { ...@@ -264,9 +276,12 @@ export default {
this.$vuetify.goTo(`#comment-post-id-${_.get(resp, 'data.comments.create.id', 0)}`, this.scrollOpts) this.$vuetify.goTo(`#comment-post-id-${_.get(resp, 'data.comments.create.id', 0)}`, this.scrollOpts)
}) })
} else { } else {
throw new Error(_.get(resp, 'data.comments.create.responseResult.message', 'An unexpected error occured.'))
}
} catch (err) {
this.$store.commit('showNotification', { this.$store.commit('showNotification', {
style: 'red', style: 'red',
message: _.get(resp, 'data.comments.create.responseResult.message', 'An unexpected error occured.'), message: err.message,
icon: 'alert' icon: 'alert'
}) })
} }
...@@ -286,6 +301,7 @@ export default { ...@@ -286,6 +301,7 @@ export default {
this.isBusy = true this.isBusy = true
this.deleteCommentDialogShown = false this.deleteCommentDialogShown = false
try {
const resp = await this.$apollo.mutate({ const resp = await this.$apollo.mutate({
mutation: gql` mutation: gql`
mutation ( mutation (
...@@ -319,9 +335,12 @@ export default { ...@@ -319,9 +335,12 @@ export default {
this.comments = _.reject(this.comments, ['id', this.commentToDelete.id]) this.comments = _.reject(this.comments, ['id', this.commentToDelete.id])
} else { } else {
throw new Error(_.get(resp, 'data.comments.delete.responseResult.message', 'An unexpected error occured.'))
}
} catch (err) {
this.$store.commit('showNotification', { this.$store.commit('showNotification', {
style: 'red', style: 'red',
message: _.get(resp, 'data.comments.delete.responseResult.message', 'An unexpected error occured.'), message: err.message,
icon: 'alert' icon: 'alert'
}) })
} }
...@@ -362,6 +381,7 @@ export default { ...@@ -362,6 +381,7 @@ export default {
img { img {
max-width: 100%; max-width: 100%;
border-radius: 5px;
} }
code { code {
......
...@@ -42,7 +42,7 @@ type CommentMutation { ...@@ -42,7 +42,7 @@ type CommentMutation {
content: String! content: String!
guestName: String guestName: String
guestEmail: String guestEmail: String
): CommentCreateResponse @auth(requires: ["write:comments", "manage:system"]) ): CommentCreateResponse @auth(requires: ["write:comments", "manage:system"]) @rateLimit(limit: 1, duration: 15)
update( update(
id: Int! id: Int!
......
...@@ -4,6 +4,7 @@ const { JSDOM } = require('jsdom') ...@@ -4,6 +4,7 @@ const { JSDOM } = require('jsdom')
const createDOMPurify = require('dompurify') const createDOMPurify = require('dompurify')
const _ = require('lodash') const _ = require('lodash')
const { AkismetClient } = require('akismet-api') const { AkismetClient } = require('akismet-api')
const moment = require('moment')
/* global WIKI */ /* global WIKI */
...@@ -106,6 +107,14 @@ module.exports = { ...@@ -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 // -> Save Comment to DB
const cm = await WIKI.models.comments.query().insert(newComment) const cm = await WIKI.models.comments.query().insert(newComment)
......
...@@ -12,11 +12,12 @@ props: ...@@ -12,11 +12,12 @@ props:
title: Akismet API Key title: Akismet API Key
default: '' default: ''
hint: 'Prevent spam by using the Akismet service. Enter your API key here to enable. Leave empty to disable.' hint: 'Prevent spam by using the Akismet service. Enter your API key here to enable. Leave empty to disable.'
maxWidth: 650
order: 1 order: 1
minDelay: minDelay:
type: Number type: Number
title: Post delay title: Post delay
default: 30 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 maxWidth: 400
order: 2 order: 2
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment