Saleor Metadata 쿼리와 필터

Mutation (4종)

updateMetadata(id: ID!, input: [MetadataInput!]!)       # 공개 metadata 설정
updatePrivateMetadata(id: ID!, input: [MetadataInput!]!) # 비공개 metadata 설정
deleteMetadata(id: ID!, keys: [String!]!)                # 공개 키 삭제
deletePrivateMetadata(id: ID!, keys: [String!]!)         # 비공개 키 삭제

MetadataInputvalueString 타입이다. JSON 객체 저장 시 JSON.stringify한 문자열로 넣어야 한다.

필터링

두 가지 방식이 공존한다.

# 방식 1: filter (기존)
products(filter: { metadata: [{ key: "color", value: "red" }] })
 
# 방식 2: where (3.14+, 더 강력)
products(where: { metadata: { key: "color", value: { eq: "red" } } })
# one_of 연산자도 지원: value: { one_of: ["red", "blue"] }

내부 구현은 PostgreSQL @> (jsonb contains)와 ? (key exists) 연산자. GIN 인덱스 활용.

권한 규칙

  • metadata (공개): 해당 리소스 read 권한. Checkout/CheckoutLine은 권한 불필요 (익명 접근 가능)
  • privateMetadata: 항상 관리 권한 필요
  • App은 MANAGE_STAFF 필요한 metadata 뮤테이션 불가 (하드코딩 제한)
  • private_metadata필터링 불가 — 공개 metadata만 필터 지원

관련: Saleor Metadata 지원 모델, Saleor Extension Surface 개요