From 8ad7539ebc3172fe2c724cf41ec1db5829819446 Mon Sep 17 00:00:00 2001 From: Oli Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Wed, 24 Jan 2024 12:52:39 +0100 Subject: [PATCH] fix(medusa): Support q search and order in list regions (#6202) --- .changeset/thick-insects-raise.md | 5 +++ .../api/__tests__/admin/region.js | 40 ++++++++++++++++++- .../src/lib/models/AdminGetRegionsParams.ts | 8 ++++ .../api/routes/admin/regions/list-regions.ts | 18 ++++++++- packages/medusa/src/services/region.ts | 25 +++++++++++- 5 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 .changeset/thick-insects-raise.md diff --git a/.changeset/thick-insects-raise.md b/.changeset/thick-insects-raise.md new file mode 100644 index 0000000000..ba799cfd0f --- /dev/null +++ b/.changeset/thick-insects-raise.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +fix(medusa): Support q search and order in list regions diff --git a/integration-tests/api/__tests__/admin/region.js b/integration-tests/api/__tests__/admin/region.js index de986b1e23..e0b9f57e07 100644 --- a/integration-tests/api/__tests__/admin/region.js +++ b/integration-tests/api/__tests__/admin/region.js @@ -138,6 +138,20 @@ describe("/admin/regions", () => { tax_rate: 0, updated_at: new Date("10/10/2000"), }) + await manager.insert(Region, { + id: "us-region", + name: "United States", + currency_code: "usd", + tax_rate: 0, + updated_at: new Date("10/10/2000"), + }) + await manager.insert(Region, { + id: "uk-region", + name: "United Kingdom", + currency_code: "gbp", + tax_rate: 0, + updated_at: new Date("10/10/2000"), + }) }) afterEach(async () => { @@ -162,6 +176,28 @@ describe("/admin/regions", () => { ) }) + it("should list the regions with q and order params", async () => { + const api = useApi() + + const response = await api.get( + "/admin/regions?q=united&order=currency_code", + adminReqConfig + ) + + expect(response.status).toEqual(200) + + expect(response.data.regions).toEqual([ + expect.objectContaining({ + name: "United Kingdom", + currency_code: "gbp", + }), + expect.objectContaining({ + name: "United States", + currency_code: "usd", + }), + ]) + }) + it("should only return non-deleted regions", async () => { const api = useApi() @@ -171,7 +207,7 @@ describe("/admin/regions", () => { console.log(err) }) - expect(response.data.regions).toHaveLength(3) + expect(response.data.regions).toHaveLength(5) expect(response.data.regions).toEqual( expect.arrayContaining([ expect.objectContaining({ @@ -194,7 +230,7 @@ describe("/admin/regions", () => { const response = await api.get(`/admin/regions?limit=2`, adminReqConfig) expect(response.data.regions).toHaveLength(2) - expect(response.data.count).toEqual(3) + expect(response.data.count).toEqual(5) expect(response.status).toEqual(200) }) diff --git a/packages/generated/client-types/src/lib/models/AdminGetRegionsParams.ts b/packages/generated/client-types/src/lib/models/AdminGetRegionsParams.ts index 5b43587868..41d5e0389b 100644 --- a/packages/generated/client-types/src/lib/models/AdminGetRegionsParams.ts +++ b/packages/generated/client-types/src/lib/models/AdminGetRegionsParams.ts @@ -4,6 +4,14 @@ import { SetRelation, Merge } from "../core/ModelUtils" export interface AdminGetRegionsParams { + /** + * Term used to search regions' name. + */ + q?: string + /** + * A field to sort-order the retrieved regions by. + */ + order?: string /** * Limit the number of regions returned. */ diff --git a/packages/medusa/src/api/routes/admin/regions/list-regions.ts b/packages/medusa/src/api/routes/admin/regions/list-regions.ts index f2a5ccae4f..22a0e28b44 100644 --- a/packages/medusa/src/api/routes/admin/regions/list-regions.ts +++ b/packages/medusa/src/api/routes/admin/regions/list-regions.ts @@ -1,5 +1,5 @@ import { Type } from "class-transformer" -import { IsOptional, ValidateNested } from "class-validator" +import { IsOptional, IsString, ValidateNested } from "class-validator" import RegionService from "../../../../services/region" import { DateComparisonOperator, @@ -13,6 +13,8 @@ import { * description: "Retrieve a list of Regions. The regions can be filtered by fields such as `created_at`. The regions can also be paginated." * x-authenticated: true * parameters: + * - (query) q {string} Term used to search regions' name. + * - (query) order {string} A field to sort-order the retrieved regions by. * - in: query * name: limit * schema: @@ -190,6 +192,20 @@ export class AdminGetRegionsParams extends extendedFindParamsMixin({ limit: 50, offset: 0, }) { + /** + * Search parameter for regions. + */ + @IsString() + @IsOptional() + q?: string + + /** + * The field to sort the data by. By default, the sort order is ascending. To change the order to descending, prefix the field name with `-`. + */ + @IsString() + @IsOptional() + order?: string + /** * Date filters to apply on the regions' `created_at` date. */ diff --git a/packages/medusa/src/services/region.ts b/packages/medusa/src/services/region.ts index 77d1455b56..a32b848162 100644 --- a/packages/medusa/src/services/region.ts +++ b/packages/medusa/src/services/region.ts @@ -1,5 +1,5 @@ import { isDefined, MedusaError } from "medusa-core-utils" -import { DeepPartial, EntityManager } from "typeorm" +import { DeepPartial, EntityManager, FindOptionsWhere, ILike } from "typeorm" import { Country, Currency, Region } from "../models" import { FindConfig, Selector } from "../types/common" import { CreateRegionInput, UpdateRegionInput } from "../types/region" @@ -522,7 +522,7 @@ class RegionService extends TransactionBaseService { * @return {Promise} result of the find operation */ async listAndCount( - selector: Selector = {}, + selector: Selector & { q?: string } = {}, config: FindConfig = { relations: [], skip: 0, @@ -533,7 +533,28 @@ class RegionService extends TransactionBaseService { this.regionRepository_ ) + let q: string | undefined + + if (selector.q) { + q = selector.q + delete selector.q + } + const query = buildQuery(selector, config) + + if (q) { + const where = query.where as FindOptionsWhere + + delete where.name + + query.where = [ + { + ...where, + name: ILike(`%${q}%`), + }, + ] + } + return await regionRepo.findAndCount(query) }