Files
core/src/processors/database/database.service.ts
2021-12-21 16:35:28 +08:00

59 lines
2.0 KiB
TypeScript

import { Injectable } from '@nestjs/common'
import { ReturnModelType } from '@typegoose/typegoose'
import { InjectModel } from 'nestjs-typegoose'
import { NoteModel } from '~/modules/note/note.model'
import { PageModel } from '~/modules/page/page.model'
import { PostModel } from '~/modules/post/post.model'
@Injectable()
export class DatabaseService {
constructor(
@InjectModel(PostModel)
private readonly postModel: ReturnModelType<typeof PostModel>,
@InjectModel(NoteModel)
private readonly noteModel: ReturnModelType<typeof NoteModel>,
@InjectModel(PageModel)
private readonly pageModel: ReturnModelType<typeof PageModel>,
) {}
// @ts-ignore
public getModelByRefType(type: 'Post'): ReturnModelType<typeof PostModel>
public getModelByRefType(type: 'post'): ReturnModelType<typeof PostModel>
public getModelByRefType(type: 'Note'): ReturnModelType<typeof NoteModel>
public getModelByRefType(type: 'note'): ReturnModelType<typeof NoteModel>
public getModelByRefType(type: 'Page'): ReturnModelType<typeof PageModel>
public getModelByRefType(type: 'page'): ReturnModelType<typeof PageModel>
public getModelByRefType(type: any) {
type = type.toLowerCase() as any
// FIXME: lowercase key
const map = new Map<any, any>([
['post', this.postModel],
['note', this.noteModel],
['page', this.pageModel],
] as any)
return map.get(type) as any as ReturnModelType<
typeof NoteModel | typeof PostModel | typeof PageModel
>
}
public async findGlobalById(id: string) {
const doc = await Promise.all([
this.postModel.findById(id).populate('category').lean(),
this.noteModel.findById(id).lean().select('+password'),
this.pageModel.findById(id).lean(),
])
const index = doc.findIndex(Boolean)
if (index == -1) {
return {
document: null,
type: null,
}
}
const document = doc[index]
return {
document,
type: ['Post', 'Note', 'Page'][index],
}
}
}