From 287edf0defc47ef41b8aef8766e224f0e76150b3 Mon Sep 17 00:00:00 2001 From: surmon-china Date: Tue, 7 Dec 2021 23:50:48 +0800 Subject: [PATCH] feat: 3.6.2 --- CHANGELOG.md | 9 +++ package.json | 4 +- src/app.config.ts | 1 - src/constants/increment.constant.ts | 21 ++++++ src/decorators/query-params.decorator.ts | 9 ++- src/interceptors/transform.interceptor.ts | 18 +++-- src/interfaces/mongoose.interface.ts | 3 +- .../announcement/announcement.controller.ts | 6 +- .../announcement/announcement.model.ts | 5 +- .../announcement/announcement.service.ts | 5 +- src/modules/archive/archive.service.ts | 3 +- src/modules/article/article.controller.ts | 2 +- src/modules/article/article.model.ts | 5 +- src/modules/article/article.service.ts | 17 +++-- src/modules/category/category.controller.ts | 2 +- src/modules/category/category.model.ts | 5 +- src/modules/category/category.service.ts | 5 +- src/modules/comment/comment.controller.ts | 2 +- src/modules/comment/comment.model.ts | 7 +- src/modules/comment/comment.service.ts | 7 +- src/modules/tag/tag.controller.ts | 2 +- src/modules/tag/tag.model.ts | 5 +- src/modules/tag/tag.service.ts | 11 +-- src/processors/database/database.provider.ts | 4 +- src/transformers/mongoose.transformer.ts | 21 ------ src/utils/paginate.ts | 73 +++++++++++++++++++ yarn.lock | 20 +---- 27 files changed, 174 insertions(+), 98 deletions(-) create mode 100644 src/constants/increment.constant.ts delete mode 100755 src/transformers/mongoose.transformer.ts create mode 100644 src/utils/paginate.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c47ea95..1c0f8c51 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project will be documented in this file. +### v3.6.2 (2021-12-07) + +**Feature** + +- Remove `mongoose-paginate` +- Remove `APP.LIMIT` config +- Improve `AutoIncrementID.Config` +- Improve global paginate config + ### v3.6.0 (2021-12-06) **Feature** diff --git a/package.json b/package.json index 0d20ea00..4c0ea028 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nodepress", - "version": "3.6.0", + "version": "3.6.2", "description": "RESTful API service for Surmon.me blog", "author": { "name": "Surmon", @@ -62,7 +62,6 @@ "lodash": "^4.17.21", "moment": "^2.29.1", "mongoose": "~6.0.14", - "mongoose-paginate": "https://github.com/surmon-china/mongoose-paginate", "node-schedule": "^2.1.0", "nodemailer": "^6.7.2", "passport": "^0.5.0", @@ -83,7 +82,6 @@ "@types/express": "^4.17.13", "@types/jest": "27.0.3", "@types/lodash": "^4.14.177", - "@types/mongoose-paginate": "^5.0.10", "@types/node": "^16.11.12", "@types/node-schedule": "^1.3.2", "@types/passport-jwt": "^3.0.6", diff --git a/src/app.config.ts b/src/app.config.ts index b95c438c..f39ae596 100755 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -11,7 +11,6 @@ const ROOT_PATH = path.join(__dirname, '..') const packageJSON = require(path.resolve(ROOT_PATH, 'package.json')) export const APP = { - LIMIT: 16, PORT: 8000, MASTER: 'Surmon', NAME: 'Surmon.me', diff --git a/src/constants/increment.constant.ts b/src/constants/increment.constant.ts new file mode 100644 index 00000000..57374c50 --- /dev/null +++ b/src/constants/increment.constant.ts @@ -0,0 +1,21 @@ +/** + * @file Increment ID collection constant + * @description 用于自增表的配置 + * @module constant/increment + * @author Surmon + */ + +import { AutoIncrementIDOptions } from '@typegoose/auto-increment' + +export const generalAutoIncrementIDConfig: AutoIncrementIDOptions = { + field: 'id', + startAt: 1, + incrementBy: 1, + trackerCollection: 'identitycounters', + trackerModelName: 'identitycounter', + // https://github.com/typegoose/auto-increment + // https://github.com/typegoose/auto-increment/blob/master/src/autoIncrement.ts + // https://github.com/typegoose/auto-increment/issues/11 + // fieldKey: 'field', + // modelNameKey: 'modelName', +} diff --git a/src/decorators/query-params.decorator.ts b/src/decorators/query-params.decorator.ts index a50e2423..41725796 100755 --- a/src/decorators/query-params.decorator.ts +++ b/src/decorators/query-params.decorator.ts @@ -10,6 +10,7 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common' import { HttpForbiddenError } from '@app/errors/forbidden.error' import { HttpBadRequestError } from '@app/errors/bad-request.error' import { PublishState, PublicState, OriginState, CommentState, SortType } from '@app/interfaces/biz.interface' +import { PaginateOptions } from '@app/utils/paginate' // 预置转换器可选字段 export enum QueryParamsField { @@ -26,7 +27,7 @@ export enum QueryParamsField { } // 内部参数类型 -export interface QueryParamsConfig { +export interface QueryParamsConfig extends Omit { [key: string]: string | number | boolean | Types.ObjectId | Date | RegExp | QueryParamsConfig } @@ -165,11 +166,13 @@ export const QueryParams = createParamDecorator( { name: '每页数量/per_page', field: QueryParamsField.PerPage, - isAllowed: lodash.isUndefined(per_page) || (lodash.isInteger(per_page) && Number(per_page) > 0), + isAllowed: + lodash.isUndefined(per_page) || + (lodash.isInteger(per_page) && Number(per_page) > 0 && Number(per_page) <= 50), isIllegal: false, setValue() { if (per_page != null) { - options.limit = per_page + options.perPage = per_page } }, }, diff --git a/src/interceptors/transform.interceptor.ts b/src/interceptors/transform.interceptor.ts index 29ef77bc..4e92a613 100755 --- a/src/interceptors/transform.interceptor.ts +++ b/src/interceptors/transform.interceptor.ts @@ -6,11 +6,11 @@ import { Observable } from 'rxjs' import { map } from 'rxjs/operators' -import { PaginateResult } from 'mongoose' import { Reflector } from '@nestjs/core' import { Injectable, NestInterceptor, CallHandler, ExecutionContext } from '@nestjs/common' import { HttpResponseSuccess, HttpPaginateResult, ResponseStatus } from '@app/interfaces/http.interface' import { ResponseMessage } from '@app/interfaces/http.interface' +import { PaginateResult } from '@app/utils/paginate' import * as META from '@app/constants/meta.constant' import * as TEXT from '@app/constants/text.constant' @@ -18,12 +18,12 @@ import * as TEXT from '@app/constants/text.constant' export function transformDataToPaginate(data: PaginateResult, request?: any): HttpPaginateResult { return { data: data.docs, - params: request ? request.queryParams : null, + params: request?.queryParams || null, pagination: { total: data.total, current_page: data.page, - total_page: data.pages, - per_page: data.limit, + per_page: data.perPage, + total_page: data.totalPage, }, } } @@ -40,13 +40,15 @@ export class TransformInterceptor implements NestInterceptor(META.HTTP_SUCCESS_MESSAGE, target) || TEXT.HTTP_DEFAULT_SUCCESS_TEXT + const message = this.reflector.get(META.HTTP_SUCCESS_MESSAGE, target) const usePaginate = this.reflector.get(META.HTTP_RES_TRANSFORM_PAGINATE, target) return call$.pipe( map((data: any) => { - const result = !usePaginate ? data : transformDataToPaginate(data, request) - return { status: ResponseStatus.Success, message, result } + return { + result: usePaginate ? transformDataToPaginate(data, request) : data, + status: ResponseStatus.Success, + message: message || TEXT.HTTP_DEFAULT_SUCCESS_TEXT, + } }) ) } diff --git a/src/interfaces/mongoose.interface.ts b/src/interfaces/mongoose.interface.ts index 6f954191..03a00dc2 100755 --- a/src/interfaces/mongoose.interface.ts +++ b/src/interfaces/mongoose.interface.ts @@ -4,7 +4,8 @@ * @author Surmon */ +import { Document } from 'mongoose' import { ModelType } from '@typegoose/typegoose/lib/types' -import { PaginateModel, Document } from 'mongoose' +import { PaginateModel } from '@app/utils/paginate' export type MongooseModel = ModelType & PaginateModel diff --git a/src/modules/announcement/announcement.controller.ts b/src/modules/announcement/announcement.controller.ts index ee543e3f..e30a0d9e 100755 --- a/src/modules/announcement/announcement.controller.ts +++ b/src/modules/announcement/announcement.controller.ts @@ -5,12 +5,12 @@ */ import lodash from 'lodash' -import { PaginateResult } from 'mongoose' import { Controller, Get, Put, Post, Delete, Body, UseGuards } from '@nestjs/common' import { JwtAuthGuard } from '@app/guards/auth.guard' import { HumanizedJwtAuthGuard } from '@app/guards/humanized-auth.guard' -import { QueryParams, QueryParamsField as QueryField } from '@app/decorators/query-params.decorator' +import { QueryParams, QueryParamsField } from '@app/decorators/query-params.decorator' import { HttpProcessor } from '@app/decorators/http.decorator' +import { PaginateResult } from '@app/utils/paginate' import { Announcement, AnnouncementsPayload } from './announcement.model' import { AnnouncementService } from './announcement.service' @@ -23,7 +23,7 @@ export class AnnouncementController { @HttpProcessor.paginate() @HttpProcessor.handle('获取公告') getAnnouncements( - @QueryParams([QueryField.State]) { querys, options, origin } + @QueryParams([QueryParamsField.State]) { querys, options, origin } ): Promise> { const keyword = lodash.trim(origin.keyword) if (keyword) { diff --git a/src/modules/announcement/announcement.model.ts b/src/modules/announcement/announcement.model.ts index b8d7451e..1536418e 100755 --- a/src/modules/announcement/announcement.model.ts +++ b/src/modules/announcement/announcement.model.ts @@ -8,12 +8,13 @@ import { Types } from 'mongoose' import { AutoIncrementID } from '@typegoose/auto-increment' import { prop, plugin, modelOptions } from '@typegoose/typegoose' import { IsString, IsInt, IsIn, IsDefined, IsNotEmpty, IsArray, ArrayNotEmpty, ArrayUnique } from 'class-validator' -import { mongoosePaginate } from '@app/transformers/mongoose.transformer' +import { generalAutoIncrementIDConfig } from '@app/constants/increment.constant' import { getProviderByTypegooseClass } from '@app/transformers/model.transformer' +import { mongoosePaginate } from '@app/utils/paginate' import { PublishState } from '@app/interfaces/biz.interface' @plugin(mongoosePaginate) -@plugin(AutoIncrementID, { field: 'id', startAt: 1 }) +@plugin(AutoIncrementID, generalAutoIncrementIDConfig) @modelOptions({ schemaOptions: { timestamps: { diff --git a/src/modules/announcement/announcement.service.ts b/src/modules/announcement/announcement.service.ts index dbf080aa..6abd5521 100755 --- a/src/modules/announcement/announcement.service.ts +++ b/src/modules/announcement/announcement.service.ts @@ -4,10 +4,11 @@ * @author Surmon */ -import { PaginateResult, Types } from 'mongoose' +import { Types } from 'mongoose' import { Injectable } from '@nestjs/common' import { InjectModel } from '@app/transformers/model.transformer' import { MongooseModel } from '@app/interfaces/mongoose.interface' +import { PaginateResult, PaginateOptions } from '@app/utils/paginate' import { Announcement } from './announcement.model' @Injectable() @@ -18,7 +19,7 @@ export class AnnouncementService { ) {} // 请求公告列表 - public getList(querys, options): Promise> { + public getList(querys, options: PaginateOptions): Promise> { return this.announcementModel.paginate(querys, options) } diff --git a/src/modules/archive/archive.service.ts b/src/modules/archive/archive.service.ts index 03069fbc..135450d3 100755 --- a/src/modules/archive/archive.service.ts +++ b/src/modules/archive/archive.service.ts @@ -51,11 +51,10 @@ export class ArchiveService { return this.categoryModel.find().sort({ _id: SortType.Desc }).exec() } - private getAllArticles(limit?: number): Promise { + private getAllArticles(): Promise { return this.articleModel .find({ state: PublishState.Published, public: PublicState.Public }) .sort({ _id: SortType.Desc }) - .limit(limit) .exec() } diff --git a/src/modules/article/article.controller.ts b/src/modules/article/article.controller.ts index ca58b299..20edc84d 100755 --- a/src/modules/article/article.controller.ts +++ b/src/modules/article/article.controller.ts @@ -5,7 +5,6 @@ */ import lodash from 'lodash' -import { PaginateResult } from 'mongoose' import { Controller, Get, Put, Post, Patch, Delete, Body, UseGuards, HttpStatus } from '@nestjs/common' import { QueryParams, QueryParamsField as QueryField } from '@app/decorators/query-params.decorator' import { HttpProcessor } from '@app/decorators/http.decorator' @@ -14,6 +13,7 @@ import { HumanizedJwtAuthGuard } from '@app/guards/humanized-auth.guard' import { SortType } from '@app/interfaces/biz.interface' import { TagService } from '@app/modules/tag/tag.service' import { CategoryService } from '@app/modules/category/category.service' +import { PaginateResult } from '@app/utils/paginate' import { Article, ArticlesPayload, ArticlesStatePayload } from './article.model' import { ArticleService } from './article.service' diff --git a/src/modules/article/article.model.ts b/src/modules/article/article.model.ts index 6b9246f8..b794c66f 100755 --- a/src/modules/article/article.model.ts +++ b/src/modules/article/article.model.ts @@ -8,8 +8,9 @@ import { Types } from 'mongoose' import { AutoIncrementID } from '@typegoose/auto-increment' import { prop, index, plugin, Ref, modelOptions } from '@typegoose/typegoose' import { IsString, IsNotEmpty, IsArray, IsDefined, IsIn, IsInt, ArrayNotEmpty, ArrayUnique } from 'class-validator' -import { mongoosePaginate } from '@app/transformers/mongoose.transformer' +import { generalAutoIncrementIDConfig } from '@app/constants/increment.constant' import { getProviderByTypegooseClass } from '@app/transformers/model.transformer' +import { mongoosePaginate } from '@app/utils/paginate' import { PublishState, PublicState, OriginState } from '@app/interfaces/biz.interface' import { Category } from '@app/modules/category/category.model' import { Extend } from '@app/models/extend.model' @@ -39,7 +40,7 @@ export class Meta { } @plugin(mongoosePaginate) -@plugin(AutoIncrementID, { field: 'id', startAt: 1 }) +@plugin(AutoIncrementID, generalAutoIncrementIDConfig) @modelOptions({ schemaOptions: { toObject: { getters: true }, diff --git a/src/modules/article/article.service.ts b/src/modules/article/article.service.ts index 1e8c5f65..2283e363 100755 --- a/src/modules/article/article.service.ts +++ b/src/modules/article/article.service.ts @@ -5,8 +5,8 @@ */ import lodash from 'lodash' +import { Types } from 'mongoose' import { DocumentType } from '@typegoose/typegoose' -import { PaginateResult, Types } from 'mongoose' import { Injectable } from '@nestjs/common' import { InjectModel } from '@app/transformers/model.transformer' import { getArticleUrl } from '@app/transformers/urlmap.transformer' @@ -15,10 +15,10 @@ import { CacheService, CacheIntervalResult } from '@app/processors/cache/cache.s import { ArchiveService } from '@app/modules/archive/archive.service' import { TagService } from '@app/modules/tag/tag.service' import { MongooseModel } from '@app/interfaces/mongoose.interface' +import { PaginateResult, PaginateOptions } from '@app/utils/paginate' import { SortType, PublicState, PublishState } from '@app/interfaces/biz.interface' import { Article, getDefaultMeta } from './article.model' import * as CACHE_KEY from '@app/constants/cache.constant' -import logger from '@app/utils/logger' export const COMMON_USER_QUERY_PARAMS = Object.freeze({ state: PublishState.Published, @@ -45,7 +45,7 @@ export class ArticleService { key: CACHE_KEY.HOT_ARTICLES, promise: () => { return this.getList.bind(this)(COMMON_USER_QUERY_PARAMS, { - limit: 10, + perPage: 10, sort: this.getHotSortOption(), }) }, @@ -80,10 +80,12 @@ export class ArticleService { } // 请求文章列表 - public getList(querys, options): Promise> { - options.populate = ['category', 'tag'] - options.select = '-password -content' - return this.articleModel.paginate(querys, options) + public getList(querys, options: PaginateOptions): Promise> { + return this.articleModel.paginate(querys, { + populate: ['category', 'tag'], + select: '-password -content', + ...options, + }) } // 获取文章详情(使用 ObjectId) @@ -149,7 +151,6 @@ export class ArticleService { Reflect.deleteProperty(newArticle, 'update_at') const article = await this.articleModel.findByIdAndUpdate(articleID, newArticle as any, { new: true }).exec() - logger.info('----修改文章后', article) this.seoService.update(getArticleUrl(article.id)) this.archiveService.updateCache() this.tagService.updateListCache() diff --git a/src/modules/category/category.controller.ts b/src/modules/category/category.controller.ts index b886e687..3431def3 100755 --- a/src/modules/category/category.controller.ts +++ b/src/modules/category/category.controller.ts @@ -4,12 +4,12 @@ * @author Surmon */ -import { PaginateResult } from 'mongoose' import { Controller, UseGuards, Get, Put, Post, Delete, Body, Param } from '@nestjs/common' import { JwtAuthGuard } from '@app/guards/auth.guard' import { HumanizedJwtAuthGuard } from '@app/guards/humanized-auth.guard' import { HttpProcessor } from '@app/decorators/http.decorator' import { QueryParams } from '@app/decorators/query-params.decorator' +import { PaginateResult } from '@app/utils/paginate' import { Category, CategoriesPayload } from './category.model' import { CategoryService } from './category.service' diff --git a/src/modules/category/category.model.ts b/src/modules/category/category.model.ts index b6be05a2..ac4a04d1 100755 --- a/src/modules/category/category.model.ts +++ b/src/modules/category/category.model.ts @@ -8,12 +8,13 @@ import { Types } from 'mongoose' import { AutoIncrementID } from '@typegoose/auto-increment' import { prop, plugin, modelOptions } from '@typegoose/typegoose' import { IsString, MaxLength, IsAlphanumeric, IsNotEmpty, IsArray, ArrayNotEmpty, ArrayUnique } from 'class-validator' -import { mongoosePaginate } from '@app/transformers/mongoose.transformer' +import { generalAutoIncrementIDConfig } from '@app/constants/increment.constant' import { getProviderByTypegooseClass } from '@app/transformers/model.transformer' +import { mongoosePaginate } from '@app/utils/paginate' import { Extend } from '@app/models/extend.model' @plugin(mongoosePaginate) -@plugin(AutoIncrementID, { field: 'id', startAt: 1 }) +@plugin(AutoIncrementID, generalAutoIncrementIDConfig) @modelOptions({ schemaOptions: { timestamps: { diff --git a/src/modules/category/category.service.ts b/src/modules/category/category.service.ts index 4027b027..ad1246f0 100755 --- a/src/modules/category/category.service.ts +++ b/src/modules/category/category.service.ts @@ -4,11 +4,12 @@ * @author Surmon */ -import { PaginateResult, Types } from 'mongoose' +import { Types } from 'mongoose' import { Injectable } from '@nestjs/common' import { InjectModel } from '@app/transformers/model.transformer' import { getCategoryUrl } from '@app/transformers/urlmap.transformer' import { MongooseModel } from '@app/interfaces/mongoose.interface' +import { PaginateResult, PaginateOptions } from '@app/utils/paginate' import { PublicState, PublishState } from '@app/interfaces/biz.interface' import { ArchiveService } from '@app/modules/archive/archive.service' import { SeoService } from '@app/processors/helper/helper.service.seo' @@ -26,7 +27,7 @@ export class CategoryService { ) {} // 请求分类列表(及聚和数据) - public async getList(querys, options, isAuthenticated): Promise> { + public async getList(querys, options: PaginateOptions, isAuthenticated): Promise> { const matchState = { state: PublishState.Published, public: PublicState.Public, diff --git a/src/modules/comment/comment.controller.ts b/src/modules/comment/comment.controller.ts index fccc6467..9a34b5db 100755 --- a/src/modules/comment/comment.controller.ts +++ b/src/modules/comment/comment.controller.ts @@ -5,11 +5,11 @@ */ import lodash from 'lodash' -import { PaginateResult } from 'mongoose' import { Controller, Get, Put, Post, Patch, Delete, Body, UseGuards } from '@nestjs/common' import { JwtAuthGuard } from '@app/guards/auth.guard' import { HumanizedJwtAuthGuard } from '@app/guards/humanized-auth.guard' import { HttpProcessor } from '@app/decorators/http.decorator' +import { PaginateResult } from '@app/utils/paginate' import { QueryParams, QueryParamsField } from '@app/decorators/query-params.decorator' import { SortType } from '@app/interfaces/biz.interface' import { Comment, CreateCommentBase, CommentsPayload, CommentsStatePayload } from './comment.model' diff --git a/src/modules/comment/comment.model.ts b/src/modules/comment/comment.model.ts index 51f6ce23..ce3969ee 100755 --- a/src/modules/comment/comment.model.ts +++ b/src/modules/comment/comment.model.ts @@ -21,7 +21,8 @@ import { ArrayNotEmpty, ArrayUnique, } from 'class-validator' -import { mongoosePaginate } from '@app/transformers/mongoose.transformer' +import { generalAutoIncrementIDConfig } from '@app/constants/increment.constant' +import { mongoosePaginate } from '@app/utils/paginate' import { getProviderByTypegooseClass } from '@app/transformers/model.transformer' import { CommentParentID, CommentState } from '@app/interfaces/biz.interface' import { Extend } from '@app/models/extend.model' @@ -77,9 +78,9 @@ export class CreateCommentBase { } @plugin(mongoosePaginate) -@plugin(AutoIncrementID, { field: 'id', startAt: 1 }) -// https://typegoose.github.io/typegoose/docs/api/decorators/model-options/#allowmixed +@plugin(AutoIncrementID, generalAutoIncrementIDConfig) @modelOptions({ + // https://typegoose.github.io/typegoose/docs/api/decorators/model-options/#allowmixed options: { allowMixed: Severity.ALLOW }, schemaOptions: { timestamps: { diff --git a/src/modules/comment/comment.service.ts b/src/modules/comment/comment.service.ts index 91ba6f5d..601b0cfc 100755 --- a/src/modules/comment/comment.service.ts +++ b/src/modules/comment/comment.service.ts @@ -5,12 +5,12 @@ */ import lodash from 'lodash' -import { isDevMode } from '@app/app.environment' -import { PaginateResult, Types } from 'mongoose' +import { Types } from 'mongoose' import { Injectable } from '@nestjs/common' import { InjectModel } from '@app/transformers/model.transformer' import { getGuestbookPageUrl, getArticleUrl } from '@app/transformers/urlmap.transformer' import { MongooseModel } from '@app/interfaces/mongoose.interface' +import { PaginateResult, PaginateOptions } from '@app/utils/paginate' import { CommentPostID, CommentState } from '@app/interfaces/biz.interface' import { IPService } from '@app/processors/helper/helper.service.ip' import { EmailService } from '@app/processors/helper/helper.service.email' @@ -18,6 +18,7 @@ import { AkismetService, EAkismetActionType } from '@app/processors/helper/helpe import { OptionService } from '@app/modules/option/option.service' import { Blacklist } from '@app/modules/option/option.model' import { Article } from '@app/modules/article/article.model' +import { isDevMode } from '@app/app.environment' import { Comment, CreateCommentBase, CommentsStatePayload } from './comment.model' import logger from '@app/utils/logger' import * as APP_CONFIG from '@app/app.config' @@ -194,7 +195,7 @@ export class CommentService { } // 请求评论列表 - public getList(querys, options): Promise> { + public getList(querys, options: PaginateOptions): Promise> { return this.commentModel.paginate(querys, options) } diff --git a/src/modules/tag/tag.controller.ts b/src/modules/tag/tag.controller.ts index 75b12c05..c8d7d59c 100755 --- a/src/modules/tag/tag.controller.ts +++ b/src/modules/tag/tag.controller.ts @@ -5,12 +5,12 @@ */ import lodash from 'lodash' -import { PaginateResult } from 'mongoose' import { Controller, Get, Put, Post, Delete, Body, UseGuards } from '@nestjs/common' import { JwtAuthGuard } from '@app/guards/auth.guard' import { HumanizedJwtAuthGuard } from '@app/guards/humanized-auth.guard' import { HttpProcessor } from '@app/decorators/http.decorator' import { QueryParams } from '@app/decorators/query-params.decorator' +import { PaginateResult } from '@app/utils/paginate' import { Tag, TagsPayload } from './tag.model' import { TagService } from './tag.service' diff --git a/src/modules/tag/tag.model.ts b/src/modules/tag/tag.model.ts index 18fd7335..ead1e03c 100755 --- a/src/modules/tag/tag.model.ts +++ b/src/modules/tag/tag.model.ts @@ -8,12 +8,13 @@ import { Types } from 'mongoose' import { AutoIncrementID } from '@typegoose/auto-increment' import { prop, plugin, modelOptions } from '@typegoose/typegoose' import { IsString, MaxLength, IsAlphanumeric, IsNotEmpty, IsArray, ArrayNotEmpty, ArrayUnique } from 'class-validator' -import { mongoosePaginate } from '@app/transformers/mongoose.transformer' +import { generalAutoIncrementIDConfig } from '@app/constants/increment.constant' import { getProviderByTypegooseClass } from '@app/transformers/model.transformer' +import { mongoosePaginate } from '@app/utils/paginate' import { Extend } from '@app/models/extend.model' @plugin(mongoosePaginate) -@plugin(AutoIncrementID, { field: 'id', startAt: 1 }) +@plugin(AutoIncrementID, generalAutoIncrementIDConfig) @modelOptions({ schemaOptions: { timestamps: { diff --git a/src/modules/tag/tag.service.ts b/src/modules/tag/tag.service.ts index 82d1b8bd..1c27d1fc 100755 --- a/src/modules/tag/tag.service.ts +++ b/src/modules/tag/tag.service.ts @@ -4,18 +4,19 @@ * @author Surmon */ -import * as CACHE_KEY from '@app/constants/cache.constant' -import { PaginateResult, Types } from 'mongoose' +import { Types } from 'mongoose' import { Injectable } from '@nestjs/common' import { InjectModel } from '@app/transformers/model.transformer' import { getTagUrl } from '@app/transformers/urlmap.transformer' import { CacheService, CacheIOResult } from '@app/processors/cache/cache.service' import { SeoService } from '@app/processors/helper/helper.service.seo' import { MongooseModel } from '@app/interfaces/mongoose.interface' +import { PaginateResult, PaginateOptions } from '@app/utils/paginate' import { SortType, PublicState, PublishState } from '@app/interfaces/biz.interface' import { ArchiveService } from '@app/modules/archive/archive.service' import { Article } from '@app/modules/article/article.model' import { Tag } from './tag.model' +import * as CACHE_KEY from '@app/constants/cache.constant' import logger from '@app/utils/logger' @Injectable() @@ -42,9 +43,9 @@ export class TagService { // 缓存任务 private getListCacheTask(): Promise> { - const options = { + const options: PaginateOptions = { page: 1, - limit: 888, + perPage: 888, sort: { _id: SortType.Desc }, } return this.getList(null, options, false) @@ -61,7 +62,7 @@ export class TagService { } // 请求标签列表(及聚和数据) - public async getList(querys, options, isAuthenticated): Promise> { + public async getList(querys, options: PaginateOptions, isAuthenticated): Promise> { const matchState = { state: PublishState.Published, public: PublicState.Public, diff --git a/src/processors/database/database.provider.ts b/src/processors/database/database.provider.ts index b5a950b0..cfbab15f 100755 --- a/src/processors/database/database.provider.ts +++ b/src/processors/database/database.provider.ts @@ -4,10 +4,10 @@ * @author Surmon */ -import * as APP_CONFIG from '@app/app.config' -import { mongoose } from '@app/transformers/mongoose.transformer' +import mongoose from 'mongoose' import { EmailService } from '@app/processors/helper/helper.service.email' import { DB_CONNECTION_TOKEN } from '@app/constants/system.constant' +import * as APP_CONFIG from '@app/app.config' import logger from '@app/utils/logger' export const databaseProvider = { diff --git a/src/transformers/mongoose.transformer.ts b/src/transformers/mongoose.transformer.ts deleted file mode 100755 index 625f839c..00000000 --- a/src/transformers/mongoose.transformer.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @file Mongoose transform - * @module transformer/mongoose - * @author Surmon - */ - -import _mongoose from 'mongoose' -import _mongoosePaginate from 'mongoose-paginate' -import * as APP_CONFIG from '@app/app.config' - -// 各种 Hack -;(_mongoose as any).Promise = global.Promise - -// 初始化翻页插件 -;(_mongoosePaginate as any).paginate.options = { - limit: APP_CONFIG.APP.LIMIT, -} - -export const mongoose = _mongoose -export const mongoosePaginate = _mongoosePaginate -export default mongoose diff --git a/src/utils/paginate.ts b/src/utils/paginate.ts new file mode 100644 index 00000000..52e9e973 --- /dev/null +++ b/src/utils/paginate.ts @@ -0,0 +1,73 @@ +/** + * @file mongoose paginate plugin + * @module utils/paginate + * @author Surmon + */ + +import { Model, Document, Schema, FilterQuery, QueryOptions } from 'mongoose' + +export interface PaginateResult { + docs: Array + total: number + page: number + perPage: number + totalPage: number + offset?: number +} + +export interface PaginateOptions { + /** paginate options */ + page?: number + perPage?: number + offset?: number + select?: string | object + /** mongoose queryOptions */ + sort?: QueryOptions['sort'] + populate?: QueryOptions['populate'] + lean?: QueryOptions['lean'] + /** original options for `model.find` */ + queryOptions?: QueryOptions +} + +const defaultOptions: PaginateOptions = { + page: 1, + perPage: 16, + offset: 0, + select: null, + lean: false, +} + +export interface PaginateModel extends Model { + paginate(query?: FilterQuery, options?: PaginateOptions): Promise> +} + +export function mongoosePaginate(schema: Schema) { + schema.statics.paginate = paginate +} + +export function paginate(this: Model, filterQuery: FilterQuery = {}, options: PaginateOptions = {}) { + const pagiOptions = Object.assign({}, defaultOptions, options) + const { page, perPage, offset, select, queryOptions, ...resetOptions } = pagiOptions + + const skip = offset > 0 ? offset : (page - 1) * perPage + + const countQuery = this.countDocuments ? this.countDocuments(filterQuery).exec() : this.count(filterQuery).exec() + const pageQuery = this.find(filterQuery, select, { + skip, + limit: perPage, + ...resetOptions, + ...queryOptions, + }).exec() + + return Promise.all([countQuery, pageQuery]).then(([countResult, pageResult]) => { + const result: PaginateResult = { + docs: pageResult, + total: countResult, + page, + perPage, + totalPage: Math.ceil(countResult / perPage) || 1, + } + + return result + }) +} diff --git a/yarn.lock b/yarn.lock index 8a0bcba8..7fb96b3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -979,20 +979,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/mongoose-paginate@^5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@types/mongoose-paginate/-/mongoose-paginate-5.0.10.tgz#c8980cb199b5144b7babb2ff5a4c3b1f7a8d60af" - integrity sha512-aTbcCQZkdBNAu1e9P0rChBMDoIC592xu+rTIWzGn8gRq7xWOnJfG3hADiCfhXvqyNzXRVMw2UsDN7UtNiktzFA== - dependencies: - "@types/mongoose" "^5.10.5" - -"@types/mongoose@^5.10.5": - version "5.11.97" - resolved "https://registry.yarnpkg.com/@types/mongoose/-/mongoose-5.11.97.tgz#80b0357f3de6807eb597262f52e49c3e13ee14d8" - integrity sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q== - dependencies: - mongoose "*" - "@types/node-schedule@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/node-schedule/-/node-schedule-1.3.2.tgz#cc7e32c6795cbadc8de03d0e1f86311727375423" @@ -4811,11 +4797,7 @@ mongodb@4.1.4: optionalDependencies: saslprep "^1.0.3" -"mongoose-paginate@https://github.com/surmon-china/mongoose-paginate": - version "5.0.4" - resolved "https://github.com/surmon-china/mongoose-paginate#7e5cff01d4c2842a4703471356c46bd119d9a9ae" - -mongoose@*, mongoose@~6.0.14: +mongoose@~6.0.14: version "6.0.15" resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.15.tgz#7f46e061cdb27081bc4d53b6f88e0aedede2c585" integrity sha512-Lr53MKrJ4XNTdsMkhOYxeBJClsV7pgwr2VFf7E8TK9Xh5hs2kzFF49jJv9i4CWcshmydcF8uDfaQ9sQlqzZoYw==