Feat: admin collections filtering (#977)
* collections filtering * filtering collection tests * oas for list collections
This commit is contained in:
1 parent
fdc493df7f
commit
f4f9653efc
3 files changed
+147
-5
No files matched your search
@@ -14,6 +14,77 @@ Object {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`/admin/collections /admin/collections filters collections by title 1`] = `
|
||||||
|
Object {
|
||||||
|
"collections": Array [
|
||||||
|
Object {
|
||||||
|
"handle": "test-collection",
|
||||||
|
"id": "test-collection",
|
||||||
|
"products": Array [
|
||||||
|
Object {
|
||||||
|
"collection_id": "test-collection",
|
||||||
|
"created_at": Any<String>,
|
||||||
|
"deleted_at": null,
|
||||||
|
"description": "test-product-description",
|
||||||
|
"discountable": true,
|
||||||
|
"external_id": null,
|
||||||
|
"handle": "test-product",
|
||||||
|
"height": null,
|
||||||
|
"hs_code": null,
|
||||||
|
"id": "test-product",
|
||||||
|
"is_giftcard": false,
|
||||||
|
"length": null,
|
||||||
|
"material": null,
|
||||||
|
"metadata": null,
|
||||||
|
"mid_code": null,
|
||||||
|
"origin_country": null,
|
||||||
|
"profile_id": StringMatching /\\^sp_\\*/,
|
||||||
|
"status": "draft",
|
||||||
|
"subtitle": null,
|
||||||
|
"thumbnail": null,
|
||||||
|
"title": "Test product",
|
||||||
|
"type_id": "test-type",
|
||||||
|
"updated_at": Any<String>,
|
||||||
|
"weight": null,
|
||||||
|
"width": null,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"collection_id": "test-collection",
|
||||||
|
"created_at": Any<String>,
|
||||||
|
"deleted_at": null,
|
||||||
|
"description": "test-product-description1",
|
||||||
|
"discountable": true,
|
||||||
|
"external_id": null,
|
||||||
|
"handle": "test-product1",
|
||||||
|
"height": null,
|
||||||
|
"hs_code": null,
|
||||||
|
"id": "test-product1",
|
||||||
|
"is_giftcard": false,
|
||||||
|
"length": null,
|
||||||
|
"material": null,
|
||||||
|
"metadata": null,
|
||||||
|
"mid_code": null,
|
||||||
|
"origin_country": null,
|
||||||
|
"profile_id": StringMatching /\\^sp_\\*/,
|
||||||
|
"status": "draft",
|
||||||
|
"subtitle": null,
|
||||||
|
"thumbnail": null,
|
||||||
|
"title": "Test product1",
|
||||||
|
"type_id": "test-type",
|
||||||
|
"updated_at": Any<String>,
|
||||||
|
"weight": null,
|
||||||
|
"width": null,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"title": "Test collection",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"count": 1,
|
||||||
|
"limit": 10,
|
||||||
|
"offset": 0,
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`/admin/collections /admin/collections lists collections 1`] = `
|
exports[`/admin/collections /admin/collections lists collections 1`] = `
|
||||||
Object {
|
Object {
|
||||||
"collections": Array [
|
"collections": Array [
|
||||||
|
|||||||
@@ -216,5 +216,42 @@ describe("/admin/collections", () => {
|
|||||||
count: 3,
|
count: 3,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("filters collections by title", async () => {
|
||||||
|
const api = useApi()
|
||||||
|
|
||||||
|
const response = await api
|
||||||
|
.get("/admin/collections?title=Test%20collection", {
|
||||||
|
headers: { Authorization: "Bearer test_token" },
|
||||||
|
})
|
||||||
|
.catch((err) => console.log(err))
|
||||||
|
|
||||||
|
expect(response.data).toMatchSnapshot({
|
||||||
|
collections: [
|
||||||
|
{
|
||||||
|
id: "test-collection",
|
||||||
|
handle: "test-collection",
|
||||||
|
title: "Test collection",
|
||||||
|
products: [
|
||||||
|
{
|
||||||
|
collection_id: "test-collection",
|
||||||
|
created_at: expect.any(String),
|
||||||
|
updated_at: expect.any(String),
|
||||||
|
profile_id: expect.stringMatching(/^sp_*/),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
collection_id: "test-collection",
|
||||||
|
created_at: expect.any(String),
|
||||||
|
updated_at: expect.any(String),
|
||||||
|
profile_id: expect.stringMatching(/^sp_*/),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
count: 1,
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
import { Type } from "class-transformer"
|
import { Type } from "class-transformer"
|
||||||
import { IsNumber, IsOptional } from "class-validator"
|
import { IsNumber, IsOptional, IsString, ValidateNested } from "class-validator"
|
||||||
|
import _, { identity } from "lodash"
|
||||||
import {
|
import {
|
||||||
defaultAdminCollectionsFields,
|
defaultAdminCollectionsFields,
|
||||||
defaultAdminCollectionsRelations,
|
defaultAdminCollectionsRelations,
|
||||||
} from "."
|
} from "."
|
||||||
import ProductCollectionService from "../../../../services/product-collection"
|
import ProductCollectionService from "../../../../services/product-collection"
|
||||||
|
import { DateComparisonOperator } from "../../../../types/common"
|
||||||
import { validator } from "../../../../utils/validator"
|
import { validator } from "../../../../utils/validator"
|
||||||
/**
|
/**
|
||||||
* @oas [get] /collections
|
* @oas [get] /collections
|
||||||
@@ -13,8 +15,13 @@ import { validator } from "../../../../utils/validator"
|
|||||||
* description: "Retrieve a list of Product Collection."
|
* description: "Retrieve a list of Product Collection."
|
||||||
* x-authenticated: true
|
* x-authenticated: true
|
||||||
* parameters:
|
* parameters:
|
||||||
* - (path) limit {string} The number of collections to return.
|
* - (query) limit {string} The number of collections to return.
|
||||||
* - (path) offset {string} The offset of collections to return.
|
* - (query) offset {string} The offset of collections to return.
|
||||||
|
* - (query) title {string} The title of collections to return.
|
||||||
|
* - (query) handle {string} The handle of collections to return.
|
||||||
|
* - (query) deleted_at {DateComparisonOperator} Date comparison for when resulting collections was deleted, i.e. less than, greater than etc.
|
||||||
|
* - (query) created_at {DateComparisonOperator} Date comparison for when resulting collections was created, i.e. less than, greater than etc.
|
||||||
|
* - (query) updated_at {DateComparisonOperator} Date comparison for when resulting collections was updated, i.e. less than, greater than etc.
|
||||||
* tags:
|
* tags:
|
||||||
* - Collection
|
* - Collection
|
||||||
* responses:
|
* responses:
|
||||||
@@ -41,8 +48,10 @@ export default async (req, res) => {
|
|||||||
take: validated.limit,
|
take: validated.limit,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const filterableFields = _.omit(validated, ["limit", "offset"])
|
||||||
|
|
||||||
const [collections, count] = await productCollectionService.listAndCount(
|
const [collections, count] = await productCollectionService.listAndCount(
|
||||||
{},
|
_.pickBy(filterableFields, identity),
|
||||||
listConfig
|
listConfig
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -54,7 +63,7 @@ export default async (req, res) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export class AdminGetCollectionsParams {
|
export class AdminGetCollectionsPaginationParams {
|
||||||
@IsNumber()
|
@IsNumber()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
@Type(() => Number)
|
@Type(() => Number)
|
||||||
@@ -65,3 +74,28 @@ export class AdminGetCollectionsParams {
|
|||||||
@Type(() => Number)
|
@Type(() => Number)
|
||||||
offset = 0
|
offset = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class AdminGetCollectionsParams extends AdminGetCollectionsPaginationParams {
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
title?: string
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
handle?: string
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@ValidateNested()
|
||||||
|
@Type(() => DateComparisonOperator)
|
||||||
|
created_at?: DateComparisonOperator
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@ValidateNested()
|
||||||
|
@Type(() => DateComparisonOperator)
|
||||||
|
updated_at?: DateComparisonOperator
|
||||||
|
|
||||||
|
@ValidateNested()
|
||||||
|
@IsOptional()
|
||||||
|
@Type(() => DateComparisonOperator)
|
||||||
|
deleted_at?: DateComparisonOperator
|
||||||
|
}
|
||||||
Reference in new issue
Block a user