From 43813df4c29ac1afed7355fced5a5a665aba3f3a Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 May 2022 22:00:54 +0800 Subject: [PATCH] fix: pager dto and sort query --- package.json | 14 ++----------- src/modules/note/note.controller.ts | 13 +++++++++--- src/modules/page/page.controller.ts | 4 ++-- src/modules/page/page.dto.ts | 16 --------------- src/modules/post/post.controller.ts | 5 +++-- src/modules/post/post.dto.ts | 17 +--------------- src/shared/dto/pager.dto.ts | 22 +++++++++++++++++++++ src/transformers/crud-factor.transformer.ts | 4 ++-- 8 files changed, 42 insertions(+), 53 deletions(-) delete mode 100644 src/modules/page/page.dto.ts diff --git a/package.json b/package.json index 7bc4c626..87b086aa 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ - "prettier --ignore-path ./.prettierignore --write ", - "eslint --cache" + "eslint --cache --fix", + "prettier --ignore-path ./.prettierignore --write " ] }, "repository": { @@ -52,16 +52,6 @@ "docs": "npx @compodoc/compodoc -p tsconfig.json -s -d docs", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s" }, - "pnpm": { - "peerDependencyRules": { - "allowedVersions": { - "class-transformer": "0.5.1" - }, - "ignoreMissing": [ - "webpack" - ] - } - }, "bump": { "before": [ "git pull --rebase", diff --git a/src/modules/note/note.controller.ts b/src/modules/note/note.controller.ts index 45829589..46b87574 100644 --- a/src/modules/note/note.controller.ts +++ b/src/modules/note/note.controller.ts @@ -25,12 +25,12 @@ import { CannotFindException } from '~/common/exceptions/cant-find.exception' import { CountingService } from '~/processors/helper/helper.counting.service' import { TextMacroService } from '~/processors/helper/helper.macro.service' import { IntIdOrMongoIdDto, MongoIdDto } from '~/shared/dto/id.dto' +import { PagerDto } from '~/shared/dto/pager.dto' import { addHidePasswordAndHideCondition, addYearCondition, } from '~/transformers/db-query.transformer' -import { PageQueryDto } from '../page/page.dto' import { ListQueryDto, NidType, @@ -279,11 +279,17 @@ export class NoteController { @HTTPDecorators.Paginator async getNotesByTopic( @Param() params: MongoIdDto, - @Query() query: PageQueryDto, + @Query() query: PagerDto, @IsMaster() isMaster: boolean, ) { const { id } = params - const { size, page, select = '_id title nid id created modified' } = query + const { + size, + page, + select = '_id title nid id created modified', + sortBy, + sortOrder, + } = query const condition: FilterQuery = isMaster ? { $or: [{ hide: false }, { hide: true }] } : { hide: false } @@ -294,6 +300,7 @@ export class NoteController { page, limit: size, select, + sort: sortBy ? { [sortBy]: sortOrder } : undefined, }, { ...condition }, ) diff --git a/src/modules/page/page.controller.ts b/src/modules/page/page.controller.ts index a6891361..f1ae4015 100644 --- a/src/modules/page/page.controller.ts +++ b/src/modules/page/page.controller.ts @@ -18,8 +18,8 @@ import { ApiName } from '~/common/decorator/openapi.decorator' import { CannotFindException } from '~/common/exceptions/cant-find.exception' import { TextMacroService } from '~/processors/helper/helper.macro.service' import { MongoIdDto } from '~/shared/dto/id.dto' +import { PagerDto } from '~/shared/dto/pager.dto' -import { PageQueryDto } from './page.dto' import { PageModel, PartialPageModel } from './page.model' import { PageService } from './page.service' @@ -33,7 +33,7 @@ export class PageController { @Get('/') @Paginator - async getPagesSummary(@Query() query: PageQueryDto) { + async getPagesSummary(@Query() query: PagerDto) { const { size, select, page, sortBy, sortOrder } = query return await this.pageService.model.paginate( diff --git a/src/modules/page/page.dto.ts b/src/modules/page/page.dto.ts deleted file mode 100644 index 9724f205..00000000 --- a/src/modules/page/page.dto.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Transform } from 'class-transformer' -import { IsEnum, IsOptional, ValidateIf } from 'class-validator' - -import { PagerDto } from '~/shared/dto/pager.dto' - -export class PageQueryDto extends PagerDto { - @IsOptional() - @IsEnum(['title', 'created', 'modified', 'order', 'subtitle']) - readonly sortBy?: string - - @IsOptional() - @IsEnum([1, -1]) - @ValidateIf((o) => o.sortBy) - @Transform(({ value: v }) => v | 0) - readonly sortOrder?: 1 | -1 -} diff --git a/src/modules/post/post.controller.ts b/src/modules/post/post.controller.ts index 43ab7850..b6a9ff84 100644 --- a/src/modules/post/post.controller.ts +++ b/src/modules/post/post.controller.ts @@ -24,10 +24,11 @@ import { VisitDocument } from '~/common/decorator/update-count.decorator' import { CannotFindException } from '~/common/exceptions/cant-find.exception' import { CountingService } from '~/processors/helper/helper.counting.service' import { MongoIdDto } from '~/shared/dto/id.dto' +import { PagerDto } from '~/shared/dto/pager.dto' import { addYearCondition } from '~/transformers/db-query.transformer' import { CategoryModel } from '../category/category.model' -import { CategoryAndSlugDto, PostQueryDto } from './post.dto' +import { CategoryAndSlugDto } from './post.dto' import { PartialPostModel, PostModel } from './post.model' import { PostService } from './post.service' @@ -41,7 +42,7 @@ export class PostController { @Get('/') @Paginator - async getPaginate(@Query() query: PostQueryDto) { + async getPaginate(@Query() query: PagerDto) { const { size, select, page, year, sortBy, sortOrder } = query return await this.postService.findWithPaginator( diff --git a/src/modules/post/post.dto.ts b/src/modules/post/post.dto.ts index 4ee9ccd9..bdae118d 100644 --- a/src/modules/post/post.dto.ts +++ b/src/modules/post/post.dto.ts @@ -1,20 +1,5 @@ import { Transform } from 'class-transformer' -import { IsEnum, IsOptional, IsString, ValidateIf } from 'class-validator' - -import { PagerDto } from '~/shared/dto/pager.dto' - -export class PostQueryDto extends PagerDto { - @IsOptional() - @IsEnum(['categoryId', 'title', 'created', 'modified']) - @Transform(({ value: v }) => (v === 'category' ? 'categoryId' : v)) - readonly sortBy?: string - - @IsOptional() - @IsEnum([1, -1]) - @ValidateIf((o) => o.sortBy) - @Transform(({ value: v }) => v | 0) - readonly sortOrder?: 1 | -1 -} +import { IsString } from 'class-validator' export class CategoryAndSlugDto { @IsString() diff --git a/src/shared/dto/pager.dto.ts b/src/shared/dto/pager.dto.ts index c5abe780..8c5fac8a 100644 --- a/src/shared/dto/pager.dto.ts +++ b/src/shared/dto/pager.dto.ts @@ -1,5 +1,6 @@ import { Expose, Transform } from 'class-transformer' import { + IsEnum, IsInt, IsMongoId, IsNotEmpty, @@ -42,6 +43,27 @@ export class PagerDto extends DbQueryDto { @ApiProperty({ required: false }) select?: string + @IsOptional() + @IsString() + sortBy?: string + + @IsOptional() + @IsEnum([1, -1]) + @Transform(({ value: val }) => { + // @ts-ignore + const isStringNumber = typeof val === 'string' && !isNaN(val) + + if (isStringNumber) { + return parseInt(val) + } else { + return { + asc: 1, + desc: -1, + }[val.toString()] + } + }) + sortOrder?: 1 | -1 + @IsOptional() @Transform(({ value: val }) => parseInt(val)) @Min(1) diff --git a/src/transformers/crud-factor.transformer.ts b/src/transformers/crud-factor.transformer.ts index e86c0613..fb6dd12f 100644 --- a/src/transformers/crud-factor.transformer.ts +++ b/src/transformers/crud-factor.transformer.ts @@ -69,12 +69,12 @@ export function BaseCrudFactory< @Get('/') @Paginator async gets(@Query() pager: PagerDto) { - const { size, page, select, state } = pager + const { size, page, select, state, sortBy, sortOrder } = pager // @ts-ignore return await this._model.paginate(state !== undefined ? { state } : {}, { limit: size, page, - sort: { created: -1 }, + sort: sortBy ? { [sortBy]: sortOrder } : { created: -1 }, select, }) }