feat: init recently module

This commit is contained in:
Innei
2021-09-09 12:12:47 +08:00
parent 25657fc2c4
commit 80af238299
6 changed files with 178 additions and 6 deletions

View File

@@ -36,6 +36,7 @@ import { OptionModule } from './modules/option/option.module'
import { PageModule } from './modules/page/page.module'
import { PostModule } from './modules/post/post.module'
import { ProjectModule } from './modules/project/project.module'
import { RecentlyModule } from './modules/recently/recently.module'
import { SayModule } from './modules/say/say.module'
import { ToolModule } from './modules/tool/tool.module'
import { UserModule } from './modules/user/user.module'
@@ -80,6 +81,7 @@ import { HelperModule } from './processors/helper/helper.module'
PageModule,
PostModule,
ProjectModule,
RecentlyModule,
SayModule,
ToolModule,
UserModule,

View File

@@ -0,0 +1,61 @@
import {
BadRequestException,
Body,
Controller,
Delete,
Get,
HttpCode,
HttpStatus,
Param,
Post,
Query,
} from '@nestjs/common'
import { Auth } from '~/common/decorator/auth.decorator'
import { ApiName } from '~/common/decorator/openapi.decorator'
import { MongoIdDto } from '~/shared/dto/id.dto'
import { OffsetDto } from '~/shared/dto/pager.dto'
import { RecentlyModel } from './recently.model'
import { RecentlyService } from './recently.service'
@Controller('recently')
@ApiName
export class RecentlyController {
constructor(private readonly recentlyService: RecentlyService) {}
@Get('/latest')
async getLatestOne() {
return await this.recentlyService.getLatestOne()
}
@Get('/')
async getList(@Query() query: OffsetDto) {
const { before, after, size } = query
if (before && after) {
throw new BadRequestException('before or after must choice one')
}
return await this.recentlyService.getOffset({ before, after, size })
}
@Post('/')
@Auth()
@HttpCode(HttpStatus.CREATED)
async create(@Body() body: RecentlyModel) {
const res = await this.recentlyService.create(body)
return res
}
@Delete('/:id')
@Auth()
@HttpCode(HttpStatus.NO_CONTENT)
async del(@Param() { id }: MongoIdDto) {
const res = await this.recentlyService.delete(id)
if (!res) {
throw new BadRequestException('删除失败, 条目不存在')
}
return
}
}

View File

@@ -0,0 +1,23 @@
import { ObjectType } from '@nestjs/graphql'
import { modelOptions, prop } from '@typegoose/typegoose'
import { IsOptional, IsString } from 'class-validator'
import { BaseModel } from '~/shared/model/base.model'
@ObjectType()
@modelOptions({
options: {
customName: 'Recently',
},
})
export class RecentlyModel extends BaseModel {
@prop({ required: true })
@IsString()
content: string
@prop()
@IsOptional()
@IsString()
project?: string
@prop()
@IsString()
language?: string
}

View File

@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common'
import { RecentlyController } from './recently.controller'
import { RecentlyService } from './recently.service'
@Module({
controllers: [RecentlyController],
providers: [RecentlyService],
exports: [RecentlyService],
})
export class RecentlyModule {}

View File

@@ -0,0 +1,74 @@
import { Injectable } from '@nestjs/common'
import { InjectModel } from 'nestjs-typegoose'
import { EventTypes } from '~/processors/gateway/events.types'
import { WebEventsGateway } from '~/processors/gateway/web/events.gateway'
import { RecentlyModel } from './recently.model'
@Injectable()
export class RecentlyService {
constructor(
@InjectModel(RecentlyModel)
private readonly recentlyModel: MongooseModel<RecentlyModel>,
private readonly gateway: WebEventsGateway,
) {}
public get model() {
return this.recentlyModel
}
async getOffset({
before,
size,
after,
}: {
before?: string
size?: number
after?: string
}) {
size = size ?? 10
return await this.model
.find(
after
? {
_id: {
$gt: after,
},
}
: before
? { _id: { $lt: before } }
: {},
)
.limit(size)
.sort({ _id: -1 })
.lean()
}
async getLatestOne() {
return await this.model.findOne().sort({ created: -1 }).lean()
}
async create(model: RecentlyModel) {
const res = await this.model.create({
content: model.content,
language: model.language,
project: model.project,
})
process.nextTick(async () => {
await this.gateway.broadcast(EventTypes.RECENTLY_CREATE, res)
})
return res
}
async delete(id: string) {
const { deletedCount } = await this.model.deleteOne({
_id: id,
})
const isDeleted = deletedCount === 1
process.nextTick(async () => {
if (isDeleted) {
await this.gateway.broadcast(EventTypes.RECENTLY_DElETE, { id })
}
})
return isDeleted
}
}

View File

@@ -8,23 +8,25 @@ import { LinkModel } from '~/modules/link/link.model'
import { NoteModel } from '~/modules/note/note.model'
import { PageModel } from '~/modules/page/page.model'
import { ProjectModel } from '~/modules/project/project.model'
import { RecentlyModel } from '~/modules/recently/recently.model'
import { SayModel } from '~/modules/say/say.model'
import { CategoryModel } from '../../modules/category/category.model'
import { PostModel } from '../../modules/post/post.model'
import { UserModel } from '../../modules/user/user.model'
const models = TypegooseModule.forFeature([
UserModel,
PostModel,
AnalyzeModel,
CategoryModel,
CommentModel,
NoteModel,
PageModel,
OptionModel,
LinkModel,
NoteModel,
OptionModel,
PageModel,
PostModel,
ProjectModel,
RecentlyModel,
SayModel,
AnalyzeModel,
UserModel,
])
@Module({
imports: [