diff --git a/integration-tests/api/__tests__/admin/__snapshots__/sales-channels.js.snap b/integration-tests/api/__tests__/admin/__snapshots__/sales-channels.js.snap index 2ea2d96eb4..d0b7eeee11 100644 --- a/integration-tests/api/__tests__/admin/__snapshots__/sales-channels.js.snap +++ b/integration-tests/api/__tests__/admin/__snapshots__/sales-channels.js.snap @@ -11,3 +11,15 @@ Object { "updated_at": Any, } `; + +exports[`sales channels POST /admin/sales-channels/:id updates sales channel properties 1`] = ` +Object { + "created_at": Any, + "deleted_at": null, + "description": "updated description", + "id": Any, + "is_disabled": true, + "name": "updated name", + "updated_at": Any, +} +`; diff --git a/integration-tests/api/__tests__/admin/sales-channels.js b/integration-tests/api/__tests__/admin/sales-channels.js index cc5729f567..a6d1cac161 100644 --- a/integration-tests/api/__tests__/admin/sales-channels.js +++ b/integration-tests/api/__tests__/admin/sales-channels.js @@ -4,7 +4,7 @@ const { useApi } = require("../../../helpers/use-api") const { useDb } = require("../../../helpers/use-db") const adminSeeder = require("../../helpers/admin-seeder") -const { simpleSalesChannelFactory, } = require("../../factories") +const { simpleSalesChannelFactory } = require("../../factories") const startServerWithEnvironment = require("../../../helpers/start-server-with-environment").default @@ -49,7 +49,7 @@ describe("sales channels", () => { describe("GET /admin/sales-channels/:id", () => { let salesChannel - beforeEach(async() => { + beforeEach(async () => { try { await adminSeeder(dbConnection) salesChannel = await simpleSalesChannelFactory(dbConnection, { @@ -61,12 +61,12 @@ describe("sales channels", () => { } }) - afterEach(async() => { + afterEach(async () => { const db = useDb() await db.teardown() }) - it("should retrieve the requested sales channel", async() => { + it("should retrieve the requested sales channel", async () => { const api = useApi() const response = await api.get( `/admin/sales-channels/${salesChannel.id}`, @@ -85,6 +85,56 @@ describe("sales channels", () => { }) }) - describe("POST /admin/sales-channels/:id", () => {}) + describe("POST /admin/sales-channels/:id", () => { + let sc + + beforeEach(async () => { + try { + await adminSeeder(dbConnection) + sc = await simpleSalesChannelFactory(dbConnection, { + name: "test name", + description: "test description", + }) + } catch (err) { + console.log(err) + } + }) + + afterEach(async () => { + const db = useDb() + await db.teardown() + }) + + it("updates sales channel properties", async () => { + const api = useApi() + + const payload = { + name: "updated name", + description: "updated description", + is_disabled: true, + } + + const response = await api.post( + `/admin/sales-channels/${sc.id}`, + payload, + { + headers: { + authorization: "Bearer test_token", + }, + } + ) + + expect(response.status).toEqual(200) + expect(response.data.sales_channel).toMatchSnapshot({ + id: expect.any(String), + name: payload.name, + description: payload.description, + is_disabled: payload.is_disabled, + created_at: expect.any(String), + updated_at: expect.any(String), + }) + }) + }) + describe("DELETE /admin/sales-channels/:id", () => {}) }) diff --git a/integration-tests/api/factories/simple-sales-channel-factory.ts b/integration-tests/api/factories/simple-sales-channel-factory.ts index 38115b47b2..52c259503a 100644 --- a/integration-tests/api/factories/simple-sales-channel-factory.ts +++ b/integration-tests/api/factories/simple-sales-channel-factory.ts @@ -28,4 +28,4 @@ export const simpleSalesChannelFactory = async ( }) return await manager.save(salesChannel) -} \ No newline at end of file +} diff --git a/packages/medusa-js/src/resources/admin/sales-channels.ts b/packages/medusa-js/src/resources/admin/sales-channels.ts index 87b782ecd7..4b8457e37c 100644 --- a/packages/medusa-js/src/resources/admin/sales-channels.ts +++ b/packages/medusa-js/src/resources/admin/sales-channels.ts @@ -1,5 +1,6 @@ import { - AdminSalesChannelRes, + AdminSalesChannelsRes, + AdminPostSalesChannelsSalesChannelReq, } from "@medusajs/medusa" import { ResponsePromise } from "../../typings" import BaseResource from "../base" @@ -12,29 +13,35 @@ class AdminSalesChannelsResource extends BaseResource { retrieve( salesChannelId: string, customHeaders: Record = {} - ): ResponsePromise { + ): ResponsePromise { const path = `/admin/sales-channels/${salesChannelId}` return this.client.request("GET", path, {}, {}, customHeaders) } - /*create( + /* create( payload: any, customHeaders: Record = {} ): ResponsePromise {}*/ - /*update( - id: string, - payload: any, + /** @description updates a sales channel + * @returns the updated medusa sales channel + */ + update( + salesChannelId: string, + payload: AdminPostSalesChannelsSalesChannelReq, customHeaders: Record = {} - ): ResponsePromise {}*/ + ): ResponsePromise { + const path = `/admin/sales-channels/${salesChannelId}` + return this.client.request("POST", path, payload, {}, customHeaders) + } - /*delete( + /* delete( id: string, customHeaders: Record = {} ): ResponsePromise { }*/ - /*list( + /* list( query?: any, customHeaders: Record = {} ): ResponsePromise { diff --git a/packages/medusa-react/mocks/handlers/admin.ts b/packages/medusa-react/mocks/handlers/admin.ts index 1fcc3644f9..4ae9140ff3 100644 --- a/packages/medusa-react/mocks/handlers/admin.ts +++ b/packages/medusa-react/mocks/handlers/admin.ts @@ -1681,4 +1681,16 @@ export const adminHandlers = [ }) ) }), + + rest.post("/admin/sales-channels/:id", (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + sales_channel: { + ...fixtures.get("sales_channel"), + ...(req.body as any), + }, + }) + ) + }) ] diff --git a/packages/medusa-react/src/hooks/admin/sales-channels/mutations.ts b/packages/medusa-react/src/hooks/admin/sales-channels/mutations.ts index e6c1b200ee..47a8353e9d 100644 --- a/packages/medusa-react/src/hooks/admin/sales-channels/mutations.ts +++ b/packages/medusa-react/src/hooks/admin/sales-channels/mutations.ts @@ -1,4 +1,34 @@ -export {} +import { useMutation, UseMutationOptions, useQueryClient } from "react-query" +import { + AdminSalesChannelsRes, + AdminPostSalesChannelsSalesChannelReq, +} from "@medusajs/medusa" +import { Response } from "@medusajs/medusa-js" +import { useMedusa } from "../../../contexts" +import { buildOptions } from "../../utils/buildOptions" +import { adminSalesChannelsKeys } from "./queries" + +export const useAdminUpdateSalesChannel = ( + id: string, + options?: UseMutationOptions< + Response, + Error, + AdminPostSalesChannelsSalesChannelReq + > +) => { + const { client } = useMedusa() + const queryClient = useQueryClient() + return useMutation( + (payload: AdminPostSalesChannelsSalesChannelReq) => + client.admin.salesChannels.update(id, payload), + buildOptions( + queryClient, + [adminSalesChannelsKeys.lists(), adminSalesChannelsKeys.detail(id)], + options + ) + ) +} + /*export const useAdminCreateSalesChannel = ( options?: UseMutationOptions< Response, @@ -14,28 +44,6 @@ export {} ) }*/ -/*export const useAdminUpdateSalesChannel = ( - id: string, - options?: UseMutationOptions< - Response, - Error, - AdminPostSalesChannelsSalesChannelReq - > -) => { - const { client } = useMedusa() - const queryClient = useQueryClient() - - return useMutation( - (payload: AdminPostSalesChannelsSalesChannelReq) => - client.admin.salesChannels.update(id, payload), - buildOptions( - queryClient, - [adminSalesChannelsKeys.lists(), adminSalesChannelsKeys.detail(id)], - options - ) - ) -}*/ - /*export const useAdminDeleteSalesChannel = ( id: string, options?: UseMutationOptions, Error, void> diff --git a/packages/medusa-react/src/hooks/admin/sales-channels/queries.ts b/packages/medusa-react/src/hooks/admin/sales-channels/queries.ts index de1d65b0e9..e909a88bd1 100644 --- a/packages/medusa-react/src/hooks/admin/sales-channels/queries.ts +++ b/packages/medusa-react/src/hooks/admin/sales-channels/queries.ts @@ -1,6 +1,4 @@ -import { - AdminSalesChannelRes -} from "@medusajs/medusa" +import { AdminSalesChannelsRes } from "@medusajs/medusa" import { Response } from "@medusajs/medusa-js" import { useQuery } from "react-query" import { useMedusa } from "../../../contexts" @@ -9,14 +7,16 @@ import { queryKeysFactory } from "../../utils" const ADMIN_SALES_CHANNELS_QUERY_KEY = `admin_sales_channels` as const -export const adminSalesChannelsKeys = queryKeysFactory(ADMIN_SALES_CHANNELS_QUERY_KEY) +export const adminSalesChannelsKeys = queryKeysFactory( + ADMIN_SALES_CHANNELS_QUERY_KEY +) type SalesChannelsQueryKeys = typeof adminSalesChannelsKeys export const useAdminSalesChannel = ( id: string, options?: UseQueryOptionsWrapper< - Response, + Response, Error, ReturnType > @@ -48,4 +48,3 @@ export const useAdminSalesChannels = ( return { ...data, ...rest } as const } */ - diff --git a/packages/medusa-react/test/hooks/admin/sales-channels/mutations.test.ts b/packages/medusa-react/test/hooks/admin/sales-channels/mutations.test.ts new file mode 100644 index 0000000000..b5f5a13393 --- /dev/null +++ b/packages/medusa-react/test/hooks/admin/sales-channels/mutations.test.ts @@ -0,0 +1,33 @@ +import { useAdminUpdateSalesChannel } from "../../../../src" +import { renderHook } from "@testing-library/react-hooks" +import { fixtures } from "../../../../mocks/data" +import { createWrapper } from "../../../utils" + +describe("useAdminUpdateStore hook", () => { + test("updates a store", async () => { + const salesChannel = { + name: "medusa sales channel", + description: "main sales channel for medusa", + is_disabled: true, + } + + const salesChannelId = fixtures.get("sales_channel").id + + const { result, waitFor } = renderHook( + () => useAdminUpdateSalesChannel(salesChannelId), + { + wrapper: createWrapper(), + } + ) + + result.current.mutate(salesChannel) + + await waitFor(() => result.current.isSuccess) + + expect(result.current.data.response.status).toEqual(200) + expect(result.current.data.sales_channel).toEqual({ + ...fixtures.get("sales_channel"), + ...salesChannel, + }) + }) +}) diff --git a/packages/medusa-react/test/hooks/admin/sales-channels/queries.test.ts b/packages/medusa-react/test/hooks/admin/sales-channels/queries.test.ts index c865a80fd4..c4b9bbf038 100644 --- a/packages/medusa-react/test/hooks/admin/sales-channels/queries.test.ts +++ b/packages/medusa-react/test/hooks/admin/sales-channels/queries.test.ts @@ -1,6 +1,4 @@ -import { - useAdminSalesChannel, -} from "../../../../src" +import { useAdminSalesChannel } from "../../../../src" import { renderHook } from "@testing-library/react-hooks" import { fixtures } from "../../../../mocks/data" import { createWrapper } from "../../../utils" diff --git a/packages/medusa/src/api/routes/admin/index.js b/packages/medusa/src/api/routes/admin/index.js index c6005c9af7..3bb2aafd8e 100644 --- a/packages/medusa/src/api/routes/admin/index.js +++ b/packages/medusa/src/api/routes/admin/index.js @@ -20,8 +20,8 @@ import productTypesRoutes from "./product-types" import productRoutes from "./products" import regionRoutes from "./regions" import returnReasonRoutes from "./return-reasons" -import salesChannelRoutes from "./sales-channels" import returnRoutes from "./returns" +import salesChannelRoutes from "./sales-channels" import shippingOptionRoutes from "./shipping-options" import shippingProfileRoutes from "./shipping-profiles" import storeRoutes from "./store" diff --git a/packages/medusa/src/api/routes/admin/sales-channels/__tests__/update-sales-channel.js b/packages/medusa/src/api/routes/admin/sales-channels/__tests__/update-sales-channel.js new file mode 100644 index 0000000000..2125f8e5ba --- /dev/null +++ b/packages/medusa/src/api/routes/admin/sales-channels/__tests__/update-sales-channel.js @@ -0,0 +1,48 @@ +import { IdMap } from "medusa-test-utils" +import { request } from "../../../../../helpers/test-request" +import { SalesChannelServiceMock } from "../../../../../services/__mocks__/sales-channel" + +describe("POST /admin/regions/:region_id/countries", () => { + describe("successful creation", () => { + let subject + + beforeAll(async () => { + const id = IdMap.getId("test_sales_channel") + subject = await request("POST", `/admin/sales-channels/${id}`, { + payload: { + name: "amazon", + description: "This is our amazon sales channel", + }, + adminSession: { + jwt: { + userId: IdMap.getId("admin_user"), + }, + }, + flags: ["sales_channels"], + }) + }) + + it("returns 200", () => { + expect(subject.status).toEqual(200) + }) + + it("returns updated sales channel", () => { + expect(subject.body.sales_channel).toEqual({ + id: IdMap.getId("test_sales_channel"), + name: "amazon", + description: "This is our amazon sales channel", + }) + }) + + it("calls service update", () => { + expect(SalesChannelServiceMock.update).toHaveBeenCalledTimes(1) + expect(SalesChannelServiceMock.update).toHaveBeenCalledWith( + IdMap.getId("test_sales_channel"), + { + name: "amazon", + description: "This is our amazon sales channel", + } + ) + }) + }) +}) diff --git a/packages/medusa/src/api/routes/admin/sales-channels/get-sales-channel.ts b/packages/medusa/src/api/routes/admin/sales-channels/get-sales-channel.ts index ad27feed5a..3484e5b8f1 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/get-sales-channel.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/get-sales-channel.ts @@ -10,7 +10,7 @@ import SalesChannelService from "../../../../services/sales-channel" * parameters: * - (path) id=* {string} The id of the Sales channel. * tags: - * - Sales channel + * - Sales Channel * responses: * 200: * description: OK diff --git a/packages/medusa/src/api/routes/admin/sales-channels/index.ts b/packages/medusa/src/api/routes/admin/sales-channels/index.ts index e7c2af1c41..67a1831a53 100644 --- a/packages/medusa/src/api/routes/admin/sales-channels/index.ts +++ b/packages/medusa/src/api/routes/admin/sales-channels/index.ts @@ -3,7 +3,8 @@ import { DeleteResponse, PaginatedResponse } from "../../../../types/common" import "reflect-metadata" import { isFeatureFlagEnabled } from "../../../middlewares/feature-flag-enabled" import { SalesChannel } from "../../../../models" -import middlewares from "../../../middlewares" +import middlewares, { transformBody } from "../../../middlewares" +import { AdminPostSalesChannelsSalesChannelReq } from "./update-sales-channel" const route = Router() @@ -22,14 +23,18 @@ export default (app) => { route.post("/", (req, res) => {}) - route.post("/:id", (req, res) => {}) + route.post( + "/:id", + transformBody(AdminPostSalesChannelsSalesChannelReq), + middlewares.wrap(require("./update-sales-channel").default) + ) route.delete("/:id", (req, res) => {}) return app } -export type AdminSalesChannelRes = { +export type AdminSalesChannelsRes = { sales_channel: SalesChannel } @@ -42,5 +47,5 @@ export type AdminSalesChannelListRes = PaginatedResponse & { export * from "./get-sales-channel" // export * from './' // export * from './' -// export * from './' +export * from "./update-sales-channel" // export * from './' 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 new file mode 100644 index 0000000000..ee9d4445d5 --- /dev/null +++ b/packages/medusa/src/api/routes/admin/sales-channels/update-sales-channel.ts @@ -0,0 +1,64 @@ +import { IsBoolean, IsOptional, IsString } from "class-validator" +import { Request, Response } from "express" +import { SalesChannelService } from "../../../../services" + +/** + * @oas [post] /sales-channels/{id} + * operationId: "PostSalesChannelsSalesChannel" + * summary: "Update a Sales Channel" + * description: "Updates a Sales Channel." + * x-authenticated: true + * parameters: + * - (path) id=* {string} The id of the Sales Channel. + * requestBody: + * content: + * application/json: + * schema: + * properties: + * name: + * type: string + * description: Name of the sales channel. + * description: + * type: string + * description: Sales Channel description. + * is_disabled: + * type: boolean + * description: Indication of if the sales channel is active. + * tags: + * - Sales Channel + * responses: + * 200: + * description: OK + * content: + * application/json: + * schema: + * properties: + * customer: + * $ref: "#/components/schemas/sales-channel" + */ +export default async (req: Request, res: Response) => { + const { id } = req.params + const { validatedBody } = req as { + validatedBody: AdminPostSalesChannelsSalesChannelReq + } + + const salesChannelService: SalesChannelService = req.scope.resolve( + "salesChannelService" + ) + const sales_channel = await salesChannelService.update(id, validatedBody) + res.status(200).json({ sales_channel }) +} + +export class AdminPostSalesChannelsSalesChannelReq { + @IsOptional() + @IsString() + name?: string + + @IsOptional() + @IsString() + description?: string + + @IsBoolean() + @IsOptional() + is_disabled?: boolean +} diff --git a/packages/medusa/src/models/sales-channel.ts b/packages/medusa/src/models/sales-channel.ts index 653ca57386..a4d43103f0 100644 --- a/packages/medusa/src/models/sales-channel.ts +++ b/packages/medusa/src/models/sales-channel.ts @@ -16,9 +16,6 @@ export class SalesChannel extends SoftDeletableEntity { @Column({ default: false }) is_disabled: boolean - // @Column({ type: resolveDbType("timestamptz"), nullable: true }) - // disabled_at: Date | null - @BeforeInsert() private beforeInsert(): void { this.id = generateEntityId(this.id, "sc") diff --git a/packages/medusa/src/services/__mocks__/sales-channel.js b/packages/medusa/src/services/__mocks__/sales-channel.js index 46854780cc..f62d45d5a7 100644 --- a/packages/medusa/src/services/__mocks__/sales-channel.js +++ b/packages/medusa/src/services/__mocks__/sales-channel.js @@ -11,6 +11,15 @@ export const SalesChannelServiceMock = { is_disabled: false, }) }), + update: jest.fn().mockImplementation((id, data) => { + return Promise.resolve({ id, ...data }) + }), + + listAndCount: jest.fn().mockImplementation(() => {}), + + create: jest.fn().mockImplementation(() => {}), + + delete: jest.fn().mockImplementation(() => {}), } const mock = jest.fn().mockImplementation(() => { diff --git a/packages/medusa/src/services/__tests__/sales-channel.ts b/packages/medusa/src/services/__tests__/sales-channel.ts index 26c7ec6e16..31db68dadf 100644 --- a/packages/medusa/src/services/__tests__/sales-channel.ts +++ b/packages/medusa/src/services/__tests__/sales-channel.ts @@ -5,53 +5,91 @@ import { EventBusService } from "../index" import { FindConditions, FindOneOptions } from "typeorm" import { SalesChannel } from "../../models" -describe('SalesChannelService', () => { +describe("SalesChannelService", () => { + const salesChannelData = { + name: "sales channel 1 name", + description: "sales channel 1 description", + is_disabled: false, + } + + const salesChannelRepositoryMock = MockRepository({ + findOne: jest + .fn() + .mockImplementation( + (queryOrId: string | FindOneOptions): any => { + return Promise.resolve({ + id: + typeof queryOrId === "string" + ? queryOrId + : (queryOrId?.where as FindConditions)?.id ?? + IdMap.getId("sc_adjhlukiaeswhfae"), + ...salesChannelData, + }) + } + ), + save: (salesChannel) => Promise.resolve(salesChannel), + }) + describe("retrieve", () => { - const salesChannelData = { - name: "sales channel 1 name", - description: "sales channel 1 description", - is_disabled: false, - } - - const salesChannelRepositoryMock = MockRepository({ - findOne: jest.fn().mockImplementation((queryOrId: string | FindOneOptions): any => { - return Promise.resolve({ - id: - typeof queryOrId === "string" - ? queryOrId - : ((queryOrId?.where as FindConditions)?.id ?? IdMap.getId("sc_adjhlukiaeswhfae")), - ...salesChannelData - }) - }), - }) - const salesChannelService = new SalesChannelService({ manager: MockManager, eventBusService: EventBusServiceMock as unknown as EventBusService, - salesChannelRepository: salesChannelRepositoryMock + salesChannelRepository: salesChannelRepositoryMock, }) afterEach(() => { jest.clearAllMocks() }) - it('should retrieve a sales channel', async () => { + it("should retrieve a sales channel", async () => { const salesChannel = await salesChannelService.retrieve( IdMap.getId("sales_channel_1") ) expect(salesChannel).toBeTruthy() expect(salesChannel).toEqual({ - id: IdMap.getId("sales_channel_1"), - ...salesChannelData + id: IdMap.getId("sales_channel_1"), + ...salesChannelData, }) - expect(salesChannelRepositoryMock.findOne) - .toHaveBeenCalledTimes(1) - expect(salesChannelRepositoryMock.findOne) - .toHaveBeenLastCalledWith( - { where: { id: IdMap.getId("sales_channel_1") } }, - ) + expect(salesChannelRepositoryMock.findOne).toHaveBeenCalledTimes(1) + expect(salesChannelRepositoryMock.findOne).toHaveBeenLastCalledWith({ + where: { id: IdMap.getId("sales_channel_1") }, + }) + }) + }) + + describe("update", () => { + const salesChannelService = new SalesChannelService({ + manager: MockManager, + eventBusService: EventBusServiceMock as unknown as EventBusService, + salesChannelRepository: salesChannelRepositoryMock, + }) + + const update = { + name: "updated name", + description: "updated description", + is_disabled: true, + } + + beforeAll(async () => { + jest.clearAllMocks() + }) + + it("calls save with the updated sales channel", async () => { + await salesChannelService.update(IdMap.getId("sc"), update) + expect(salesChannelRepositoryMock.save).toHaveBeenCalledWith({ + id: IdMap.getId("sc"), + ...update, + }) + }) + + it("returns the saved sales channel", async () => { + const res = await salesChannelService.update(IdMap.getId("sc"), update) + expect(res).toEqual({ + id: IdMap.getId("sc"), + ...update, + }) }) }) }) diff --git a/packages/medusa/src/services/index.ts b/packages/medusa/src/services/index.ts index 03e68e8334..c6feace3ec 100644 --- a/packages/medusa/src/services/index.ts +++ b/packages/medusa/src/services/index.ts @@ -30,6 +30,7 @@ export { default as QueryBuilderService } from "./query-builder" export { default as RegionService } from "./region" export { default as ReturnReasonService } from "./return-reason" export { default as ReturnService } from "./return" +export { default as SalesChannelService } from "./sales-channel" export { default as SearchService } from "./search" export { default as ShippingOptionService } from "./shipping-option" export { default as ShippingProfileService } from "./shipping-profile" diff --git a/packages/medusa/src/services/sales-channel.ts b/packages/medusa/src/services/sales-channel.ts index 952a41df70..2e1a22923f 100644 --- a/packages/medusa/src/services/sales-channel.ts +++ b/packages/medusa/src/services/sales-channel.ts @@ -1,4 +1,5 @@ import { EntityManager } from "typeorm" +import { MedusaError } from "medusa-core-utils" import { TransactionBaseService } from "../interfaces" import { SalesChannel } from "../models" import { SalesChannelRepository } from "../repositories/sales-channel" @@ -9,7 +10,6 @@ import { } from "../types/sales-channels" import EventBusService from "./event-bus" import { buildQuery } from "../utils" -import { MedusaError } from "medusa-core-utils" type InjectedDependencies = { salesChannelRepository: typeof SalesChannelRepository @@ -18,6 +18,10 @@ type InjectedDependencies = { } class SalesChannelService extends TransactionBaseService { + static Events = { + UPDATED: "sales_channel.updated", + } + protected manager_: EntityManager protected transactionManager_: EntityManager | undefined @@ -78,10 +82,31 @@ class SalesChannelService extends TransactionBaseService { } async update( - id: string, + salesChannelId: string, data: UpdateSalesChannelInput - ): Promise { - throw new Error("Method not implemented.") + ): Promise { + return await this.atomicPhase_(async (transactionManager) => { + const salesChannelRepo: SalesChannelRepository = + transactionManager.getCustomRepository(this.salesChannelRepository_) + + const salesChannel = await this.retrieve(salesChannelId) + + for (const key of Object.keys(data)) { + if (typeof data[key] !== `undefined`) { + salesChannel[key] = data[key] + } + } + + const result = await salesChannelRepo.save(salesChannel) + + await this.eventBusService_ + .withTransaction(transactionManager) + .emit(SalesChannelService.Events.UPDATED, { + id: result.id, + }) + + return result + }) } async delete(id: string): Promise {