import type { CartDiscountReference, DiscountCode, DiscountCodeDraft, } from "@commercetools/platform-sdk"; import type { Config } from "#src/config.ts"; import { getBaseResourceProperties } from "#src/helpers.ts"; import { DiscountCodeDraftSchema } from "#src/schemas/generated/discount-code.ts"; import { AbstractResourceRepository, type RepositoryContext, } from "../abstract.ts"; import { createCustomFields } from "../helpers.ts"; import { DiscountCodeUpdateHandler } from "./actions.ts"; export class DiscountCodeRepository extends AbstractResourceRepository<"discount-code"> { constructor(config: Config) { super("discount-code", config); this.actions = new DiscountCodeUpdateHandler(config.storage); this.draftSchema = DiscountCodeDraftSchema; } async create( context: RepositoryContext, draft: DiscountCodeDraft, ): Promise { const resource: DiscountCode = { ...getBaseResourceProperties(context.clientId), applicationVersion: 1, cartDiscounts: draft.cartDiscounts.map( (obj): CartDiscountReference => ({ typeId: "cart-discount", id: obj.id!, }), ), cartPredicate: draft.cartPredicate, code: draft.code, description: draft.description, groups: draft.groups || [], isActive: draft.isActive || true, name: draft.name, references: [], stores: [], validFrom: draft.validFrom, validUntil: draft.validUntil, maxApplications: draft.maxApplications, maxApplicationsPerCustomer: draft.maxApplicationsPerCustomer, custom: await createCustomFields( draft.custom, context.projectKey, this._storage, ), }; return await this.saveNew(context, resource); } }