cubash-archive/models/teamWall.js

118 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var md = require('../kaverti_modules/markdown-it')({
html: false, // Enable HTML tags in source
xhtmlOut: false, // Use '/' to close single tags (<br />).
// This is only for full CommonMark compatibility.
breaks: true, // Convert '\n' in paragraphs into <br>
langPrefix: 'language-', // CSS language prefix for fenced blocks. Can be
// useful for external highlighters.
linkify: true, // Autoconvert URL-like text to links
image: false,
// Enable some language-neutral replacement + quotes beautification
typographer: true,
// Double + single quotes replacement pairs, when typographer enabled,
// and smartquotes on. Could be either a String or an Array.
//
// For example, you can use '«»„“' for Russian, '„“‚‘' for German,
// and ['«\xA0', '\xA0»', '\xA0', '\xA0'] for French (including nbsp).
quotes: '“”‘’',
// Highlighter function. Should return escaped HTML,
// or '' if the source string is not changed and should be escaped externally.
// If result starts with <pre... internal wrapper is skipped.
highlight: function (/*str, lang*/) { return ''; }
});
md.disable('image')
var emoji = require('markdown-it-emoji');
var twemoji = require('twemoji')
md.use(emoji);
md.renderer.rules.emoji = function(token, idx) {
return twemoji.parse(token[idx].content);
};
let createDOMPurify = require('dompurify');
let { JSDOM } = require('jsdom');
let window = new JSDOM('').window;
let DOMPurify = createDOMPurify(window);
var escaped_str = require('querystring')
const Errors = require('../lib/errors')
let pagination = require('../lib/pagination.js')
module.exports = (sequelize, DataTypes) => {
let teamWall = sequelize.define('teamWall', {
content: {
type: DataTypes.TEXT,
set (val) {
if(!val) {
throw Errors.sequelizeValidation(sequelize, {
error: 'content must be a string',
path: 'content'
})
}
let rawHTML = md.render(val);
let cleanHTML = DOMPurify.sanitize(rawHTML);
let plainText = (new JSDOM(cleanHTML)).window.document.body.textContent;
if (!plainText.trim().length) {
throw Errors.sequelizeValidation(sequelize, {
error: 'Post content must not be empty',
path: 'content'
})
}
this.setDataValue('content', cleanHTML)
this.setDataValue('plainText', plainText)
},
allowNull: false
},
plainText: {
type: DataTypes.TEXT,
},
postNumber: DataTypes.INTEGER,
replyingToUsername: DataTypes.STRING,
teamId: DataTypes.BIGINT,
removed: {
type: DataTypes.BOOLEAN,
defaultValue: false
}
})
teamWall.associate = function (models) {
teamWall.belongsTo(models.User, { as: 'fromUser' })
}
teamWall.includeOptions = function () {
let models = sequelize.models
return [
{ model: models.User, as: 'fromUser', attributes: ['username', 'createdAt', 'id', 'color', 'picture'] },
]
}
teamWall.prototype.getMeta = function (limit) {
let Post = sequelize.models.userWall
let meta = {}
let nextId = pagination.getNextIdDesc(userWall, {fromUserId: this.id}, this.Posts)
if (nextId === null) {
meta.nextURL = null
meta.nextPostsCount = 0
} else {
meta.nextURL =
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `wall/show/${this.username}?posts=true&limit=${limit}&from=${nextId - 1}`
meta.nextPostsCount = pagination.getNextCount(
Post, this.Posts, limit,
{fromUserId: this.id},
true
)
}
return meta
}
return teamWall
}