diff --git a/apps/core/src/common/interceptors/cache.interceptor.ts b/apps/core/src/common/interceptors/cache.interceptor.ts index f35f8675..d87b67b0 100644 --- a/apps/core/src/common/interceptors/cache.interceptor.ts +++ b/apps/core/src/common/interceptors/cache.interceptor.ts @@ -121,6 +121,7 @@ export class HttpCacheInterceptor implements NestInterceptor { setCacheHeader(res: FastifyReply, ttl: number) { if (res.raw.statusCode !== 200) return + res.header('x-mx-cache', 'hit') if (HTTP_CACHE.enableCDNHeader) { res.header( 'cdn-cache-control', diff --git a/apps/core/src/modules/activity/activity.controller.ts b/apps/core/src/modules/activity/activity.controller.ts index 3c8d04ec..5129961f 100644 --- a/apps/core/src/modules/activity/activity.controller.ts +++ b/apps/core/src/modules/activity/activity.controller.ts @@ -241,4 +241,9 @@ export class ActivityController { return [...postList, ...noteList] } + + @Get('/last-year/publication') + getLastYearPublication() { + return this.service.getLastYearPublication() + } } diff --git a/apps/core/src/modules/activity/activity.module.ts b/apps/core/src/modules/activity/activity.module.ts index f7d2a7bf..b037d463 100644 --- a/apps/core/src/modules/activity/activity.module.ts +++ b/apps/core/src/modules/activity/activity.module.ts @@ -1,8 +1,10 @@ -import { Module } from '@nestjs/common' +import { forwardRef, Module } from '@nestjs/common' import { GatewayModule } from '~/processors/gateway/gateway.module' import { CommentModule } from '../comment/comment.module' +import { NoteModule } from '../note/note.module' +import { PostModule } from '../post/post.module' import { ActivityController } from './activity.controller' import { ActivityService } from './activity.service' @@ -10,6 +12,12 @@ import { ActivityService } from './activity.service' providers: [ActivityService], controllers: [ActivityController], exports: [ActivityService], - imports: [GatewayModule, CommentModule], + imports: [ + GatewayModule, + CommentModule, + + forwardRef(() => PostModule), + forwardRef(() => NoteModule), + ], }) export class ActivityModule {} diff --git a/apps/core/src/modules/activity/activity.service.ts b/apps/core/src/modules/activity/activity.service.ts index 1f297aeb..27f9dabe 100644 --- a/apps/core/src/modules/activity/activity.service.ts +++ b/apps/core/src/modules/activity/activity.service.ts @@ -14,7 +14,13 @@ import type { } from './activity.interface' import type { UpdatePresenceDto } from './dtos/presence.dto' -import { BadRequestException, Injectable, Logger } from '@nestjs/common' +import { + BadRequestException, + forwardRef, + Inject, + Injectable, + Logger, +} from '@nestjs/common' import { ArticleTypeEnum } from '~/constants/article.constant' import { BusinessEvents, EventScope } from '~/constants/business-event.constant' @@ -35,6 +41,8 @@ import { checkRefModelCollectionType, getAvatar } from '~/utils' import { CommentState } from '../comment/comment.model' import { CommentService } from '../comment/comment.service' import { ConfigsService } from '../configs/configs.service' +import { NoteService } from '../note/note.service' +import { PostService } from '../post/post.service' import { Activity } from './activity.constant' import { ActivityModel } from './activity.model' import { @@ -66,6 +74,11 @@ export class ActivityService implements OnModuleInit, OnModuleDestroy { private readonly webGateway: WebEventsGateway, private readonly gatewayService: GatewayService, private readonly configsService: ConfigsService, + + @Inject(forwardRef(() => PostService)) + private readonly postService: PostService, + @Inject(forwardRef(() => NoteService)) + private readonly noteService: NoteService, ) { this.logger = new Logger(ActivityService.name) } @@ -621,4 +634,50 @@ export class ActivityService implements OnModuleInit, OnModuleDestroy { note, } } + + /** + * 获取过去一年的文章发布 + */ + async getLastYearPublication() { + const $gte = new Date(new Date().getTime() - 365 * 24 * 60 * 60 * 1000) + const [posts, notes] = await Promise.all([ + this.postService.model + .find({ + created: { + $gte, + }, + }) + .select('title created slug categoryId category') + .sort({ created: -1 }), + this.noteService.model + .find( + { + created: { + $gte, + }, + }, + { + title: 1, + created: 1, + nid: 1, + weather: 1, + mood: 1, + bookmark: 1, + password: 1, + hide: 1, + }, + ) + .lean(), + ]) + return { + posts, + notes: notes.map((note) => { + if (note.password || note.hide) { + note.title = '未公开的日记' + } + + return omit(note, 'password', 'hide') + }), + } + } } diff --git a/packages/api-client/controllers/activity.ts b/packages/api-client/controllers/activity.ts index efeb0122..f37feca1 100644 --- a/packages/api-client/controllers/activity.ts +++ b/packages/api-client/controllers/activity.ts @@ -3,6 +3,7 @@ import type { IController } from '~/interfaces/controller' import type { IRequestHandler } from '~/interfaces/request' import type { ActivityPresence, + LastYearPublication, RecentActivities, RoomsData, } from '~/models/activity' @@ -95,4 +96,8 @@ export class ActivityController implements IController { async getRecentActivities() { return this.proxy.recent.get() } + + async getLastYearPublication(): Promise { + return this.proxy(`last-year`).publication.get() + } } diff --git a/packages/api-client/models/activity.ts b/packages/api-client/models/activity.ts index b73ef206..2cf51696 100644 --- a/packages/api-client/models/activity.ts +++ b/packages/api-client/models/activity.ts @@ -100,3 +100,33 @@ export interface RecentRecent { down: number created: string } + +export interface LastYearPublication { + posts: PostsItem[] + notes: NotesItem[] +} + +interface PostsItem { + id: string + created: string + title: string + slug: string + categoryId: string + category: Category +} +interface Category { + id: string + type: number + name: string + slug: string + created: string +} +interface NotesItem { + id: string + created: string + title: string + mood: string + weather: string + nid: number + bookmark: boolean +}