컬렉션 만들기
직접 선택(`MANUAL`)은 `productIds`가 처음 담을 상품과 순서다. 조건 자동(`AUTOMATIC`)은 `rules`(AND)가 필수이고 조회할 때마다 조건을 만족하는 판매 중 상품을 계산한다. 유형은 만든 뒤 바꿀 수 없다. 주소(`slug`)를 생략하면 `c-{id 뒤 8자}`다. 주소가 겹치면 409 `COLLECTION_SLUG_TAKEN`, 상점당 200개를 넘으면 409 `COLLECTION_LIMIT_EXCEEDED`, 상점에 없는 상품은 400 `COLLECTION_PRODUCT_NOT_FOUND`, 상점에 없는 카테고리는 400 `COLLECTION_CATEGORY_NOT_FOUND`다. 조건 자동에 조건이 없으면 400 `COLLECTION_RULES_REQUIRED`, 상품을 주면 400 `COLLECTION_PRODUCTS_NOT_ALLOWED`, 정렬 `MANUAL`이면 400 `COLLECTION_SORT_INVALID`, 직접 선택에 조건을 주면 400 `COLLECTION_RULES_NOT_ALLOWED`다
직접 선택(MANUAL)은 productIds가 처음 담을 상품과 순서다. 조건 자동(AUTOMATIC)은 rules(AND)가 필수이고 조회할 때마다 조건을 만족하는 판매 중 상품을 계산한다. 유형은 만든 뒤 바꿀 수 없다. 주소(slug)를 생략하면 c-{id 뒤 8자}다. 주소가 겹치면 409 COLLECTION_SLUG_TAKEN, 상점당 200개를 넘으면 409 COLLECTION_LIMIT_EXCEEDED, 상점에 없는 상품은 400 COLLECTION_PRODUCT_NOT_FOUND, 상점에 없는 카테고리는 400 COLLECTION_CATEGORY_NOT_FOUND다. 조건 자동에 조건이 없으면 400 COLLECTION_RULES_REQUIRED, 상품을 주면 400 COLLECTION_PRODUCTS_NOT_ALLOWED, 정렬 MANUAL이면 400 COLLECTION_SORT_INVALID, 직접 선택에 조건을 주면 400 COLLECTION_RULES_NOT_ALLOWED다
accessTokenAuthorizationBearer <token>Sayren 계정 토큰(로그인 토큰 또는 개인 액세스 토큰, RFC 9068 JWT)
X-Store-Id*string대상 상점 id. 토큰의 상점 범위 밖이면 403 STORE_NOT_GRANTED, 없으면 400 STORE_ID_REQUIRED다
application/json- body
title*string제목
1 <= length <= 60slug?string주소. 영문 소문자·숫자·하이픈 64자까지, 상점 안에서 유일하다(겹치면 409 COLLECTION_SLUG_TAKEN)
^[a-z0-9][a-z0-9-]{0,63}$type?string유형. MANUAL(직접 선택)·AUTOMATIC(조건 자동). 만든 뒤 바꿀 수 없다
"MANUAL""MANUAL""AUTOMATIC"rules?array<||||>조건 자동 컬렉션의 조건(AND). 조건 자동이면 필수, 직접 선택이면 줄 수 없다
1 <= items <= 10description?string설명(텍스트)
length <= 500""imageUrl?|대표 이미지 주소. https만 받는다
urilength <= 2048productSort?string스토어프론트 상품 기본 정렬. 생략하면 직접 선택은 MANUAL, 조건 자동은 LATEST(판매량 상위 조건이 있으면 BEST_SELLING)다. 조건 자동은 MANUAL을 쓸 수 없다
"MANUAL""LATEST""BEST_SELLING""PRICE_ASC""PRICE_DESC""REVIEW_COUNT""RATING_DESC""RECOMMEND"visible?boolean노출 여부
truestartsAt?|노출 시작 시각(ISO 8601, 시간대 포함). null이면 바로 노출한다
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$date-timeendsAt?|노출 종료 시각(ISO 8601, 시간대 포함). null이면 끝나지 않는다
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$date-timesortOrder?integer목록 순서. 생략하면 맨 뒤
0 <= value <= 1000000metaTitle?|검색 결과 제목
length <= 60metaDescription?|검색 결과 설명
length <= 160productIds?array<>상품 id. 배열 순서가 직접 정한 순서다. 겹치는 id는 처음 것만 남긴다
items <= 1000성공
application/json- response
meta*data*error*|nullcurl -X POST 'https://api.sayren.io/v1/collections' \ -H 'X-Store-Id: string' \ -H 'Content-Type: application/json' \ -d '{ "title": "string"}'{ "meta": { "status": 201, "code": "OK", "message": "OK", "isSuccess": true }, "data": { "collectionId": "string", "type": "string", "title": "string", "slug": "string", "description": "string", "imageUrl": "string", "productSort": "string", "rules": [ { "field": "createdWithinDays", "value": 1 } ], "visible": true, "startsAt": "string", "endsAt": "string", "sortOrder": 0, "metaTitle": "string", "metaDescription": "string", "state": "ACTIVE", "salesComputedAt": null, "productCount": 0, "revision": 0, "createdAt": "string", "updatedAt": "string" }, "error": null}