Files
core/src/modules/comment/comment.model.ts
2022-01-18 13:39:28 +08:00

117 lines
2.2 KiB
TypeScript

import {
DocumentType,
modelOptions,
pre,
prop,
Ref,
} from '@typegoose/typegoose'
import { BeAnObject } from '@typegoose/typegoose/lib/types'
import { Query, Types } from 'mongoose'
import { BaseModel } from '~/shared/model/base.model'
import { getAvatar } from '~/utils'
import { NoteModel } from '../note/note.model'
import { PageModel } from '../page/page.model'
import { PostModel } from '../post/post.model'
function autoPopulateSubs(
this: Query<
any,
DocumentType<CommentModel, BeAnObject>,
{},
DocumentType<CommentModel, BeAnObject>
>,
next: () => void,
) {
this.populate({ options: { sort: { created: -1 } }, path: 'children' })
next()
}
export enum CommentRefTypes {
Post = 'Post',
Note = 'Note',
Page = 'Page',
}
export enum CommentState {
Unread,
Read,
Junk,
}
@pre<CommentModel>('findOne', autoPopulateSubs)
@pre<CommentModel>('find', autoPopulateSubs)
@modelOptions({
options: {
customName: 'Comment',
},
})
export class CommentModel extends BaseModel {
@prop({ refPath: 'refType' })
ref: Ref<PostModel | NoteModel | PageModel>
@prop({ required: true, default: 'PostModel', enum: CommentRefTypes })
refType: CommentRefTypes
@prop({ trim: true, required: true })
author!: string
@prop({ trim: true })
mail?: string
@prop({ trim: true })
url?: string
@prop({ required: true })
text!: string
// 0 : 未读
// 1 : 已读
// 2 : 垃圾
@prop({ default: 0 })
state?: CommentState
@prop({ ref: () => CommentModel })
parent?: Ref<CommentModel>
@prop({ ref: () => CommentModel, type: Types.ObjectId })
children?: Ref<CommentModel>[]
@prop({ default: 1 })
commentsIndex?: number
@prop()
key?: string
@prop({ select: false })
ip?: string
@prop({ select: false })
agent?: string
@prop({
ref: () => PostModel,
foreignField: '_id',
localField: 'ref',
justOne: true,
})
public post: Ref<PostModel>
@prop({
ref: () => NoteModel,
foreignField: '_id',
localField: 'ref',
justOne: true,
})
public note: Ref<NoteModel>
@prop({
ref: () => PageModel,
foreignField: '_id',
localField: 'ref',
justOne: true,
})
public page: Ref<PageModel>
public get avatar() {
return getAvatar(this.mail)
}
}