From b603f7dc8f6851e46fa9651254ffe263363987fe Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Tue, 2 Aug 2022 12:23:01 +0200 Subject: [PATCH] chore(medusa): Add transaction on mutation actions (2) (#1855) **What** Wrap all actions that require the usage of an atomic phase into a transaction from the handler **Info** The following end points have been removed since that they rely on non existing stuff and can't be used and are not used admin - create-order admin - delete order metadata admin - set region metadata admin - remove region metadata Fixes CORE-358 --- .../medusa-js/src/resources/admin/regions.ts | 33 ------------ .../src/hooks/admin/regions/mutations.ts | 32 ------------ .../hooks/admin/regions/mutations.test.ts | 46 ----------------- .../admin/price-lists/add-prices-batch.ts | 8 ++- .../admin/price-lists/create-price-list.ts | 10 ++-- .../admin/price-lists/delete-price-list.ts | 6 ++- .../admin/price-lists/delete-prices-batch.ts | 8 ++- .../price-lists/delete-product-prices.ts | 12 +++-- .../price-lists/delete-variant-prices.ts | 12 +++-- .../admin/price-lists/update-price-list.ts | 8 ++- .../api/routes/admin/products/add-option.ts | 9 +++- .../routes/admin/products/create-product.ts | 24 ++++++--- .../routes/admin/products/create-variant.ts | 8 ++- .../routes/admin/products/delete-option.ts | 8 ++- .../routes/admin/products/delete-product.ts | 7 ++- .../routes/admin/products/delete-variant.ts | 9 +++- .../api/routes/admin/products/set-metadata.ts | 8 ++- .../routes/admin/products/update-option.ts | 8 ++- .../routes/admin/products/update-product.ts | 9 +++- .../routes/admin/products/update-variant.ts | 12 +++-- .../api/routes/admin/regions/add-country.ts | 8 ++- .../admin/regions/add-fulfillment-provider.ts | 8 ++- .../admin/regions/add-payment-provider.ts | 8 ++- .../api/routes/admin/regions/create-region.ts | 10 +++- .../routes/admin/regions/delete-metadata.ts | 38 -------------- .../api/routes/admin/regions/delete-region.ts | 8 ++- .../src/api/routes/admin/regions/index.ts | 17 ------- .../routes/admin/regions/remove-country.ts | 8 ++- .../regions/remove-fulfillment-provider.ts | 8 ++- .../admin/regions/remove-payment-provider.ts | 8 ++- .../api/routes/admin/regions/set-metadata.ts | 50 ------------------- .../api/routes/admin/regions/update-region.ts | 9 +++- .../admin/return-reasons/create-reason.ts | 8 ++- .../admin/return-reasons/delete-reason.ts | 8 ++- .../admin/return-reasons/update-reason.ts | 8 ++- .../api/routes/admin/returns/cancel-return.ts | 6 ++- .../admin/sales-channels/add-product-batch.ts | 20 +++++--- .../sales-channels/create-sales-channel.ts | 12 +++-- .../sales-channels/delete-products-batch.ts | 19 ++++--- .../sales-channels/delete-sales-channel.ts | 9 +++- .../sales-channels/update-sales-channel.ts | 11 +++- .../create-shipping-option.ts | 9 +++- .../delete-shipping-option.ts | 9 +++- .../update-shipping-option.ts | 8 ++- .../create-shipping-profile.ts | 8 ++- .../delete-shipping-profile.ts | 8 ++- .../update-shipping-profile.ts | 8 ++- .../api/routes/admin/store/add-currency.ts | 9 +++- .../api/routes/admin/store/remove-currency.ts | 9 +++- .../api/routes/admin/store/update-store.ts | 8 ++- .../admin/tax-rates/add-to-product-types.ts | 8 ++- .../routes/admin/tax-rates/add-to-products.ts | 8 ++- .../tax-rates/add-to-shipping-options.ts | 8 ++- .../routes/admin/tax-rates/delete-tax-rate.ts | 6 ++- .../tax-rates/remove-from-product-types.ts | 8 ++- .../admin/tax-rates/remove-from-products.ts | 8 ++- .../tax-rates/remove-from-shipping-options.ts | 11 ++-- .../src/api/routes/admin/users/create-user.ts | 8 ++- .../src/api/routes/admin/users/delete-user.ts | 6 ++- .../admin/users/reset-password-token.ts | 8 ++- .../api/routes/admin/users/reset-password.ts | 11 ++-- .../src/api/routes/admin/users/update-user.ts | 9 +++- .../medusa/src/services/__mocks__/region.js | 3 ++ .../src/services/__mocks__/shipping-option.js | 3 ++ 64 files changed, 433 insertions(+), 306 deletions(-) delete mode 100644 packages/medusa/src/api/routes/admin/regions/delete-metadata.ts delete mode 100644 packages/medusa/src/api/routes/admin/regions/set-metadata.ts diff --git a/packages/medusa-js/src/resources/admin/regions.ts b/packages/medusa-js/src/resources/admin/regions.ts index de8706a71b..248ba28ace 100644 --- a/packages/medusa-js/src/resources/admin/regions.ts +++ b/packages/medusa-js/src/resources/admin/regions.ts @@ -8,7 +8,6 @@ import { AdminPostRegionsRegionCountriesReq, AdminPostRegionsRegionFulfillmentProvidersReq, AdminPostRegionsRegionPaymentProvidersReq, - AdminPostRegionsRegionMetadata, AdminGetRegionsRegionFulfillmentOptionsRes, } from "@medusajs/medusa" import qs from "qs" @@ -94,38 +93,6 @@ class AdminRegionsResource extends BaseResource { return this.client.request("GET", path, undefined, {}, customHeaders) } - /** - * @description adds metadata to a region - * @param id region id - * @param payload metadata - * @param customHeaders - * @returns updated region - */ - setMetadata( - id: string, - payload: AdminPostRegionsRegionMetadata, - customHeaders: Record = {} - ): ResponsePromise { - const path = `/admin/regions/${id}/metadata` - return this.client.request("POST", path, payload, {}, customHeaders) - } - - /** - * @description delete a region's metadata key value pair - * @param id region id - * @param key metadata key - * @param customHeaders - * @returns updated region - */ - deleteMetadata( - id: string, - key: string, - customHeaders: Record = {} - ): ResponsePromise { - const path = `/admin/regions/${id}/metadata/${key}` - return this.client.request("DELETE", path, undefined, {}, customHeaders) - } - /** * @description adds a country to the list of countries in a region * @param id region id diff --git a/packages/medusa-react/src/hooks/admin/regions/mutations.ts b/packages/medusa-react/src/hooks/admin/regions/mutations.ts index efe23a61a7..0b8f719278 100644 --- a/packages/medusa-react/src/hooks/admin/regions/mutations.ts +++ b/packages/medusa-react/src/hooks/admin/regions/mutations.ts @@ -4,7 +4,6 @@ import { AdminRegionsRes, AdminPostRegionsRegionReq, AdminPostRegionsReq, - AdminPostRegionsRegionMetadata, AdminPostRegionsRegionCountriesReq, AdminPostRegionsRegionFulfillmentProvidersReq, AdminPostRegionsRegionPaymentProvidersReq, @@ -69,37 +68,6 @@ export const useAdminDeleteRegion = ( ) } -export const useAdminSetRegionMetadata = ( - id: string, - options?: UseMutationOptions< - Response, - Error, - AdminPostRegionsRegionMetadata - > -) => { - const { client } = useMedusa() - const queryClient = useQueryClient() - - return useMutation( - (metadata: AdminPostRegionsRegionMetadata) => - client.admin.regions.setMetadata(id, metadata), - buildOptions(queryClient, adminRegionKeys.detail(id), options) - ) -} - -export const useAdminDeleteRegionMetadata = ( - id: string, - options?: UseMutationOptions, Error, string> -) => { - const { client } = useMedusa() - const queryClient = useQueryClient() - - return useMutation( - (key: string) => client.admin.regions.deleteMetadata(id, key), - buildOptions(queryClient, adminRegionKeys.detail(id), options) - ) -} - export const useAdminRegionAddCountry = ( id: string, options?: UseMutationOptions< diff --git a/packages/medusa-react/test/hooks/admin/regions/mutations.test.ts b/packages/medusa-react/test/hooks/admin/regions/mutations.test.ts index cbfe9352b4..8f5790f0cf 100644 --- a/packages/medusa-react/test/hooks/admin/regions/mutations.test.ts +++ b/packages/medusa-react/test/hooks/admin/regions/mutations.test.ts @@ -2,8 +2,6 @@ import { useAdminCreateRegion, useAdminUpdateRegion, useAdminDeleteRegion, - useAdminSetRegionMetadata, - useAdminDeleteRegionMetadata, useAdminRegionAddFulfillmentProvider, useAdminRegionDeleteFulfillmentProvider, useAdminRegionAddPaymentProvider, @@ -89,50 +87,6 @@ describe("useAdminDeleteRegion hook", () => { }) }) -describe("useAdminSetRegionMetadata hook", () => { - test("updates a region's metadata", async () => { - const metadata = { - key: "some_key", - value: "some_value", - } - const id = fixtures.get("region").id - - const { result, waitFor } = renderHook( - () => useAdminSetRegionMetadata(id), - { - wrapper: createWrapper(), - } - ) - - result.current.mutate(metadata) - - await waitFor(() => result.current.isSuccess) - - expect(result.current.data.response.status).toEqual(200) - expect(result.current.data.region).toEqual(fixtures.get("region")) - }) -}) - -describe("useAdminDeleteRegionMetadata hook", () => { - test("deletes a region's metadata", async () => { - const id = fixtures.get("region").id - - const { result, waitFor } = renderHook( - () => useAdminDeleteRegionMetadata(id), - { - wrapper: createWrapper(), - } - ) - - result.current.mutate("some_key") - - await waitFor(() => result.current.isSuccess) - - expect(result.current.data.response.status).toEqual(200) - expect(result.current.data.region).toEqual(fixtures.get("region")) - }) -}) - describe("useAdminRegionAddFulfillmentProvider hook", () => { test("adds a fulfillment provider to a region", async () => { const payload = { diff --git a/packages/medusa/src/api/routes/admin/price-lists/add-prices-batch.ts b/packages/medusa/src/api/routes/admin/price-lists/add-prices-batch.ts index 02863f1c40..0b869c6992 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/add-prices-batch.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/add-prices-batch.ts @@ -5,6 +5,7 @@ import { PriceList } from "../../../.." import PriceListService from "../../../../services/price-list" import { AdminPriceListPricesUpdateReq } from "../../../../types/price-list" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /price-lists/{id}/prices/batch @@ -77,7 +78,12 @@ export default async (req, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - await priceListService.addPrices(id, validated.prices, validated.override) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await priceListService + .withTransaction(transactionManager) + .addPrices(id, validated.prices, validated.override) + }) const priceList = await priceListService.retrieve(id, { select: defaultAdminPriceListFields as (keyof PriceList)[], diff --git a/packages/medusa/src/api/routes/admin/price-lists/create-price-list.ts b/packages/medusa/src/api/routes/admin/price-lists/create-price-list.ts index 5dc18c283c..4d6a6f4ef9 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/create-price-list.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/create-price-list.ts @@ -14,6 +14,7 @@ import { PriceListType, } from "../../../../types/price-list" import { Request } from "express" +import { EntityManager } from "typeorm" /** * @oas [post] /price_lists @@ -90,9 +91,12 @@ export default async (req: Request, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - const priceList = await priceListService.create( - req.validatedBody as CreatePriceListInput - ) + const manager: EntityManager = req.scope.resolve("manager") + const priceList = await manager.transaction(async (transactionManager) => { + return await priceListService + .withTransaction(transactionManager) + .create(req.validatedBody as CreatePriceListInput) + }) res.json({ price_list: priceList }) } diff --git a/packages/medusa/src/api/routes/admin/price-lists/delete-price-list.ts b/packages/medusa/src/api/routes/admin/price-lists/delete-price-list.ts index 3da319d55c..3f1f8c9f5b 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/delete-price-list.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/delete-price-list.ts @@ -1,4 +1,5 @@ import PriceListService from "../../../../services/price-list" +import { EntityManager } from "typeorm" /** * @oas [delete] /price-lists/{id} @@ -31,7 +32,10 @@ export default async (req, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - await priceListService.delete(id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await priceListService.withTransaction(transactionManager).delete(id) + }) res.json({ id, diff --git a/packages/medusa/src/api/routes/admin/price-lists/delete-prices-batch.ts b/packages/medusa/src/api/routes/admin/price-lists/delete-prices-batch.ts index 5784281363..69cd571ec6 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/delete-prices-batch.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/delete-prices-batch.ts @@ -1,6 +1,7 @@ import { ArrayNotEmpty, IsString } from "class-validator" import PriceListService from "../../../../services/price-list" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [delete] /price-lists/{id}/prices/batch @@ -51,7 +52,12 @@ export default async (req, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - await priceListService.deletePrices(id, validated.price_ids) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await priceListService + .withTransaction(transactionManager) + .deletePrices(id, validated.price_ids) + }) res.json({ ids: validated.price_ids, object: "money-amount", deleted: true }) } diff --git a/packages/medusa/src/api/routes/admin/price-lists/delete-product-prices.ts b/packages/medusa/src/api/routes/admin/price-lists/delete-product-prices.ts index 78b628ca42..a02578c589 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/delete-product-prices.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/delete-product-prices.ts @@ -1,4 +1,5 @@ import PriceListService from "../../../../services/price-list" +import { EntityManager } from "typeorm" /** * @oas [delete] /price-lists/{id}/products/{product_id}/prices @@ -36,9 +37,14 @@ export default async (req, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - const [deletedPriceIds] = await priceListService.deleteProductPrices(id, [ - product_id, - ]) + const manager: EntityManager = req.scope.resolve("manager") + const [deletedPriceIds] = await manager.transaction( + async (transactionManager) => { + return await priceListService + .withTransaction(transactionManager) + .deleteProductPrices(id, [product_id]) + } + ) return res.json({ ids: deletedPriceIds, diff --git a/packages/medusa/src/api/routes/admin/price-lists/delete-variant-prices.ts b/packages/medusa/src/api/routes/admin/price-lists/delete-variant-prices.ts index b34a9858cf..544ad7479f 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/delete-variant-prices.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/delete-variant-prices.ts @@ -1,4 +1,5 @@ import PriceListService from "../../../../services/price-list" +import { EntityManager } from "typeorm" /** * @oas [delete] /price-lists/{id}/variants/{variant_id}/prices @@ -36,9 +37,14 @@ export default async (req, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - const [deletedPriceIds] = await priceListService.deleteVariantPrices(id, [ - variant_id, - ]) + const manager: EntityManager = req.scope.resolve("manager") + const [deletedPriceIds] = await manager.transaction( + async (transactionManager) => { + return await priceListService + .withTransaction(transactionManager) + .deleteVariantPrices(id, [variant_id]) + } + ) return res.json({ ids: deletedPriceIds, diff --git a/packages/medusa/src/api/routes/admin/price-lists/update-price-list.ts b/packages/medusa/src/api/routes/admin/price-lists/update-price-list.ts index 454a86757f..887abac188 100644 --- a/packages/medusa/src/api/routes/admin/price-lists/update-price-list.ts +++ b/packages/medusa/src/api/routes/admin/price-lists/update-price-list.ts @@ -15,6 +15,7 @@ import { PriceListType, } from "../../../../types/price-list" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /price_lists/{id} @@ -103,7 +104,12 @@ export default async (req, res) => { const priceListService: PriceListService = req.scope.resolve("priceListService") - await priceListService.update(id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await priceListService + .withTransaction(transactionManager) + .update(id, validated) + }) const priceList = await priceListService.retrieve(id, { select: defaultAdminPriceListFields as (keyof PriceList)[], diff --git a/packages/medusa/src/api/routes/admin/products/add-option.ts b/packages/medusa/src/api/routes/admin/products/add-option.ts index 445dd35292..2357c86977 100644 --- a/packages/medusa/src/api/routes/admin/products/add-option.ts +++ b/packages/medusa/src/api/routes/admin/products/add-option.ts @@ -2,6 +2,7 @@ import { IsString } from "class-validator" import { defaultAdminProductFields, defaultAdminProductRelations } from "." import { ProductService, PricingService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /products/{id}/options @@ -44,7 +45,13 @@ export default async (req, res) => { const productService: ProductService = req.scope.resolve("productService") const pricingService: PricingService = req.scope.resolve("pricingService") - await productService.addOption(id, validated.title) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await productService + .withTransaction(transactionManager) + .addOption(id, validated.title) + }) + const rawProduct = await productService.retrieve(id, { select: defaultAdminProductFields, relations: defaultAdminProductRelations, diff --git a/packages/medusa/src/api/routes/admin/products/create-product.ts b/packages/medusa/src/api/routes/admin/products/create-product.ts index d303d1c758..4c1fa71c50 100644 --- a/packages/medusa/src/api/routes/admin/products/create-product.ts +++ b/packages/medusa/src/api/routes/admin/products/create-product.ts @@ -24,8 +24,11 @@ import { ProductTagReq, ProductTypeReq, } from "../../../../types/product" -import { ProductVariantPricesCreateReq } from "../../../../types/product-variant" import { FeatureFlagDecorators } from "../../../../utils/feature-flag-decorators" +import { + CreateProductVariantInput, + ProductVariantPricesCreateReq, +} from "../../../../types/product-variant" import { validator } from "../../../../utils/validator" /** @@ -237,8 +240,7 @@ export default async (req, res) => { const entityManager: EntityManager = req.scope.resolve("manager") - let newProduct - await entityManager.transaction(async (manager) => { + const newProduct = await entityManager.transaction(async (manager) => { const { variants } = validated delete validated.variants @@ -249,12 +251,16 @@ export default async (req, res) => { let shippingProfile // Get default shipping profile if (validated.is_giftcard) { - shippingProfile = await shippingProfileService.retrieveGiftCardDefault() + shippingProfile = await shippingProfileService + .withTransaction(manager) + .retrieveGiftCardDefault() } else { - shippingProfile = await shippingProfileService.retrieveDefault() + shippingProfile = await shippingProfileService + .withTransaction(manager) + .retrieveDefault() } - newProduct = await productService + const newProduct = await productService .withTransaction(manager) .create({ ...validated, profile_id: shippingProfile.id }) @@ -265,7 +271,7 @@ export default async (req, res) => { const optionIds = validated?.options?.map( - (o) => newProduct.options.find((newO) => newO.title === o.title).id + (o) => newProduct.options.find((newO) => newO.title === o.title)?.id ) || [] await Promise.all( @@ -281,10 +287,12 @@ export default async (req, res) => { await productVariantService .withTransaction(manager) - .create(newProduct.id, variant) + .create(newProduct.id, variant as CreateProductVariantInput) }) ) } + + return newProduct }) const rawProduct = await productService.retrieve(newProduct.id, { diff --git a/packages/medusa/src/api/routes/admin/products/create-variant.ts b/packages/medusa/src/api/routes/admin/products/create-variant.ts index 05afc6e662..135eeadb8d 100644 --- a/packages/medusa/src/api/routes/admin/products/create-variant.ts +++ b/packages/medusa/src/api/routes/admin/products/create-variant.ts @@ -12,6 +12,7 @@ import { defaultAdminProductFields, defaultAdminProductRelations } from "." import { ProductService, ProductVariantService } from "../../../../services" import { ProductVariantPricesCreateReq } from "../../../../types/product-variant" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /products/{id}/variants @@ -135,7 +136,12 @@ export default async (req, res) => { ) const productService: ProductService = req.scope.resolve("productService") - await productVariantService.create(id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await productVariantService + .withTransaction(transactionManager) + .create(id, validated) + }) const product = await productService.retrieve(id, { select: defaultAdminProductFields, diff --git a/packages/medusa/src/api/routes/admin/products/delete-option.ts b/packages/medusa/src/api/routes/admin/products/delete-option.ts index b0349d2c3c..692dc0a37f 100644 --- a/packages/medusa/src/api/routes/admin/products/delete-option.ts +++ b/packages/medusa/src/api/routes/admin/products/delete-option.ts @@ -1,5 +1,6 @@ import { defaultAdminProductFields, defaultAdminProductRelations } from "." import { ProductService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /products/{id}/options/{option_id} @@ -35,7 +36,12 @@ export default async (req, res) => { const productService: ProductService = req.scope.resolve("productService") - await productService.deleteOption(id, option_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await productService + .withTransaction(transactionManager) + .deleteOption(id, option_id) + }) const data = await productService.retrieve(id, { select: defaultAdminProductFields, diff --git a/packages/medusa/src/api/routes/admin/products/delete-product.ts b/packages/medusa/src/api/routes/admin/products/delete-product.ts index 5977c987d8..f39c50dd23 100644 --- a/packages/medusa/src/api/routes/admin/products/delete-product.ts +++ b/packages/medusa/src/api/routes/admin/products/delete-product.ts @@ -1,4 +1,5 @@ import { ProductService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /products/{id} @@ -30,7 +31,11 @@ export default async (req, res) => { const { id } = req.params const productService: ProductService = req.scope.resolve("productService") - await productService.delete(id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await productService.withTransaction(transactionManager).delete(id) + }) + res.json({ id, object: "product", diff --git a/packages/medusa/src/api/routes/admin/products/delete-variant.ts b/packages/medusa/src/api/routes/admin/products/delete-variant.ts index 3a28989f4f..ff701fc642 100644 --- a/packages/medusa/src/api/routes/admin/products/delete-variant.ts +++ b/packages/medusa/src/api/routes/admin/products/delete-variant.ts @@ -4,6 +4,7 @@ import { PricingService, ProductVariantService, } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /products/{id}/variants/{variant_id} @@ -41,12 +42,18 @@ export default async (req, res) => { const productService: ProductService = req.scope.resolve("productService") const pricingService: PricingService = req.scope.resolve("pricingService") - await productVariantService.delete(variant_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + await productVariantService + .withTransaction(transactionManager) + .delete(variant_id) + }) const data = await productService.retrieve(id, { select: defaultAdminProductFields, relations: defaultAdminProductRelations, }) + const [product] = await pricingService.setProductPrices([data]) res.json({ diff --git a/packages/medusa/src/api/routes/admin/products/set-metadata.ts b/packages/medusa/src/api/routes/admin/products/set-metadata.ts index 8046aa7f5c..de5b2a3e71 100644 --- a/packages/medusa/src/api/routes/admin/products/set-metadata.ts +++ b/packages/medusa/src/api/routes/admin/products/set-metadata.ts @@ -1,6 +1,7 @@ import { IsString } from "class-validator" import { defaultAdminProductFields, defaultAdminProductRelations } from "." import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /products/{id}/metadata @@ -45,8 +46,11 @@ export default async (req, res) => { ) const productService = req.scope.resolve("productService") - await productService.update(id, { - metadata: { [validated.key]: validated.value }, + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await productService.withTransaction(transactionManager).update(id, { + metadata: { [validated.key]: validated.value }, + }) }) const product = await productService.retrieve(id, { diff --git a/packages/medusa/src/api/routes/admin/products/update-option.ts b/packages/medusa/src/api/routes/admin/products/update-option.ts index 5d6f21378b..22822873e8 100644 --- a/packages/medusa/src/api/routes/admin/products/update-option.ts +++ b/packages/medusa/src/api/routes/admin/products/update-option.ts @@ -2,6 +2,7 @@ import { IsString } from "class-validator" import { defaultAdminProductFields, defaultAdminProductRelations } from "." import { ProductService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /products/{id}/options/{option_id} @@ -44,7 +45,12 @@ export default async (req, res) => { const productService: ProductService = req.scope.resolve("productService") - await productService.updateOption(id, option_id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await productService + .withTransaction(transactionManager) + .updateOption(id, option_id, validated) + }) const product = await productService.retrieve(id, { select: defaultAdminProductFields, diff --git a/packages/medusa/src/api/routes/admin/products/update-product.ts b/packages/medusa/src/api/routes/admin/products/update-product.ts index 4179dd55c6..01598f3b7f 100644 --- a/packages/medusa/src/api/routes/admin/products/update-product.ts +++ b/packages/medusa/src/api/routes/admin/products/update-product.ts @@ -24,6 +24,7 @@ import { import { ProductVariantPricesUpdateReq } from "../../../../types/product-variant" import { FeatureFlagDecorators } from "../../../../utils/feature-flag-decorators" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /products/{id} @@ -224,12 +225,18 @@ export default async (req, res) => { const productService: ProductService = req.scope.resolve("productService") const pricingService: PricingService = req.scope.resolve("pricingService") - await productService.update(id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + await productService + .withTransaction(transactionManager) + .update(id, validated) + }) const rawProduct = await productService.retrieve(id, { select: defaultAdminProductFields, relations: defaultAdminProductRelations, }) + const [product] = await pricingService.setProductPrices([rawProduct]) res.json({ product }) diff --git a/packages/medusa/src/api/routes/admin/products/update-variant.ts b/packages/medusa/src/api/routes/admin/products/update-variant.ts index 894a6db7fa..c043f8e416 100644 --- a/packages/medusa/src/api/routes/admin/products/update-variant.ts +++ b/packages/medusa/src/api/routes/admin/products/update-variant.ts @@ -17,6 +17,7 @@ import { import { PriceSelectionParams } from "../../../../types/price-selection" import { ProductVariantPricesUpdateReq } from "../../../../types/product-variant" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /products/{id}/variants/{variant_id} @@ -143,9 +144,14 @@ export default async (req, res) => { "productVariantService" ) - await productVariantService.update(variant_id, { - product_id: id, - ...validated, + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + await productVariantService + .withTransaction(transactionManager) + .update(variant_id, { + product_id: id, + ...validated, + }) }) const rawProduct = await productService.retrieve(id, { diff --git a/packages/medusa/src/api/routes/admin/regions/add-country.ts b/packages/medusa/src/api/routes/admin/regions/add-country.ts index 71765c4d84..60463820c0 100644 --- a/packages/medusa/src/api/routes/admin/regions/add-country.ts +++ b/packages/medusa/src/api/routes/admin/regions/add-country.ts @@ -3,6 +3,7 @@ import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." import { validator } from "../../../../utils/validator" import { Region } from "../../../.." import RegionService from "../../../../services/region" +import { EntityManager } from "typeorm" /** * @oas [post] /regions/{id}/countries * operationId: "PostRegionsRegionCountries" @@ -41,7 +42,12 @@ export default async (req, res) => { ) const regionService: RegionService = req.scope.resolve("regionService") - await regionService.addCountry(region_id, validated.country_code) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .addCountry(region_id, validated.country_code) + }) const region: Region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/add-fulfillment-provider.ts b/packages/medusa/src/api/routes/admin/regions/add-fulfillment-provider.ts index ca52885043..5337ee63d9 100644 --- a/packages/medusa/src/api/routes/admin/regions/add-fulfillment-provider.ts +++ b/packages/medusa/src/api/routes/admin/regions/add-fulfillment-provider.ts @@ -3,6 +3,7 @@ import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." import { validator } from "../../../../utils/validator" import { Region } from "../../../.." import RegionService from "../../../../services/region" +import { EntityManager } from "typeorm" /** * @oas [post] /regions/{id}/fulfillment-providers * operationId: "PostRegionsRegionFulfillmentProviders" @@ -41,7 +42,12 @@ export default async (req, res) => { ) const regionService: RegionService = req.scope.resolve("regionService") - await regionService.addFulfillmentProvider(region_id, validated.provider_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .addFulfillmentProvider(region_id, validated.provider_id) + }) const region: Region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/add-payment-provider.ts b/packages/medusa/src/api/routes/admin/regions/add-payment-provider.ts index 2d84202ff2..4973eef657 100644 --- a/packages/medusa/src/api/routes/admin/regions/add-payment-provider.ts +++ b/packages/medusa/src/api/routes/admin/regions/add-payment-provider.ts @@ -3,6 +3,7 @@ import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." import { validator } from "../../../../utils/validator" import { Region } from "../../../.." import RegionService from "../../../../services/region" +import { EntityManager } from "typeorm" /** * @oas [post] /regions/{id}/payment-providers @@ -42,7 +43,12 @@ export default async (req, res) => { ) const regionService: RegionService = req.scope.resolve("regionService") - await regionService.addPaymentProvider(region_id, validated.provider_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .addPaymentProvider(region_id, validated.provider_id) + }) const region: Region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/create-region.ts b/packages/medusa/src/api/routes/admin/regions/create-region.ts index 53324906f6..ba12a36db6 100644 --- a/packages/medusa/src/api/routes/admin/regions/create-region.ts +++ b/packages/medusa/src/api/routes/admin/regions/create-region.ts @@ -3,6 +3,7 @@ import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." import { validator } from "../../../../utils/validator" import { Region } from "../../../.." import RegionService from "../../../../services/region" +import { EntityManager } from "typeorm" /** * @oas [post] /regions * operationId: "PostRegions" @@ -61,7 +62,14 @@ export default async (req, res) => { const validated = await validator(AdminPostRegionsReq, req.body) const regionService: RegionService = req.scope.resolve("regionService") - const result: Region = await regionService.create(validated) + const manager: EntityManager = req.scope.resolve("manager") + const result: Region = await manager.transaction( + async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .create(validated) + } + ) const region: Region = await regionService.retrieve(result.id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/delete-metadata.ts b/packages/medusa/src/api/routes/admin/regions/delete-metadata.ts deleted file mode 100644 index 6ae99642f3..0000000000 --- a/packages/medusa/src/api/routes/admin/regions/delete-metadata.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." -import { Region } from "../../../.." -import RegionService from "../../../../services/region" - -/** - * @oas [delete] /regions/{id}/metadata/{key} - * operationId: "DeleteRegionsRegionMetadataKey" - * summary: "Delete Metadata" - * description: "Deletes a metadata key." - * x-authenticated: true - * parameters: - * - (path) id=* {string} The id of the Region. - * - (path) key=* {string} The metadata key. - * tags: - * - Region - * responses: - * 200: - * description: OK - * content: - * application/json: - * schema: - * properties: - * region: - * $ref: "#/components/schemas/region" - */ -export default async (req, res) => { - const { id, key } = req.params - - const regionService: RegionService = req.scope.resolve("regionService") - await regionService.deleteMetadata(id, key) - - const region: Region = await regionService.retrieve(id, { - select: defaultAdminRegionFields, - relations: defaultAdminRegionRelations, - }) - - res.status(200).json({ region }) -} diff --git a/packages/medusa/src/api/routes/admin/regions/delete-region.ts b/packages/medusa/src/api/routes/admin/regions/delete-region.ts index de0188293b..3a9c651bdf 100644 --- a/packages/medusa/src/api/routes/admin/regions/delete-region.ts +++ b/packages/medusa/src/api/routes/admin/regions/delete-region.ts @@ -1,4 +1,5 @@ import RegionService from "../../../../services/region" +import { EntityManager } from "typeorm" /** * @oas [delete] /regions/{id} @@ -31,7 +32,12 @@ export default async (req, res) => { const regionService: RegionService = req.scope.resolve("regionService") - await regionService.delete(region_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .delete(region_id) + }) res.status(200).json({ id: region_id, diff --git a/packages/medusa/src/api/routes/admin/regions/index.ts b/packages/medusa/src/api/routes/admin/regions/index.ts index aecf79cfed..4fffb786a1 100644 --- a/packages/medusa/src/api/routes/admin/regions/index.ts +++ b/packages/medusa/src/api/routes/admin/regions/index.ts @@ -55,22 +55,6 @@ export default (app) => { middlewares.wrap(require("./remove-fulfillment-provider").default) ) - /** - * Set metadata key / value pair. - */ - route.post( - "/:id/metadata", - middlewares.wrap(require("./set-metadata").default) - ) - - /** - * Delete metadata key / value pair. - */ - route.delete( - "/:id/metadata/:key", - middlewares.wrap(require("./delete-metadata").default) - ) - return app } @@ -120,4 +104,3 @@ export * from "./create-region" export * from "./add-country" export * from "./add-payment-provider" export * from "./add-fulfillment-provider" -export * from "./set-metadata" diff --git a/packages/medusa/src/api/routes/admin/regions/remove-country.ts b/packages/medusa/src/api/routes/admin/regions/remove-country.ts index ee2291fadb..17bf4ecfdc 100644 --- a/packages/medusa/src/api/routes/admin/regions/remove-country.ts +++ b/packages/medusa/src/api/routes/admin/regions/remove-country.ts @@ -1,5 +1,6 @@ import RegionService from "../../../../services/region" import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." +import { EntityManager } from "typeorm" /** * @oas [delete] /regions/{id}/countries/{country_code} @@ -26,7 +27,12 @@ export default async (req, res) => { const { region_id, country_code } = req.params const regionService: RegionService = req.scope.resolve("regionService") - await regionService.removeCountry(region_id, country_code) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .removeCountry(region_id, country_code) + }) const region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/remove-fulfillment-provider.ts b/packages/medusa/src/api/routes/admin/regions/remove-fulfillment-provider.ts index 52ed7888d7..db107bea67 100644 --- a/packages/medusa/src/api/routes/admin/regions/remove-fulfillment-provider.ts +++ b/packages/medusa/src/api/routes/admin/regions/remove-fulfillment-provider.ts @@ -1,5 +1,6 @@ import RegionService from "../../../../services/region" import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." +import { EntityManager } from "typeorm" /** * @oas [delete] /regions/{id}/fulfillment-providers/{provider_id} @@ -26,7 +27,12 @@ export default async (req, res) => { const { region_id, provider_id } = req.params const regionService: RegionService = req.scope.resolve("regionService") - await regionService.removeFulfillmentProvider(region_id, provider_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .removeFulfillmentProvider(region_id, provider_id) + }) const region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/remove-payment-provider.ts b/packages/medusa/src/api/routes/admin/regions/remove-payment-provider.ts index 98b1f08168..344e392a50 100644 --- a/packages/medusa/src/api/routes/admin/regions/remove-payment-provider.ts +++ b/packages/medusa/src/api/routes/admin/regions/remove-payment-provider.ts @@ -1,5 +1,6 @@ import RegionService from "../../../../services/region" import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." +import { EntityManager } from "typeorm" /** * @oas [delete] /regions/{id}/payment-providers/{provider_id} @@ -26,7 +27,12 @@ export default async (req, res) => { const { region_id, provider_id } = req.params const regionService: RegionService = req.scope.resolve("regionService") - await regionService.removePaymentProvider(region_id, provider_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .removePaymentProvider(region_id, provider_id) + }) const region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, diff --git a/packages/medusa/src/api/routes/admin/regions/set-metadata.ts b/packages/medusa/src/api/routes/admin/regions/set-metadata.ts deleted file mode 100644 index 210bba457e..0000000000 --- a/packages/medusa/src/api/routes/admin/regions/set-metadata.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { IsString } from "class-validator" -import { validator } from "../../../../utils/validator" -import RegionService from "../../../../services/region" -import { defaultAdminRegionFields, defaultAdminRegionRelations } from "." - -/** - * @oas [post] /regions/{id}/metadata - * operationId: "PostRegionsRegionMetadata" - * summary: "Set the metadata of a Region" - * description: "Sets the metadata of a Region" - * x-authenticated: true - * parameters: - * - (path) id=* {string} The id of the Region. - * - (body) key=* {string} Key for the metadata value. - * - (body) value=* {string} The value that the key relates to. - * tags: - * - Region - * responses: - * 200: - * description: OK - * content: - * application/json: - * schema: - * properties: - * region: - * $ref: "#/components/schemas/region" - */ -export default async (req, res) => { - const { id } = req.params - - const validated = await validator(AdminPostRegionsRegionMetadata, req.body) - - const regionService: RegionService = req.scope.resolve("regionService") - await regionService.setMetadata(id, validated.key, validated.value) - - const region = await regionService.retrieve(id, { - select: defaultAdminRegionFields, - relations: defaultAdminRegionRelations, - }) - - res.status(200).json({ region }) -} - -export class AdminPostRegionsRegionMetadata { - @IsString() - key: string - - @IsString() - value: string -} diff --git a/packages/medusa/src/api/routes/admin/regions/update-region.ts b/packages/medusa/src/api/routes/admin/regions/update-region.ts index 3d727c7869..51c9889aeb 100644 --- a/packages/medusa/src/api/routes/admin/regions/update-region.ts +++ b/packages/medusa/src/api/routes/admin/regions/update-region.ts @@ -8,6 +8,7 @@ import { import { defaultAdminRegionRelations, defaultAdminRegionFields } from "." import { validator } from "../../../../utils/validator" import RegionService from "../../../../services/region" +import { EntityManager } from "typeorm" /** * @oas [post] /regions/{id} @@ -75,7 +76,13 @@ export default async (req, res) => { const validated = await validator(AdminPostRegionsRegionReq, req.body) const regionService: RegionService = req.scope.resolve("regionService") - await regionService.update(region_id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await regionService + .withTransaction(transactionManager) + .update(region_id, validated) + }) + const region = await regionService.retrieve(region_id, { select: defaultAdminRegionFields, relations: defaultAdminRegionRelations, diff --git a/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts b/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts index 0d931fe246..4d733519f0 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts @@ -5,6 +5,7 @@ import { } from "." import { ReturnReasonService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /return-reasons @@ -53,7 +54,12 @@ export default async (req, res) => { const returnReasonService: ReturnReasonService = req.scope.resolve( "returnReasonService" ) - const result = await returnReasonService.create(validated) + const manager: EntityManager = req.scope.resolve("manager") + const result = await manager.transaction(async (transactionManager) => { + return await returnReasonService + .withTransaction(transactionManager) + .create(validated) + }) const reason = await returnReasonService.retrieve(result.id, { select: defaultAdminReturnReasonsFields, diff --git a/packages/medusa/src/api/routes/admin/return-reasons/delete-reason.ts b/packages/medusa/src/api/routes/admin/return-reasons/delete-reason.ts index 912d479404..1ed3504c85 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/delete-reason.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/delete-reason.ts @@ -1,4 +1,5 @@ import { ReturnReasonService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /return-reasons/{id} @@ -32,7 +33,12 @@ export default async (req, res) => { const returnReasonService: ReturnReasonService = req.scope.resolve( "returnReasonService" ) - await returnReasonService.delete(id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await returnReasonService + .withTransaction(transactionManager) + .delete(id) + }) res.json({ id: id, diff --git a/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts b/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts index df086c4f2d..f906594e5a 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts @@ -5,6 +5,7 @@ import { } from "." import { ReturnReasonService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /return-reasons/{id} @@ -49,7 +50,12 @@ export default async (req, res) => { "returnReasonService" ) - await returnReasonService.update(id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await returnReasonService + .withTransaction(transactionManager) + .update(id, validated) + }) const reason = await returnReasonService.retrieve(id, { select: defaultAdminReturnReasonsFields, diff --git a/packages/medusa/src/api/routes/admin/returns/cancel-return.ts b/packages/medusa/src/api/routes/admin/returns/cancel-return.ts index 3edd130b7f..c3d2096a64 100644 --- a/packages/medusa/src/api/routes/admin/returns/cancel-return.ts +++ b/packages/medusa/src/api/routes/admin/returns/cancel-return.ts @@ -3,6 +3,7 @@ import { defaultAdminOrdersFields, defaultAdminOrdersRelations, } from "../orders" +import { EntityManager } from "typeorm" /** * @oas [post] /returns/{id}/cancel @@ -29,7 +30,10 @@ export default async (req, res) => { const returnService: ReturnService = req.scope.resolve("returnService") const orderService: OrderService = req.scope.resolve("orderService") - let result = await returnService.cancel(id) + const manager: EntityManager = req.scope.resolve("manager") + let result = await manager.transaction(async (transactionManager) => { + return await returnService.withTransaction(transactionManager).cancel(id) + }) if (result.swap_id) { const swapService = req.scope.resolve("swapService") diff --git a/packages/medusa/src/api/routes/admin/sales-channels/add-product-batch.ts b/packages/medusa/src/api/routes/admin/sales-channels/add-product-batch.ts index 98e7b6718c..87acf90872 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/add-product-batch.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/add-product-batch.ts @@ -3,6 +3,7 @@ import { SalesChannelService } from "../../../../services" import { IsArray, ValidateNested } from "class-validator" import { Type } from "class-transformer" import { ProductBatchSalesChannel } from "../../../../types/sales-channels" +import { EntityManager } from "typeorm" /** * @oas [post] /sales-channels/{id}/products/batch @@ -26,18 +27,25 @@ import { ProductBatchSalesChannel } from "../../../../types/sales-channels" * $ref: "#/components/schemas/sales_channel" */ export default async (req: Request, res: Response): Promise => { + const validatedBody = + req.validatedBody as AdminPostSalesChannelsChannelProductsBatchReq + const { id } = req.params const salesChannelService: SalesChannelService = req.scope.resolve( "salesChannelService" ) - const validatedBody = - req.validatedBody as AdminPostSalesChannelsChannelProductsBatchReq - const salesChannel = await salesChannelService.addProducts( - id, - validatedBody.product_ids.map((p) => p.id) - ) + const manager: EntityManager = req.scope.resolve("manager") + const salesChannel = await manager.transaction(async (transactionManager) => { + return await salesChannelService + .withTransaction(transactionManager) + .addProducts( + id, + validatedBody.product_ids.map((p) => p.id) + ) + }) + res.status(200).json({ sales_channel: salesChannel }) } diff --git a/packages/medusa/src/api/routes/admin/sales-channels/create-sales-channel.ts b/packages/medusa/src/api/routes/admin/sales-channels/create-sales-channel.ts index ed4302ab19..464a6ea3fc 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/create-sales-channel.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/create-sales-channel.ts @@ -3,6 +3,7 @@ import { IsBoolean, IsOptional, IsString } from "class-validator" import SalesChannelService from "../../../../services/sales-channel" import { CreateSalesChannelInput } from "../../../../types/sales-channels" +import { EntityManager } from "typeorm" /** * @oas [post] /sales-channels @@ -27,13 +28,18 @@ import { CreateSalesChannelInput } from "../../../../types/sales-channels" */ export default async (req: Request, res: Response) => { + const validatedBody = req.validatedBody as CreateSalesChannelInput const salesChannelService: SalesChannelService = req.scope.resolve( "salesChannelService" ) - const salesChannel = await salesChannelService.create( - req.validatedBody as CreateSalesChannelInput - ) + const manager: EntityManager = req.scope.resolve("manager") + const salesChannel = await manager.transaction(async (transactionManager) => { + return await salesChannelService + .withTransaction(transactionManager) + .create(validatedBody) + }) + res.status(200).json({ sales_channel: salesChannel }) } diff --git a/packages/medusa/src/api/routes/admin/sales-channels/delete-products-batch.ts b/packages/medusa/src/api/routes/admin/sales-channels/delete-products-batch.ts index e703f05441..2ccdb7564d 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/delete-products-batch.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/delete-products-batch.ts @@ -3,6 +3,7 @@ import { IsArray, ValidateNested } from "class-validator" import { SalesChannelService } from "../../../../services" import { Request, Response } from "express" import { ProductBatchSalesChannel } from "../../../../types/sales-channels" +import { EntityManager } from "typeorm" /** * @oas [delete] /sales-channels/{id}/products/batch @@ -27,18 +28,24 @@ import { ProductBatchSalesChannel } from "../../../../types/sales-channels" */ export default async (req: Request, res: Response) => { + const validatedBody = + req.validatedBody as AdminDeleteSalesChannelsChannelProductsBatchReq const { id } = req.params const salesChannelService: SalesChannelService = req.scope.resolve( "salesChannelService" ) - const validatedBody = - req.validatedBody as AdminDeleteSalesChannelsChannelProductsBatchReq - const salesChannel = await salesChannelService.removeProducts( - id, - validatedBody.product_ids.map((p) => p.id) - ) + const manager: EntityManager = req.scope.resolve("manager") + const salesChannel = await manager.transaction(async (transactionManager) => { + return await salesChannelService + .withTransaction(transactionManager) + .removeProducts( + id, + validatedBody.product_ids.map((p) => p.id) + ) + }) + res.status(200).json({ sales_channel: salesChannel }) } diff --git a/packages/medusa/src/api/routes/admin/sales-channels/delete-sales-channel.ts b/packages/medusa/src/api/routes/admin/sales-channels/delete-sales-channel.ts index 1d958eeed7..3cdae84192 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/delete-sales-channel.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/delete-sales-channel.ts @@ -1,5 +1,6 @@ import { Request, Response } from "express" import { SalesChannelService } from "../../../../services/" +import { EntityManager } from "typeorm" /** * @oas [delete] /sales-channels/{id} @@ -33,7 +34,13 @@ export default async (req: Request, res: Response): Promise => { const salesChannelService: SalesChannelService = req.scope.resolve( "salesChannelService" ) - await salesChannelService.delete(id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await salesChannelService + .withTransaction(transactionManager) + .delete(id) + }) + res.json({ id, object: "sales-channel", diff --git a/packages/medusa/src/api/routes/admin/sales-channels/update-sales-channel.ts b/packages/medusa/src/api/routes/admin/sales-channels/update-sales-channel.ts index ee9d4445d5..c42647ff5a 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/update-sales-channel.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/update-sales-channel.ts @@ -1,6 +1,7 @@ import { IsBoolean, IsOptional, IsString } from "class-validator" import { Request, Response } from "express" import { SalesChannelService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [post] /sales-channels/{id} @@ -45,7 +46,15 @@ export default async (req: Request, res: Response) => { const salesChannelService: SalesChannelService = req.scope.resolve( "salesChannelService" ) - const sales_channel = await salesChannelService.update(id, validatedBody) + const manager: EntityManager = req.scope.resolve("manager") + const sales_channel = await manager.transaction( + async (transactionManager) => { + return await salesChannelService + .withTransaction(transactionManager) + .update(id, validatedBody) + } + ) + res.status(200).json({ sales_channel }) } diff --git a/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.ts b/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.ts index bff45b1eb9..84a1f26e92 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.ts +++ b/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.ts @@ -9,6 +9,7 @@ import { } from "class-validator" import { defaultFields, defaultRelations } from "." import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /shipping-options @@ -92,7 +93,13 @@ export default async (req, res) => { validated.profile_id = id } - const result = await optionService.create(validated) + const manager: EntityManager = req.scope.resolve("manager") + const result = await manager.transaction(async (transactionManager) => { + return await optionService + .withTransaction(transactionManager) + .create(validated) + }) + const data = await optionService.retrieve(result.id, { select: defaultFields, relations: defaultRelations, diff --git a/packages/medusa/src/api/routes/admin/shipping-options/delete-shipping-option.ts b/packages/medusa/src/api/routes/admin/shipping-options/delete-shipping-option.ts index b382cc5f19..6b5c4ee724 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/delete-shipping-option.ts +++ b/packages/medusa/src/api/routes/admin/shipping-options/delete-shipping-option.ts @@ -1,3 +1,5 @@ +import { EntityManager } from "typeorm" + /** * @oas [delete] /shipping-options/{id} * operationId: "DeleteShippingOptionsOption" @@ -28,7 +30,12 @@ export default async (req, res) => { const { option_id } = req.params const optionService = req.scope.resolve("shippingOptionService") - await optionService.delete(option_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await optionService + .withTransaction(transactionManager) + .delete(option_id) + }) res.json({ id: option_id, diff --git a/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.ts b/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.ts index 287de85341..040a74f626 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.ts +++ b/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.ts @@ -10,6 +10,7 @@ import { } from "class-validator" import { defaultFields, defaultRelations } from "." import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /shipping-options/{id} @@ -69,7 +70,12 @@ export default async (req, res) => { const optionService = req.scope.resolve("shippingOptionService") - await optionService.update(option_id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await optionService + .withTransaction(transactionManager) + .update(option_id, validated) + }) const data = await optionService.retrieve(option_id, { select: defaultFields, diff --git a/packages/medusa/src/api/routes/admin/shipping-profiles/create-shipping-profile.ts b/packages/medusa/src/api/routes/admin/shipping-profiles/create-shipping-profile.ts index de7d1b774b..cd9778a584 100644 --- a/packages/medusa/src/api/routes/admin/shipping-profiles/create-shipping-profile.ts +++ b/packages/medusa/src/api/routes/admin/shipping-profiles/create-shipping-profile.ts @@ -1,6 +1,7 @@ import { IsString } from "class-validator" import { ShippingProfileService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /shipping-profiles @@ -36,7 +37,12 @@ export default async (req, res) => { const profileService: ShippingProfileService = req.scope.resolve( "shippingProfileService" ) - const data = await profileService.create(validated) + const manager: EntityManager = req.scope.resolve("manager") + const data = await manager.transaction(async (transactionManager) => { + return await profileService + .withTransaction(transactionManager) + .create(validated) + }) res.status(200).json({ shipping_profile: data }) } diff --git a/packages/medusa/src/api/routes/admin/shipping-profiles/delete-shipping-profile.ts b/packages/medusa/src/api/routes/admin/shipping-profiles/delete-shipping-profile.ts index 0c4928e406..ce38e7fa36 100644 --- a/packages/medusa/src/api/routes/admin/shipping-profiles/delete-shipping-profile.ts +++ b/packages/medusa/src/api/routes/admin/shipping-profiles/delete-shipping-profile.ts @@ -1,4 +1,5 @@ import { ShippingProfileService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /shipping-profiles/{id} @@ -32,7 +33,12 @@ export default async (req, res) => { "shippingProfileService" ) - await profileService.delete(profile_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await profileService + .withTransaction(transactionManager) + .delete(profile_id) + }) res.status(200).json({ id: profile_id, diff --git a/packages/medusa/src/api/routes/admin/shipping-profiles/update-shipping-profile.ts b/packages/medusa/src/api/routes/admin/shipping-profiles/update-shipping-profile.ts index 1470efedf4..2e6e4a932f 100644 --- a/packages/medusa/src/api/routes/admin/shipping-profiles/update-shipping-profile.ts +++ b/packages/medusa/src/api/routes/admin/shipping-profiles/update-shipping-profile.ts @@ -1,6 +1,7 @@ import { IsOptional, IsString } from "class-validator" import { ShippingProfileService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /shipping-profiles/{id} @@ -41,7 +42,12 @@ export default async (req, res) => { "shippingProfileService" ) - await profileService.update(profile_id, validated) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await profileService + .withTransaction(transactionManager) + .update(profile_id, validated) + }) const data = await profileService.retrieve(profile_id) res.status(200).json({ shipping_profile: data }) diff --git a/packages/medusa/src/api/routes/admin/store/add-currency.ts b/packages/medusa/src/api/routes/admin/store/add-currency.ts index 58be79f70d..babfb56a0d 100644 --- a/packages/medusa/src/api/routes/admin/store/add-currency.ts +++ b/packages/medusa/src/api/routes/admin/store/add-currency.ts @@ -1,4 +1,5 @@ import { StoreService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [post] /store/currencies/{code} * operationId: "PostStoreCurrenciesCode" @@ -23,6 +24,12 @@ export default async (req, res) => { const { currency_code } = req.params const storeService: StoreService = req.scope.resolve("storeService") - const data = await storeService.addCurrency(currency_code) + const manager: EntityManager = req.scope.resolve("manager") + const data = await manager.transaction(async (transactionManager) => { + return await storeService + .withTransaction(transactionManager) + .addCurrency(currency_code) + }) + res.status(200).json({ store: data }) } diff --git a/packages/medusa/src/api/routes/admin/store/remove-currency.ts b/packages/medusa/src/api/routes/admin/store/remove-currency.ts index 49dd6bc066..60593ad4db 100644 --- a/packages/medusa/src/api/routes/admin/store/remove-currency.ts +++ b/packages/medusa/src/api/routes/admin/store/remove-currency.ts @@ -1,4 +1,5 @@ import { StoreService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /store/currencies/{code} @@ -24,6 +25,12 @@ export default async (req, res) => { const { currency_code } = req.params const storeService: StoreService = req.scope.resolve("storeService") - const data = await storeService.removeCurrency(currency_code) + const manager: EntityManager = req.scope.resolve("manager") + const data = await manager.transaction(async (transactionManager) => { + return await storeService + .withTransaction(transactionManager) + .removeCurrency(currency_code) + }) + res.status(200).json({ store: data }) } diff --git a/packages/medusa/src/api/routes/admin/store/update-store.ts b/packages/medusa/src/api/routes/admin/store/update-store.ts index 9e8de32132..1f119ff8c7 100644 --- a/packages/medusa/src/api/routes/admin/store/update-store.ts +++ b/packages/medusa/src/api/routes/admin/store/update-store.ts @@ -1,6 +1,7 @@ import { IsArray, IsOptional, IsString, IsObject } from "class-validator" import { StoreService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /store @@ -45,7 +46,12 @@ export default async (req, res) => { const storeService: StoreService = req.scope.resolve("storeService") - const store = await storeService.update(validatedBody) + const manager: EntityManager = req.scope.resolve("manager") + const store = await manager.transaction(async (transactionManager) => { + return await storeService + .withTransaction(transactionManager) + .update(validatedBody) + }) res.status(200).json({ store }) } diff --git a/packages/medusa/src/api/routes/admin/tax-rates/add-to-product-types.ts b/packages/medusa/src/api/routes/admin/tax-rates/add-to-product-types.ts index d72844e40e..b85b565844 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/add-to-product-types.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/add-to-product-types.ts @@ -4,6 +4,7 @@ import { IsArray, IsOptional } from "class-validator" import { TaxRate } from "../../../.." import { TaxRateService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /tax-rates/:id/product-types/batch @@ -38,7 +39,12 @@ export default async (req, res) => { const rateService: TaxRateService = req.scope.resolve("taxRateService") - await rateService.addToProductType(req.params.id, value.product_types) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await rateService + .withTransaction(transactionManager) + .addToProductType(req.params.id, value.product_types) + }) const config = getRetrieveConfig( query.fields as (keyof TaxRate)[], diff --git a/packages/medusa/src/api/routes/admin/tax-rates/add-to-products.ts b/packages/medusa/src/api/routes/admin/tax-rates/add-to-products.ts index 2dfedb6235..bb535b066b 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/add-to-products.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/add-to-products.ts @@ -4,6 +4,7 @@ import { IsArray, IsOptional } from "class-validator" import { TaxRate } from "../../../.." import { TaxRateService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /tax-rates/:id/products/batch @@ -35,7 +36,12 @@ export default async (req, res) => { const rateService: TaxRateService = req.scope.resolve("taxRateService") - await rateService.addToProduct(req.params.id, value.products) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await rateService + .withTransaction(transactionManager) + .addToProduct(req.params.id, value.products) + }) const config = getRetrieveConfig( query.fields as (keyof TaxRate)[], diff --git a/packages/medusa/src/api/routes/admin/tax-rates/add-to-shipping-options.ts b/packages/medusa/src/api/routes/admin/tax-rates/add-to-shipping-options.ts index 985f9f143c..3f4d2370a0 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/add-to-shipping-options.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/add-to-shipping-options.ts @@ -4,6 +4,7 @@ import { IsArray, IsOptional } from "class-validator" import { TaxRate } from "../../../.." import { TaxRateService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /tax-rates/:id/shipping-options/batch @@ -37,7 +38,12 @@ export default async (req, res) => { ) const rateService: TaxRateService = req.scope.resolve("taxRateService") - await rateService.addToShippingOption(req.params.id, value.shipping_options) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await rateService + .withTransaction(transactionManager) + .addToShippingOption(req.params.id, value.shipping_options) + }) const config = getRetrieveConfig( query.fields as (keyof TaxRate)[], diff --git a/packages/medusa/src/api/routes/admin/tax-rates/delete-tax-rate.ts b/packages/medusa/src/api/routes/admin/tax-rates/delete-tax-rate.ts index 129c0f3614..8fc87e96b4 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/delete-tax-rate.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/delete-tax-rate.ts @@ -1,4 +1,5 @@ import { TaxRateService } from "../../../../services" +import { EntityManager } from "typeorm" /** * @oas [delete] /tax-rates/{id} @@ -30,7 +31,10 @@ export default async (req, res) => { const { id } = req.params const taxRateService: TaxRateService = req.scope.resolve("taxRateService") - await taxRateService.delete(id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await taxRateService.withTransaction(transactionManager).delete(id) + }) res.json({ id: id, diff --git a/packages/medusa/src/api/routes/admin/tax-rates/remove-from-product-types.ts b/packages/medusa/src/api/routes/admin/tax-rates/remove-from-product-types.ts index ffeb1e858d..32fa236b5c 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/remove-from-product-types.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/remove-from-product-types.ts @@ -4,6 +4,7 @@ import { IsArray, IsOptional } from "class-validator" import { TaxRate } from "../../../.." import { TaxRateService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [delete] /tax-rates/:id/product-types/batch @@ -38,7 +39,12 @@ export default async (req, res) => { const rateService: TaxRateService = req.scope.resolve("taxRateService") - await rateService.removeFromProductType(req.params.id, value.product_types) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await rateService + .withTransaction(transactionManager) + .removeFromProductType(req.params.id, value.product_types) + }) const config = getRetrieveConfig( query.fields as (keyof TaxRate)[], diff --git a/packages/medusa/src/api/routes/admin/tax-rates/remove-from-products.ts b/packages/medusa/src/api/routes/admin/tax-rates/remove-from-products.ts index 4727e93fbb..954cceda30 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/remove-from-products.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/remove-from-products.ts @@ -4,6 +4,7 @@ import { IsArray, IsOptional } from "class-validator" import { TaxRate } from "../../../.." import { TaxRateService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [delete] /tax-rates/:id/products/batch @@ -35,7 +36,12 @@ export default async (req, res) => { const rateService: TaxRateService = req.scope.resolve("taxRateService") - await rateService.removeFromProduct(req.params.id, value.products) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await rateService + .withTransaction(transactionManager) + .removeFromProduct(req.params.id, value.products) + }) const config = getRetrieveConfig( query.fields as (keyof TaxRate)[], diff --git a/packages/medusa/src/api/routes/admin/tax-rates/remove-from-shipping-options.ts b/packages/medusa/src/api/routes/admin/tax-rates/remove-from-shipping-options.ts index 1e2bd9b823..1ef6cd5d3b 100644 --- a/packages/medusa/src/api/routes/admin/tax-rates/remove-from-shipping-options.ts +++ b/packages/medusa/src/api/routes/admin/tax-rates/remove-from-shipping-options.ts @@ -4,6 +4,7 @@ import { IsArray, IsOptional } from "class-validator" import { TaxRate } from "../../../.." import { TaxRateService } from "../../../../services" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [delete] /tax-rates/:id/shipping-options/batch @@ -38,10 +39,12 @@ export default async (req, res) => { const rateService: TaxRateService = req.scope.resolve("taxRateService") - await rateService.removeFromShippingOption( - req.params.id, - value.shipping_options - ) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await rateService + .withTransaction(transactionManager) + .removeFromShippingOption(req.params.id, value.shipping_options) + }) const config = getRetrieveConfig( query.fields as (keyof TaxRate)[], diff --git a/packages/medusa/src/api/routes/admin/users/create-user.ts b/packages/medusa/src/api/routes/admin/users/create-user.ts index d50ad88bc6..3c1b8f3ca7 100644 --- a/packages/medusa/src/api/routes/admin/users/create-user.ts +++ b/packages/medusa/src/api/routes/admin/users/create-user.ts @@ -3,6 +3,7 @@ import _ from "lodash" import { UserRoles } from "../../../../models/user" import UserService from "../../../../services/user" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /users @@ -51,7 +52,12 @@ export default async (req, res) => { const userService: UserService = req.scope.resolve("userService") const data = _.omit(validated, ["password"]) - const user = await userService.create(data, validated.password) + const manager: EntityManager = req.scope.resolve("manager") + const user = await manager.transaction(async (transactionManager) => { + return await userService + .withTransaction(transactionManager) + .create(data, validated.password) + }) res.status(200).json({ user: _.omit(user, ["password_hash"]) }) } diff --git a/packages/medusa/src/api/routes/admin/users/delete-user.ts b/packages/medusa/src/api/routes/admin/users/delete-user.ts index 94e29add44..aa8c9f94c4 100644 --- a/packages/medusa/src/api/routes/admin/users/delete-user.ts +++ b/packages/medusa/src/api/routes/admin/users/delete-user.ts @@ -1,4 +1,5 @@ import UserService from "../../../../services/user" +import { EntityManager } from "typeorm" /** * @oas [delete] /users/{user_id} @@ -30,7 +31,10 @@ export default async (req, res) => { const { user_id } = req.params const userService: UserService = req.scope.resolve("userService") - await userService.delete(user_id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await userService.withTransaction(transactionManager).delete(user_id) + }) res.status(200).send({ id: user_id, diff --git a/packages/medusa/src/api/routes/admin/users/reset-password-token.ts b/packages/medusa/src/api/routes/admin/users/reset-password-token.ts index 6845d9ca41..108aa9dec1 100644 --- a/packages/medusa/src/api/routes/admin/users/reset-password-token.ts +++ b/packages/medusa/src/api/routes/admin/users/reset-password-token.ts @@ -1,6 +1,7 @@ import { IsEmail } from "class-validator" import UserService from "../../../../services/user" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /users/password-token @@ -31,7 +32,12 @@ export default async (req, res) => { const user = await userService.retrieveByEmail(validated.email) // Should call a email service provider that sends the token to the user - await userService.generateResetPasswordToken(user.id) + const manager: EntityManager = req.scope.resolve("manager") + await manager.transaction(async (transactionManager) => { + return await userService + .withTransaction(transactionManager) + .generateResetPasswordToken(user.id) + }) res.sendStatus(204) } diff --git a/packages/medusa/src/api/routes/admin/users/reset-password.ts b/packages/medusa/src/api/routes/admin/users/reset-password.ts index 94595acaff..df3c32238e 100644 --- a/packages/medusa/src/api/routes/admin/users/reset-password.ts +++ b/packages/medusa/src/api/routes/admin/users/reset-password.ts @@ -5,6 +5,7 @@ import { MedusaError } from "medusa-core-utils" import { User } from "../../../.." import UserService from "../../../../services/user" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /users/password-token @@ -71,10 +72,12 @@ export default async (req, res) => { return } - const userResult = await userService.setPassword_( - user.id, - validated.password - ) + const manager: EntityManager = req.scope.resolve("manager") + const userResult = await manager.transaction(async (transactionManager) => { + return await userService + .withTransaction(transactionManager) + .setPassword_(user.id, validated.password) + }) res.status(200).json({ user: _.omit(userResult, ["password_hash"]) }) } catch (error) { diff --git a/packages/medusa/src/api/routes/admin/users/update-user.ts b/packages/medusa/src/api/routes/admin/users/update-user.ts index 21bd9f96d5..91ff090ae6 100644 --- a/packages/medusa/src/api/routes/admin/users/update-user.ts +++ b/packages/medusa/src/api/routes/admin/users/update-user.ts @@ -2,6 +2,7 @@ import { IsEnum, IsObject, IsOptional, IsString } from "class-validator" import { UserRoles } from "../../../../models/user" import UserService from "../../../../services/user" import { validator } from "../../../../utils/validator" +import { EntityManager } from "typeorm" /** * @oas [post] /users/{user_id} @@ -33,7 +34,13 @@ export default async (req, res) => { const validated = await validator(AdminUpdateUserRequest, req.body) const userService: UserService = req.scope.resolve("userService") - const data = await userService.update(user_id, validated) + const manager: EntityManager = req.scope.resolve("manager") + const data = await manager.transaction(async (transactionManager) => { + return await userService + .withTransaction(transactionManager) + .update(user_id, validated) + }) + res.status(200).json({ user: data }) } diff --git a/packages/medusa/src/services/__mocks__/region.js b/packages/medusa/src/services/__mocks__/region.js index 8909e3ef06..fe0786db47 100644 --- a/packages/medusa/src/services/__mocks__/region.js +++ b/packages/medusa/src/services/__mocks__/region.js @@ -43,6 +43,9 @@ export const regions = { } export const RegionServiceMock = { + withTransaction: function () { + return this + }, retrieve: jest.fn().mockImplementation(regionId => { if (regionId === IdMap.getId("testRegion")) { return Promise.resolve(regions.testRegion) diff --git a/packages/medusa/src/services/__mocks__/shipping-option.js b/packages/medusa/src/services/__mocks__/shipping-option.js index 447f2e66c3..b866ec9782 100644 --- a/packages/medusa/src/services/__mocks__/shipping-option.js +++ b/packages/medusa/src/services/__mocks__/shipping-option.js @@ -67,6 +67,9 @@ export const shippingOptions = { } export const ShippingOptionServiceMock = { + withTransaction: function () { + return this + }, retrieve: jest.fn().mockImplementation((optionId) => { if (optionId === IdMap.getId("return-shipping")) { return Promise.resolve(shippingOptions.returnShipping)