import type { AssociateRole, AssociateRoleAddPermissionAction, AssociateRoleChangeBuyerAssignableAction, AssociateRoleDraft, AssociateRoleRemovePermissionAction, AssociateRoleSetCustomFieldAction, AssociateRoleSetCustomTypeAction, AssociateRoleSetNameAction, AssociateRoleSetPermissionsAction, AssociateRoleUpdateAction, } from "@commercetools/platform-sdk"; import type { Config } from "#src/config.ts"; import { AssociateRoleDraftSchema } from "#src/schemas/generated/associate-role.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 AssociateRoleRepository extends AbstractResourceRepository<"associate-role"> { constructor(config: Config) { super("associate-role", config); this.actions = new AssociateRoleUpdateHandler(this._storage); this.draftSchema = AssociateRoleDraftSchema; } async create( context: RepositoryContext, draft: AssociateRoleDraft, ): Promise { const resource: AssociateRole = { ...getBaseResourceProperties(context.clientId), key: draft.key, name: draft.name, buyerAssignable: draft.buyerAssignable || false, permissions: draft.permissions || [], custom: await createCustomFields( draft.custom, context.projectKey, this._storage, ), }; return await this.saveNew(context, resource); } } class AssociateRoleUpdateHandler extends AbstractUpdateHandler implements Partial> { addPermission( context: RepositoryContext, resource: Writable, { permission }: AssociateRoleAddPermissionAction, ) { if (!resource.permissions) { resource.permissions = [permission]; } else { resource.permissions.push(permission); } } changeBuyerAssignable( context: RepositoryContext, resource: Writable, { buyerAssignable }: AssociateRoleChangeBuyerAssignableAction, ) { resource.buyerAssignable = buyerAssignable; } removePermission( context: RepositoryContext, resource: Writable, { permission }: AssociateRoleRemovePermissionAction, ) { if (!resource.permissions) { return; } resource.permissions = resource.permissions.filter((p) => p !== permission); } setBuyerAssignable( context: RepositoryContext, resource: Writable, { buyerAssignable }: AssociateRoleChangeBuyerAssignableAction, ) { resource.buyerAssignable = buyerAssignable; } setCustomFields( context: RepositoryContext, resource: Writable, { name, value }: AssociateRoleSetCustomFieldAction, ) { this._setCustomFieldValues(resource, { name, value }); } async setCustomType( context: RepositoryContext, resource: Writable, { type, fields }: AssociateRoleSetCustomTypeAction, ) { await this._setCustomType(context, resource, { type, fields }); } setName( context: RepositoryContext, resource: Writable, { name }: AssociateRoleSetNameAction, ) { resource.name = name; } setPermissions( context: RepositoryContext, resource: Writable, { permissions }: AssociateRoleSetPermissionsAction, ) { resource.permissions = permissions || []; } }