Commit c4901b41 authored by nanahira's avatar nanahira

paginate

parent d70bebb5
......@@ -10,11 +10,13 @@ import {
} from 'typeorm';
import {
BlankReturnMessageDto,
PaginatedReturnMessageDto,
ReturnMessageDto,
} from '../dto/ReturnMessage.dto';
import { QueryWise } from '../entities/interfaces/QueryWise';
import { camelCase } from 'typeorm/util/StringUtils';
import { DeletionWise } from '../entities/bases/TimeBase.entity';
import { PageSettingsFactory } from '../dto/PageSettings.dto';
export type EntityId<T extends { id: any }> = T['id'];
......@@ -22,7 +24,8 @@ export class CrudBase<
T extends Record<string, any> & {
id: string | number;
} & QueryWise<T> &
DeletionWise
DeletionWise &
PageSettingsFactory
> extends ConsoleLogger {
protected readonly entityName: string;
constructor(
......@@ -181,7 +184,14 @@ export class CrudBase<
this.extraGetQuery(query);
extraQuery(query);
try {
return new ReturnMessageDto(200, 'success', await query.getMany());
const [ents, count] = await query.getManyAndCount();
return new PaginatedReturnMessageDto(
200,
'success',
ents,
count,
ent.getActualPageSettings(),
);
} catch (e) {
const [sql, params] = query.getQueryAndParameters();
this.error(
......
......@@ -3,7 +3,16 @@ import { SelectQueryBuilder } from 'typeorm';
import { ApiProperty } from '@nestjs/swagger';
import { NotWritable } from '../entities/decorators/transform';
export class PageSettingsDto {
export interface PageSettingsWise {
pageCount: number;
recordsPerPage: number;
}
export interface PageSettingsFactory {
getActualPageSettings(): PageSettingsWise;
}
export class PageSettingsDto implements PageSettingsWise, PageSettingsFactory {
@NotWritable()
@IsPositive()
@IsInt()
......@@ -16,12 +25,23 @@ export class PageSettingsDto {
@ApiProperty({ description: '每页显示的数量', required: false })
recordsPerPage: number;
getActualPageSettings(): PageSettingsWise {
return {
pageCount: this.getPageCount(),
recordsPerPage: this.getRecordsPerPage(),
};
}
private getPageCount() {
return this.pageCount || 1;
}
private getRecordsPerPage() {
return this.recordsPerPage || 25;
}
private getStartingFrom() {
return ((this.pageCount || 1) - 1) * this.getRecordsPerPage();
return (this.getPageCount() - 1) * this.getRecordsPerPage();
}
applyQuery(qb: SelectQueryBuilder<PageSettingsDto>, entityName: string) {
......
import { ApiProperty } from '@nestjs/swagger';
import { HttpException } from '@nestjs/common';
import { User } from '../entities/User.entity';
import { PageSettingsWise } from './PageSettings.dto';
export interface BlankReturnMessage {
statusCode: number;
......@@ -29,6 +31,31 @@ export class BlankReturnMessageDto implements BlankReturnMessage {
}
}
export class BlankPaginatedReturnMessageDto
extends BlankReturnMessageDto
implements PageSettingsWise {
@ApiProperty({ description: '总数' })
total: number;
@ApiProperty({ description: '总页数' })
totalPages: number;
@ApiProperty({ description: '当前页' })
pageCount: number;
@ApiProperty({ description: '每页数量' })
recordsPerPage: number;
constructor(
statusCode: number,
message: string,
total: number,
pageSettings: PageSettingsWise,
) {
super(statusCode, message);
this.total = total;
this.pageCount = pageSettings.pageCount;
this.recordsPerPage = pageSettings.recordsPerPage;
this.totalPages = Math.ceil(total / pageSettings.recordsPerPage);
}
}
export class ReturnMessageDto<T>
extends BlankReturnMessageDto
implements ReturnMessage<T> {
......@@ -40,6 +67,23 @@ export class ReturnMessageDto<T>
}
}
export class PaginatedReturnMessageDto<T>
extends BlankPaginatedReturnMessageDto
implements PageSettingsWise {
@ApiProperty({ description: '返回内容' })
data: T[];
constructor(
statusCode: number,
message: string,
data: T[],
total: number,
pageSettings: PageSettingsWise,
) {
super(statusCode, message, total, pageSettings);
this.data = data;
}
}
export class StringReturnMessageDto
extends BlankReturnMessageDto
implements ReturnMessage<string> {
......
......@@ -18,6 +18,10 @@ export class ClassGetPipe<T> extends ValidationPipe {
constructor(private readonly classConstructor: ClassConstructor<T>) {
super({
transform: false,
transformOptions: {
groups: ['r'],
enableImplicitConversion: true,
},
skipMissingProperties: true,
skipNullProperties: true,
skipUndefinedProperties: true,
......@@ -28,7 +32,7 @@ export class ClassGetPipe<T> extends ValidationPipe {
const obj = await super.transform(value, metadata);
return plainToClass(this.classConstructor, obj, {
groups: ['r'],
enableImplicitConversion: true,
enableImplicitConversion: false,
});
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment