feat: partial selection (#274)
This commit is contained in:
parent
bc2723ca7e
commit
9aa198b166
@ -171,6 +171,14 @@ const paginateConfig: PaginateConfig<CatEntity> {
|
|||||||
*/
|
*/
|
||||||
searchableColumns: ['name', 'color'],
|
searchableColumns: ['name', 'color'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required: false
|
||||||
|
* Type: TypeORM partial selection
|
||||||
|
* Default: None
|
||||||
|
* https://typeorm.io/select-query-builder#partial-selection
|
||||||
|
*/
|
||||||
|
select: ['name', 'color'],
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required: false
|
* Required: false
|
||||||
* Type: number
|
* Type: number
|
||||||
|
@ -841,4 +841,44 @@ describe('paginate', () => {
|
|||||||
const result = await paginate<CatEntity>(query, catRepo, config)
|
const result = await paginate<CatEntity>(query, catRepo, config)
|
||||||
expect(result.meta.totalItems).toBe(cats.length - 1)
|
expect(result.meta.totalItems).toBe(cats.length - 1)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should return the specified columns only', async () => {
|
||||||
|
const config: PaginateConfig<CatEntity> = {
|
||||||
|
sortableColumns: ['id'],
|
||||||
|
select: ['id', 'name'],
|
||||||
|
}
|
||||||
|
const query: PaginateQuery = {
|
||||||
|
path: '',
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await paginate<CatEntity>(query, catRepo, config)
|
||||||
|
|
||||||
|
result.data.forEach((cat) => {
|
||||||
|
expect(cat.color).not.toBeDefined()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return the specified relationship columns only', async () => {
|
||||||
|
const config: PaginateConfig<CatEntity> = {
|
||||||
|
sortableColumns: ['name'],
|
||||||
|
select: ['id', 'name', 'toys.name'],
|
||||||
|
relations: ['toys'],
|
||||||
|
}
|
||||||
|
const query: PaginateQuery = {
|
||||||
|
path: '',
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await paginate<CatEntity>(query, catRepo, config)
|
||||||
|
|
||||||
|
result.data.forEach((cat) => {
|
||||||
|
expect(cat.id).toBeDefined()
|
||||||
|
expect(cat.name).toBeDefined()
|
||||||
|
expect(cat.color).not.toBeDefined()
|
||||||
|
|
||||||
|
cat.toys.map((toy) => {
|
||||||
|
expect(toy.name).toBeDefined()
|
||||||
|
expect(toy.id).not.toBeDefined()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -47,6 +47,7 @@ export interface PaginateConfig<T> {
|
|||||||
relations?: RelationColumn<T>[]
|
relations?: RelationColumn<T>[]
|
||||||
sortableColumns: Column<T>[]
|
sortableColumns: Column<T>[]
|
||||||
searchableColumns?: Column<T>[]
|
searchableColumns?: Column<T>[]
|
||||||
|
select?: Column<T>[]
|
||||||
maxLimit?: number
|
maxLimit?: number
|
||||||
defaultSortBy?: SortBy<T>
|
defaultSortBy?: SortBy<T>
|
||||||
defaultLimit?: number
|
defaultLimit?: number
|
||||||
@ -224,6 +225,18 @@ export async function paginate<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.select?.length > 0) {
|
||||||
|
const mappedSelect = config.select.map((col) => {
|
||||||
|
if (col.includes('.')) {
|
||||||
|
const [rel, relCol] = col.split('.')
|
||||||
|
return `${queryBuilder.alias}_${rel}.${relCol}`
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${queryBuilder.alias}.${col}`
|
||||||
|
})
|
||||||
|
queryBuilder.select(mappedSelect)
|
||||||
|
}
|
||||||
|
|
||||||
if (config.where) {
|
if (config.where) {
|
||||||
queryBuilder.andWhere(new Brackets((qb) => qb.andWhere(config.where)))
|
queryBuilder.andWhere(new Brackets((qb) => qb.andWhere(config.where)))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user