feat: comment service init
This commit is contained in:
@@ -63,6 +63,7 @@
|
||||
"mongoose-paginate-v2": "^1.4.2",
|
||||
"nanoid": "^3.1.25",
|
||||
"nestjs-typegoose": "^7.1.38",
|
||||
"nodemailer": "^6.6.3",
|
||||
"passport": "^0.4.1",
|
||||
"passport-jwt": "^4.0.0",
|
||||
"redis": "3.1.2",
|
||||
@@ -83,6 +84,7 @@
|
||||
"@types/lodash": "^4.14.172",
|
||||
"@types/mongoose-paginate-v2": "^1.3.11",
|
||||
"@types/node": "^16.7.1",
|
||||
"@types/nodemailer": "^6.4.4",
|
||||
"@types/passport-jwt": "^3.0.6",
|
||||
"@types/passport-local": "^1.0.34",
|
||||
"@types/redis": "2.8.31",
|
||||
|
||||
15
pnpm-lock.yaml
generated
15
pnpm-lock.yaml
generated
@@ -24,6 +24,7 @@ specifiers:
|
||||
'@types/lodash': ^4.14.172
|
||||
'@types/mongoose-paginate-v2': ^1.3.11
|
||||
'@types/node': ^16.7.1
|
||||
'@types/nodemailer': ^6.4.4
|
||||
'@types/passport-jwt': ^3.0.6
|
||||
'@types/passport-local': ^1.0.34
|
||||
'@types/redis': 2.8.31
|
||||
@@ -50,6 +51,7 @@ specifiers:
|
||||
mongoose-paginate-v2: ^1.4.2
|
||||
nanoid: ^3.1.25
|
||||
nestjs-typegoose: ^7.1.38
|
||||
nodemailer: ^6.6.3
|
||||
passport: ^0.4.1
|
||||
passport-jwt: ^4.0.0
|
||||
prettier: ^2.3.2
|
||||
@@ -96,6 +98,7 @@ dependencies:
|
||||
mongoose-paginate-v2: 1.4.2
|
||||
nanoid: 3.1.25
|
||||
nestjs-typegoose: 7.1.38_bb3ea2c1752afb15cff36bd3a0bffc79
|
||||
nodemailer: 6.6.3
|
||||
passport: 0.4.1
|
||||
passport-jwt: 4.0.0
|
||||
redis: 3.1.2
|
||||
@@ -116,6 +119,7 @@ devDependencies:
|
||||
'@types/lodash': 4.14.172
|
||||
'@types/mongoose-paginate-v2': 1.3.11
|
||||
'@types/node': 16.7.8
|
||||
'@types/nodemailer': 6.4.4
|
||||
'@types/passport-jwt': 3.0.6
|
||||
'@types/passport-local': 1.0.34
|
||||
'@types/redis': 2.8.31
|
||||
@@ -1394,6 +1398,12 @@ packages:
|
||||
/@types/node/16.7.8:
|
||||
resolution: {integrity: sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==}
|
||||
|
||||
/@types/nodemailer/6.4.4:
|
||||
resolution: {integrity: sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==}
|
||||
dependencies:
|
||||
'@types/node': 16.7.8
|
||||
dev: true
|
||||
|
||||
/@types/parse-json/4.0.0:
|
||||
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
|
||||
dev: true
|
||||
@@ -4983,6 +4993,11 @@ packages:
|
||||
resolution: {integrity: sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==}
|
||||
dev: true
|
||||
|
||||
/nodemailer/6.6.3:
|
||||
resolution: {integrity: sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
dev: false
|
||||
|
||||
/nopt/5.0.0:
|
||||
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { Module } from '@nestjs/common'
|
||||
import { UserModule } from '../user/user.module'
|
||||
import { CommentService } from './comment.service'
|
||||
|
||||
@Module({
|
||||
controllers: [],
|
||||
providers: [CommentService],
|
||||
exports: [CommentService],
|
||||
imports: [UserModule],
|
||||
})
|
||||
export class CommentModule {}
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
import { Injectable } from '@nestjs/common'
|
||||
import { Injectable, Logger } from '@nestjs/common'
|
||||
import { ReturnModelType } from '@typegoose/typegoose'
|
||||
import { InjectModel } from 'nestjs-typegoose'
|
||||
import { hasChinese } from '~/utils/index.util'
|
||||
import { ConfigsService } from '../configs/configs.service'
|
||||
import { NoteModel } from '../note/note.model'
|
||||
import { PageModel } from '../page/page.model'
|
||||
import { PostModel } from '../post/post.model'
|
||||
import { CommentModel } from './comment.model'
|
||||
import { UserService } from '../user/user.service'
|
||||
import BlockedKeywords from './block-keywords.json'
|
||||
import { CommentModel, CommentRefTypes } from './comment.model'
|
||||
@Injectable()
|
||||
export class CommentService {
|
||||
private readonly logger: Logger = new Logger(CommentService.name)
|
||||
constructor(
|
||||
@InjectModel(CommentModel)
|
||||
private readonly commentModel: MongooseModel<CommentModel>,
|
||||
@@ -19,5 +23,62 @@ export class CommentService {
|
||||
@InjectModel(PageModel)
|
||||
private readonly pageModel: ReturnModelType<typeof PageModel>,
|
||||
private readonly configs: ConfigsService,
|
||||
private readonly userService: UserService,
|
||||
) {}
|
||||
|
||||
private getModelByRefType(type: CommentRefTypes) {
|
||||
const map = new Map(
|
||||
Object.entries({
|
||||
Post: this.postModel,
|
||||
Note: this.noteModel,
|
||||
Page: this.pageModel,
|
||||
}),
|
||||
)
|
||||
return map.get(type) as any as ReturnModelType<
|
||||
typeof NoteModel | typeof PostModel | typeof PageModel
|
||||
>
|
||||
}
|
||||
|
||||
async checkSpam(doc: Partial<CommentModel>) {
|
||||
const res = await (async () => {
|
||||
const commentOptions = this.configs.get('commentOptions')
|
||||
if (!commentOptions.antiSpam) {
|
||||
return false
|
||||
}
|
||||
const master = await this.userService.getMaster()
|
||||
if (doc.author === master.username) {
|
||||
return false
|
||||
}
|
||||
if (commentOptions.blockIps) {
|
||||
const isBlock = commentOptions.blockIps.some((ip) =>
|
||||
new RegExp(ip, 'ig').test(doc.ip),
|
||||
)
|
||||
if (isBlock) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
const customKeywords = commentOptions.spamKeywords || []
|
||||
const isBlock = [...customKeywords, ...BlockedKeywords].some((keyword) =>
|
||||
new RegExp(keyword, 'ig').test(doc.text),
|
||||
)
|
||||
|
||||
if (isBlock) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (commentOptions.disableNoChinese && !hasChinese(doc.text)) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})()
|
||||
if (res) {
|
||||
this.logger.warn(
|
||||
'--> 检测到一条垃圾评论: ' +
|
||||
`作者: ${doc.author}, IP: ${doc.ip}, 内容为: ${doc.text}`,
|
||||
)
|
||||
}
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
/*
|
||||
* @Author: Innei
|
||||
* @Date: 2020-05-08 17:02:08
|
||||
* @LastEditTime: 2020-09-09 13:36:59
|
||||
* @LastEditors: Innei
|
||||
* @FilePath: /mx-server/src/common/global/configs/configs.module.ts
|
||||
* @Copyright
|
||||
*/
|
||||
|
||||
import { Global, Module } from '@nestjs/common'
|
||||
import { ConfigsService } from './configs.service'
|
||||
|
||||
|
||||
@@ -55,6 +55,10 @@ export class UserService {
|
||||
async hasMaster() {
|
||||
return !!(await this.userModel.countDocuments())
|
||||
}
|
||||
|
||||
getMaster() {
|
||||
return this.userModel.findOne().lean()
|
||||
}
|
||||
async createMaster(
|
||||
model: Pick<UserModel, 'username' | 'name' | 'password'> &
|
||||
Partial<Pick<UserModel, 'introduce' | 'avatar' | 'url'>>,
|
||||
|
||||
Reference in New Issue
Block a user