#Cannot update cart metadata using native medusa methods like updateCart

5 messages · Page 1 of 1 (latest)

safe bluff
#
  1. create register-extended-validator.ts in utils, with following code.
import { ValidatorOptions } from 'class-validator'
import { ClassConstructor } from '@medusajs/medusa'

const extendedValidators: any = []
let isInitialized = false

export async function registerExtendedValidator<
  T extends ClassConstructor<any>,
>(classValidator: T): Promise<void> {
  extendedValidators.push(classValidator)

  if (isInitialized) {
    return
  }

  isInitialized = true

  const module = await import('@medusajs/medusa/dist/utils/validator')
  const originalValidator = module.validator
  module.validator = <T extends ClassConstructor<any> = any, V = any>(
    typedClass: T,
    plain: V,
    config?: ValidatorOptions,
  ): Promise<any> => {
    for (const extendedValidator of extendedValidators) {
      if (extendedValidator.name === typedClass.name) {
        typedClass = extendedValidator
        break
      }
    }
    return originalValidator(typedClass, plain, config)
  }
}

2 create cart.dto.ts in loaders with this code

import {
  StorePostCartsCartReq as MedusaStorePostCartsCartReq,
} from '@medusajs/medusa/dist/api/routes/store/carts/update-cart'

export class StorePostCartsCartReq extends MedusaStorePostCartsCartReq {
  @IsOptional()
  @IsString()
  metadata: string
}
  1. create index.ts in loaders and import dto
import { registerExtendedValidator } from '../utils/register-extended-validator'
import { StorePostCartsCartReq } from './cart.dto'

export default async function() {
  await registerExtendedValidator(StorePostCartsCartReq)
}
brave tangle
#

@safe bluff this acctually helped me! Is this in the docs? Its very unintuitive for new dev in this stack. Ill just fill missing info of IsOptional is imported from.

import {
  StorePostCartsCartReq as MedusaStorePostCartsCartReq,
} from '@medusajs/medusa/dist/api/routes/store/carts/update-cart'

export class StorePostCartsCartReq extends MedusaStorePostCartsCartReq {
  @IsOptional()
  metadata: {}
} ```

The utils folder can be in src. Visible in index.ts example
rigid gull
#

this actually helps me as well, and I have the problem when setting metadata like this
{ "0": "{", "1": "\"", "2": "c", "3": "a", "4": "r", "5": "t", "6": "_", "7": "t", "8": "y", "9": "p", "10": "e", "11": "\"", "12": ":", "13": "\"", "14": "d", "15": "e", "16": "f", "17": "a", "18": "u", "19": "l", "20": "t", "21": "\"", "22": "}" }

why metadata is not an Object? please anyone helps

rigid gull
brave tangle
#

@rigid gull I used it like this. Seems like you are doing some object spreading - ...metadata