import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' import { dbconn } from 'decorators/dbconn' // @ts-ignore import findOrCreate from 'mongoose-findorcreate' import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses' import { checkJson, noJson } from '../../decorators/nojson' import { BaseModule } from '../Base' const jsonExcludeKeys = ['updatedAt', '__v'] const saveExcludeKeys = ['createdAt', 'updatedAt', '__v', '_id'] export class ArticleAttachmemt { /** * 图片路径 * @type {string} */ @prop() public url: string /** * 图片描述 * @type {string} */ @prop() public desc: string /** * 排序 * @type {number} */ @prop() public sortno: number /** * 是否用作标题图 * @type {boolean} */ @prop({default: false}) public isMain: boolean } /** * 通用文章 */ interface ArticleClass extends Base, TimeStamps { } @dbconn() @index({'tags': 1}, {unique: false}) @modelOptions({ schemaOptions: { collection: 'articles', timestamps: true } }) class ArticleClass extends BaseModule { /** * 标题 * @type {string} */ @prop({ required: true }) public title!: string /** * 用于显示的 类型 * @type {string} */ @prop() public type: string /** * 内容 * @type {string} */ @prop() public content: string /** * 摘要 * @type {string} */ @prop() public summary: string /** * 内容相关时间, 一般和createAt相同 * @type {number} */ @prop() public displayTime: number /** * 作者 * @type {string} */ @prop() public author: string /** * 来源 * @type {string} */ @prop() public source: string /** * 来源链接 * @type {string} */ @prop() public sourceUrl: string @prop({_id: false, type: () => [ArticleAttachmemt]}) public attachments: ArticleAttachmemt[] /** * @type {string[]} */ @prop({ type: () => [String] }) public tags: string[] /** * 关键字 * @type {string[]} */ @prop({ type: () => [String] }) public keywords: string[] /** * 是否删除 * @type {boolean} */ @noJson() @prop({default: false}) public deleted: boolean @noJson() @prop() public deleteTime: Date /** * 自定义排序字段 * @type {number} */ @prop({default: 0}) public sortno: number /** * 创建人 * @type {string} */ @prop() public createdBy: string public updateFromReq(data: any) { for (let key in data) { if (saveExcludeKeys.indexOf(key) == -1) { this[key] = data[key] } } } public toJson() { let result: any = {} for (let key in this) { if (checkJson(this, key+'' ) && jsonExcludeKeys.indexOf(key) == -1) { result[key] = this[key] } } return result } public static parseQueryParam(params) { let {timeBegin, timeEnd} = params let opt: any = {deleted: false} if (timeBegin && !timeEnd) { opt.createdAt = {$gte: timeBegin}; } else if (timeBegin && timeEnd) { opt['$and'] = [{createdAt: {$gte: timeBegin}}, {createdAt: {$lte: timeEnd}}]; } else if (!timeBegin && timeEnd) { opt.createdAt = {$lte: timeEnd}; } let sort = {_id: -1} return { opt, sort } } } export const Article = getModelForClass(ArticleClass, { existingConnection: ArticleClass['db'] })