import { Model } from 'objection' import validate from 'validate.js' import { Page } from './pages.mjs' import { User } from './users.mjs' /** * Comments model */ export class Comment extends Model { static get tableName() { return 'comments' } static get jsonSchema () { return { type: 'object', required: [], properties: { id: {type: 'integer'}, content: {type: 'string'}, render: {type: 'string'}, name: {type: 'string'}, email: {type: 'string'}, ip: {type: 'string'}, createdAt: {type: 'string'}, updatedAt: {type: 'string'} } } } static get relationMappings() { return { author: { relation: Model.BelongsToOneRelation, modelClass: User, join: { from: 'comments.authorId', to: 'users.id' } }, page: { relation: Model.BelongsToOneRelation, modelClass: Page, join: { from: 'comments.pageId', to: 'pages.id' } } } } $beforeUpdate() { this.updatedAt = new Date().toISOString() } $beforeInsert() { this.createdAt = new Date().toISOString() this.updatedAt = new Date().toISOString() } /** * Post New Comment */ static async postNewComment ({ pageId, replyTo, content, guestName, guestEmail, user, ip }) { // -> Input validation if (user.id === 2) { const validation = validate({ email: guestEmail.toLowerCase(), name: guestName }, { email: { email: true, length: { maximum: 255 } }, name: { presence: { allowEmpty: false }, length: { minimum: 2, maximum: 255 } } }, { format: 'flat' }) if (validation && validation.length > 0) { throw new WIKI.Error.InputInvalid(validation[0]) } } content = content.trim() if (content.length < 2) { throw new WIKI.Error.CommentContentMissing() } // -> Load Page const page = await WIKI.db.pages.getPageFromDb(pageId) if (page) { if (!WIKI.auth.checkAccess(user, ['write:comments'], { path: page.path, locale: page.locale })) { throw new WIKI.Error.CommentPostForbidden() } } else { throw new WIKI.Error.PageNotFound() } // -> Process by comment provider return WIKI.data.commentProvider.create({ page, replyTo, content, user: { ...user, ...(user.id === 2) ? { name: guestName, email: guestEmail } : {}, ip } }) } /** * Update an Existing Comment */ static async updateComment ({ id, content, user, ip }) { // -> Load Page const pageId = await WIKI.data.commentProvider.getPageIdFromCommentId(id) if (!pageId) { throw new WIKI.Error.CommentNotFound() } const page = await WIKI.db.pages.getPageFromDb(pageId) if (page) { if (!WIKI.auth.checkAccess(user, ['manage:comments'], { path: page.path, locale: page.locale })) { throw new WIKI.Error.CommentManageForbidden() } } else { throw new WIKI.Error.PageNotFound() } // -> Process by comment provider return WIKI.data.commentProvider.update({ id, content, page, user: { ...user, ip } }) } /** * Delete an Existing Comment */ static async deleteComment ({ id, user, ip }) { // -> Load Page const pageId = await WIKI.data.commentProvider.getPageIdFromCommentId(id) if (!pageId) { throw new WIKI.Error.CommentNotFound() } const page = await WIKI.db.pages.getPageFromDb(pageId) if (page) { if (!WIKI.auth.checkAccess(user, ['manage:comments'], { path: page.path, locale: page.locale })) { throw new WIKI.Error.CommentManageForbidden() } } else { throw new WIKI.Error.PageNotFound() } // -> Process by comment provider await WIKI.data.commentProvider.remove({ id, page, user: { ...user, ip } }) } }