diff --git a/.changeset/kind-glasses-lay.md b/.changeset/kind-glasses-lay.md new file mode 100644 index 0000000000..044f0f3f54 --- /dev/null +++ b/.changeset/kind-glasses-lay.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +fix(medusa): provide correct count of regions diff --git a/integration-tests/api/__tests__/admin/region.js b/integration-tests/api/__tests__/admin/region.js index 741d42c6ed..8a37e3a282 100644 --- a/integration-tests/api/__tests__/admin/region.js +++ b/integration-tests/api/__tests__/admin/region.js @@ -183,6 +183,20 @@ describe("/admin/regions", () => { expect(response.status).toEqual(200) }) + it("returns count of total regions", async () => { + const api = useApi() + + const response = await api.get(`/admin/regions?limit=2`, { + headers: { + Authorization: "Bearer test_token", + }, + }) + + expect(response.data.regions).toHaveLength(2) + expect(response.data.count).toEqual(3) + expect(response.status).toEqual(200) + }) + it("filters correctly on update", async () => { const api = useApi() @@ -351,7 +365,7 @@ describe("[MEDUSA_FF_TAX_INCLUSIVE_PRICING] /admin/regions", () => { includes_tax: true, } - let response = await api + const response = await api .post(`/admin/regions`, payload, adminReqConfig) .catch((err) => { console.log(err) diff --git a/packages/medusa/src/api/routes/admin/regions/__tests__/list-regions.js b/packages/medusa/src/api/routes/admin/regions/__tests__/list-regions.js index 8745ba0dc2..633fd0c6dc 100644 --- a/packages/medusa/src/api/routes/admin/regions/__tests__/list-regions.js +++ b/packages/medusa/src/api/routes/admin/regions/__tests__/list-regions.js @@ -1,6 +1,6 @@ import { IdMap } from "medusa-test-utils" -import { request } from "../../../../../helpers/test-request" import { RegionServiceMock } from "../../../../../services/__mocks__/region" +import { request } from "../../../../../helpers/test-request" const defaultFields = [ "id", @@ -46,8 +46,8 @@ describe("GET /admin/regions", () => { }) it("calls service list", () => { - expect(RegionServiceMock.list).toHaveBeenCalledTimes(1) - expect(RegionServiceMock.list).toHaveBeenCalledWith( + expect(RegionServiceMock.listAndCount).toHaveBeenCalledTimes(1) + expect(RegionServiceMock.listAndCount).toHaveBeenCalledWith( {}, { select: defaultFields, @@ -81,8 +81,8 @@ describe("GET /admin/regions", () => { }) it("calls service list", () => { - expect(RegionServiceMock.list).toHaveBeenCalledTimes(1) - expect(RegionServiceMock.list).toHaveBeenCalledWith( + expect(RegionServiceMock.listAndCount).toHaveBeenCalledTimes(1) + expect(RegionServiceMock.listAndCount).toHaveBeenCalledWith( {}, { select: defaultFields, 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 926c204ef6..8c74284212 100644 --- a/packages/medusa/src/api/routes/admin/regions/list-regions.ts +++ b/packages/medusa/src/api/routes/admin/regions/list-regions.ts @@ -105,14 +105,14 @@ export default async (req, res) => { take: validated.limit, } - const regions: Region[] = await regionService.list( + const [regions, count] = await regionService.listAndCount( _.pickBy(filterableFields, identity), listConfig ) res.json({ regions, - count: regions.length, + count, offset: validated.offset, limit: validated.limit, }) diff --git a/packages/medusa/src/services/__mocks__/region.js b/packages/medusa/src/services/__mocks__/region.js index fe0786db47..41975e909e 100644 --- a/packages/medusa/src/services/__mocks__/region.js +++ b/packages/medusa/src/services/__mocks__/region.js @@ -46,7 +46,7 @@ export const RegionServiceMock = { withTransaction: function () { return this }, - retrieve: jest.fn().mockImplementation(regionId => { + retrieve: jest.fn().mockImplementation((regionId) => { if (regionId === IdMap.getId("testRegion")) { return Promise.resolve(regions.testRegion) } @@ -64,30 +64,36 @@ export const RegionServiceMock = { } return Promise.resolve(regions.testRegion) }), - delete: jest.fn().mockImplementation(data => Promise.resolve()), + delete: jest.fn().mockImplementation((data) => Promise.resolve()), create: jest .fn() - .mockImplementation(data => Promise.resolve({ id: "region" })), - addCountry: jest.fn().mockImplementation(data => Promise.resolve()), + .mockImplementation((data) => Promise.resolve({ id: "region" })), + addCountry: jest.fn().mockImplementation((data) => Promise.resolve()), addFulfillmentProvider: jest .fn() - .mockImplementation(data => Promise.resolve()), - addPaymentProvider: jest.fn().mockImplementation(data => Promise.resolve()), - removeCountry: jest.fn().mockImplementation(data => Promise.resolve()), + .mockImplementation((data) => Promise.resolve()), + addPaymentProvider: jest.fn().mockImplementation((data) => Promise.resolve()), + removeCountry: jest.fn().mockImplementation((data) => Promise.resolve()), removeFulfillmentProvider: jest .fn() - .mockImplementation(data => Promise.resolve()), + .mockImplementation((data) => Promise.resolve()), removePaymentProvider: jest .fn() - .mockImplementation(data => Promise.resolve()), - update: jest.fn().mockImplementation(data => Promise.resolve()), - list: jest.fn().mockImplementation(data => { + .mockImplementation((data) => Promise.resolve()), + update: jest.fn().mockImplementation((data) => Promise.resolve()), + list: jest.fn().mockImplementation((data) => { return Promise.resolve([ regions.testRegion, regions.regionFrance, regions.regionUs, ]) }), + listAndCount: jest.fn().mockImplementation((data) => { + return Promise.resolve([ + [regions.testRegion, regions.regionFrance, regions.regionUs], + 3, + ]) + }), } const mock = jest.fn().mockImplementation(() => { diff --git a/packages/medusa/src/services/region.ts b/packages/medusa/src/services/region.ts index af70622ae6..bc694efbaa 100644 --- a/packages/medusa/src/services/region.ts +++ b/packages/medusa/src/services/region.ts @@ -1,25 +1,24 @@ -import { DeepPartial, EntityManager } from "typeorm" - -import { isDefined, MedusaError } from "medusa-core-utils" - -import { TransactionBaseService } from "../interfaces" -import TaxInclusivePricingFeatureFlag from "../loaders/feature-flags/tax-inclusive-pricing" import { Country, Currency, Region } from "../models" +import { CreateRegionInput, UpdateRegionInput } from "../types/region" +import { DeepPartial, EntityManager } from "typeorm" +import { FindConfig, Selector } from "../types/common" +import { MedusaError, isDefined } from "medusa-core-utils" +import { buildQuery, setMetadata } from "../utils" + import { CountryRepository } from "../repositories/country" import { CurrencyRepository } from "../repositories/currency" -import { FulfillmentProviderRepository } from "../repositories/fulfillment-provider" -import { PaymentProviderRepository } from "../repositories/payment-provider" -import { RegionRepository } from "../repositories/region" -import { TaxProviderRepository } from "../repositories/tax-provider" -import { FindConfig, Selector } from "../types/common" -import { CreateRegionInput, UpdateRegionInput } from "../types/region" -import { buildQuery, setMetadata } from "../utils" -import { countries } from "../utils/countries" -import { FlagRouter } from "../utils/flag-router" import EventBusService from "./event-bus" +import { FlagRouter } from "../utils/flag-router" +import { FulfillmentProviderRepository } from "../repositories/fulfillment-provider" import FulfillmentProviderService from "./fulfillment-provider" +import { PaymentProviderRepository } from "../repositories/payment-provider" import { PaymentProviderService } from "./index" +import { RegionRepository } from "../repositories/region" import StoreService from "./store" +import TaxInclusivePricingFeatureFlag from "../loaders/feature-flags/tax-inclusive-pricing" +import { TaxProviderRepository } from "../repositories/tax-provider" +import { TransactionBaseService } from "../interfaces" +import { countries } from "../utils/countries" type InjectedDependencies = { manager: EntityManager @@ -511,12 +510,31 @@ class RegionService extends TransactionBaseService { take: 10, } ): Promise { + const [regions] = await this.listAndCount(selector, config) + return regions + } + + /** + * Lists all regions based on a query and returns them along with count + * + * @param {object} selector - query object for find + * @param {object} config - configuration settings + * @return {Promise} result of the find operation + */ + async listAndCount( + selector: Selector = {}, + config: FindConfig = { + relations: [], + skip: 0, + take: 10, + } + ): Promise<[Region[], number]> { const regionRepo = this.activeManager_.withRepository( this.regionRepository_ ) const query = buildQuery(selector, config) - return regionRepo.find(query) + return await regionRepo.findAndCount(query) } /**