feat: comments post min delay
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user