feat: init recently module
This commit is contained in:
@@ -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,
|
||||
|
||||
61
src/modules/recently/recently.controller.ts
Normal file
61
src/modules/recently/recently.controller.ts
Normal 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
|
||||
}
|
||||
}
|
||||
23
src/modules/recently/recently.model.ts
Normal file
23
src/modules/recently/recently.model.ts
Normal 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
|
||||
}
|
||||
10
src/modules/recently/recently.module.ts
Normal file
10
src/modules/recently/recently.module.ts
Normal 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 {}
|
||||
74
src/modules/recently/recently.service.ts
Normal file
74
src/modules/recently/recently.service.ts
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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: [
|
||||
|
||||
Reference in New Issue
Block a user