Files
atlas-seller-kit/apps/web/src/services/productEditor.ts
T
2026-09-10 17:45:46 +08:00

118 lines
4.4 KiB
TypeScript

import type {
ProductAttributeDictionaryValue,
ProductAttributeSchema,
ProductEditorCategoryOption,
ProductEditorContext,
ProductEditorSnapshot,
Operation,
SaveProductEditorDraftRequest,
SaveProductEditorDraftResponse,
} from '@atlas/contracts';
import { api } from './api';
export const productEditorApi = {
enter: (collectionItemId: string, platformId: string) =>
api.post<ProductEditorContext>(
`/collection-items/${collectionItemId}/editor-contexts`,
undefined,
{
headers: {
'X-Atlas-Platform-Id': platformId,
'Idempotency-Key': crypto.randomUUID(),
},
}
),
read: (productId: string, platformId: string) =>
api.get<ProductEditorSnapshot>(`/products/${productId}/editor`, {
headers: { 'X-Atlas-Platform-Id': platformId },
}),
save: (
productId: string,
platformId: string,
revisions: { product: number; profile: number },
payload: SaveProductEditorDraftRequest
) =>
api.put<SaveProductEditorDraftResponse>(`/products/${productId}/editor-draft`, payload, {
headers: {
'X-Atlas-Platform-Id': platformId,
'Idempotency-Key': crypto.randomUUID(),
'If-Match': `"${revisions.product}:${revisions.profile}"`,
},
}),
categoryOptions: (profileId: string, platformId: string, search?: string) =>
api.get<ProductEditorCategoryOption[]>(
`/product-platform-profiles/${profileId}/category-options`,
{
params: search ? { q: search } : undefined,
headers: { 'X-Atlas-Platform-Id': platformId },
}
),
syncCategoryTree: (profileId: string, platformId: string) =>
api.post<{ operation: Operation }>(
`/product-platform-profiles/${profileId}/category-syncs`,
undefined,
{
headers: {
'X-Atlas-Platform-Id': platformId,
'Idempotency-Key': crypto.randomUUID(),
},
}
),
attributeSchema: (profileId: string, platformId: string, categoryId?: string | null) =>
api.get<ProductAttributeSchema[]>(
`/product-platform-profiles/${profileId}/attribute-schema`,
{
params: categoryId ? { category_id: categoryId } : undefined,
headers: { 'X-Atlas-Platform-Id': platformId },
}
),
syncAttributeSchema: (profileId: string, platformId: string, categoryId: string) =>
api.post<{ operation: Operation }>(
`/product-platform-profiles/${profileId}/attribute-schema-syncs`,
undefined,
{
params: { category_id: categoryId },
headers: {
'X-Atlas-Platform-Id': platformId,
'Idempotency-Key': crypto.randomUUID(),
},
}
),
attributeDictionary: (
profileId: string,
platformId: string,
dictionaryId: string,
search?: string,
categoryId?: string | null
) =>
api.get<{ items: ProductAttributeDictionaryValue[]; next_cursor: string | null }>(
`/product-platform-profiles/${profileId}/attribute-dictionaries/${encodeURIComponent(dictionaryId)}`,
{
params: {
...(categoryId ? { category_id: categoryId } : {}),
...(search ? { q: search } : {}),
},
headers: { 'X-Atlas-Platform-Id': platformId },
}
),
syncAttributeDictionary: (
profileId: string,
platformId: string,
dictionaryId: string,
categoryId: string,
query: string
) =>
api.post<{ operation: Operation }>(
`/product-platform-profiles/${profileId}/attribute-dictionaries/${encodeURIComponent(dictionaryId)}/syncs`,
undefined,
{
params: { category_id: categoryId, q: query },
headers: {
'X-Atlas-Platform-Id': platformId,
'Idempotency-Key': crypto.randomUUID(),
},
}
),
operation: (operationId: string) => api.get<Operation>(`/operations/${operationId}`),
};