import type { CustomerGroup, CustomerGroupChangeNameAction, CustomerGroupDraft, CustomerGroupSetCustomFieldAction, CustomerGroupSetCustomTypeAction, CustomerGroupSetKeyAction, CustomerGroupUpdateAction, } from "@commercetools/platform-sdk"; import type { Config } from "#src/config.ts"; import { CustomerGroupDraftSchema } from "#src/schemas/generated/customer-group.ts"; import { getBaseResourceProperties } from "../helpers.ts"; import type { Writable } from "../types.ts"; import type { UpdateHandlerInterface } from "./abstract.ts"; import { AbstractResourceRepository, AbstractUpdateHandler, type RepositoryContext, } from "./abstract.ts"; import { createCustomFields } from "./helpers.ts"; export class CustomerGroupRepository extends AbstractResourceRepository<"customer-group"> { constructor(config: Config) { super("customer-group", config); this.actions = new CustomerGroupUpdateHandler(config.storage); this.draftSchema = CustomerGroupDraftSchema; } async create( context: RepositoryContext, draft: CustomerGroupDraft, ): Promise { const resource: CustomerGroup = { ...getBaseResourceProperties(context.clientId), key: draft.key, name: draft.groupName, custom: await createCustomFields( draft.custom, context.projectKey, this._storage, ), }; return await this.saveNew(context, resource); } } class CustomerGroupUpdateHandler extends AbstractUpdateHandler implements UpdateHandlerInterface { changeName( context: RepositoryContext, resource: Writable, { name }: CustomerGroupChangeNameAction, ) { resource.name = name; } setCustomField( context: RepositoryContext, resource: Writable, { name, value }: CustomerGroupSetCustomFieldAction, ) { this._setCustomFieldValues(resource, { name, value }); } async setCustomType( context: RepositoryContext, resource: Writable, { type, fields }: CustomerGroupSetCustomTypeAction, ) { await this._setCustomType(context, resource, { type, fields }); } setKey( context: RepositoryContext, resource: Writable, { key }: CustomerGroupSetKeyAction, ) { resource.key = key; } }