feat: comment service init

This commit is contained in:
Innei
2021-09-03 17:03:21 +08:00
parent deca66e471
commit 4fcb0dfb5d
6 changed files with 86 additions and 11 deletions

View File

@@ -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
View File

@@ -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'}

View File

@@ -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 {}

View File

@@ -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
}
}

View File

@@ -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'

View File

@@ -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'>>,