diff --git a/.changeset/spicy-starfishes-suffer.md b/.changeset/spicy-starfishes-suffer.md new file mode 100644 index 0000000000..01fb0f94bf --- /dev/null +++ b/.changeset/spicy-starfishes-suffer.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +feat(medusa): add `q` param to PKs sales channels retrieval diff --git a/integration-tests/api/__tests__/admin/publishable-api-key.js b/integration-tests/api/__tests__/admin/publishable-api-key.js index 9e1bbdb228..6ebf0eed62 100644 --- a/integration-tests/api/__tests__/admin/publishable-api-key.js +++ b/integration-tests/api/__tests__/admin/publishable-api-key.js @@ -499,6 +499,7 @@ describe("[MEDUSA_FF_PUBLISHABLE_API_KEYS] Publishable API keys", () => { ) expect(response.status).toBe(200) + expect(response.data.sales_channels.length).toEqual(2) expect(response.data.sales_channels).toEqual( expect.arrayContaining([ expect.objectContaining({ @@ -518,6 +519,29 @@ describe("[MEDUSA_FF_PUBLISHABLE_API_KEYS] Publishable API keys", () => { ]) ) }) + + it("list sales channels from the publishable api key with free text search filter", async () => { + const api = useApi() + + const response = await api.get( + `/admin/publishable-api-keys/${pubKeyId}/sales-channels?q=2`, + adminHeaders + ) + + expect(response.status).toBe(200) + expect(response.data.sales_channels.length).toEqual(1) + expect(response.data.sales_channels).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: salesChannel2.id, + deleted_at: null, + name: "test name 2", + description: "test description 2", + is_disabled: false, + }), + ]) + ) + }) }) describe("GET /store/products", () => { diff --git a/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-key-sales-channels.ts b/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-key-sales-channels.ts index 362816e4e5..9a6d03be09 100644 --- a/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-key-sales-channels.ts +++ b/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-key-sales-channels.ts @@ -1,6 +1,8 @@ import { Request, Response } from "express" +import { IsOptional, IsString } from "class-validator" import PublishableApiKeyService from "../../../../services/publishable-api-key" +import { extendedFindParamsMixin } from "../../../../types/common" /** * @oas [get] /publishable-api-keys/{id}/sales-channels @@ -10,6 +12,7 @@ import PublishableApiKeyService from "../../../../services/publishable-api-key" * x-authenticated: true * parameters: * - (path) id=* {string} The ID of the Publishable Api Key. + * - (query) q {string} Query used for searching sales channels' names and descriptions. * x-codeSamples: * - lang: JavaScript * label: JS Client @@ -61,11 +64,19 @@ export default async (req: Request, res: Response) => { "publishableApiKeyService" ) - const salesChannels = await publishableApiKeyService.listSalesChannels(id) + const filterableFields = req.filterableFields + + const salesChannels = await publishableApiKeyService.listSalesChannels(id, { + q: filterableFields.q as string | undefined, + }) return res.json({ sales_channels: salesChannels, }) } -export class GetPublishableApiKeySalesChannelsParams {} +export class GetPublishableApiKeySalesChannelsParams extends extendedFindParamsMixin() { + @IsOptional() + @IsString() + q?: string +} diff --git a/packages/medusa/src/repositories/publishable-api-key-sales-channel.ts b/packages/medusa/src/repositories/publishable-api-key-sales-channel.ts index 7d64217506..4ef4cfe5bb 100644 --- a/packages/medusa/src/repositories/publishable-api-key-sales-channel.ts +++ b/packages/medusa/src/repositories/publishable-api-key-sales-channel.ts @@ -1,4 +1,4 @@ -import { EntityRepository, In, Repository } from "typeorm" +import { Brackets, EntityRepository, In, Repository } from "typeorm" import { PublishableApiKeySalesChannel, SalesChannel } from "../models" @@ -8,11 +8,13 @@ export class PublishableApiKeySalesChannelRepository extends Repository { - const data = await this.createQueryBuilder("PublishableKeySalesChannel") + const query = this.createQueryBuilder("PublishableKeySalesChannel") .select("PublishableKeySalesChannel.sales_channel_id") .innerJoinAndMapOne( "PublishableKeySalesChannel.sales_channel_id", @@ -26,9 +28,20 @@ export class PublishableApiKeySalesChannelRepository extends Repository { + qb.where(`SalesChannel.description ILIKE :q`, { + q: `%${config.q}%`, + }).orWhere(`SalesChannel.name ILIKE :q`, { q: `%${config.q}%` }) + }) + ) + } + + const records = await query.getMany() + + return records.map( (record) => record.sales_channel_id as unknown as SalesChannel ) } diff --git a/packages/medusa/src/services/publishable-api-key.ts b/packages/medusa/src/services/publishable-api-key.ts index f2e1da3433..e807846ca9 100644 --- a/packages/medusa/src/services/publishable-api-key.ts +++ b/packages/medusa/src/services/publishable-api-key.ts @@ -302,16 +302,21 @@ class PublishableApiKeyService extends TransactionBaseService { * List SalesChannels associated with the PublishableKey * * @param publishableApiKeyId - id of the key SalesChannels are listed for + * @param config - querying params */ async listSalesChannels( - publishableApiKeyId: string + publishableApiKeyId: string, + config?: { q?: string } ): Promise { const manager = this.manager_ const pubKeySalesChannelRepo = manager.getCustomRepository( this.publishableApiKeySalesChannelRepository_ ) - return await pubKeySalesChannelRepo.findSalesChannels(publishableApiKeyId) + return await pubKeySalesChannelRepo.findSalesChannels( + publishableApiKeyId, + config + ) } /**