UNPKG

wb-api-client

Version:

Typescript API для Wildberries, сгенерированное из Swagger. Без внешних зависимостей.

459 lines (429 loc) 21.1 kB
/* eslint-disable */ /* tslint:disable */ /* * --------------------------------------------------------------- * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## * ## ## * ## AUTHOR: acacode ## * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## * --------------------------------------------------------------- */ export type QueryParamsType = Record<string | number, any>; export type ResponseFormat = keyof Omit<Body, "body" | "bodyUsed">; export interface FullRequestParams extends Omit<RequestInit, "body"> { /** set parameter to `true` for call `securityWorker` for this request */ secure?: boolean; /** request path */ path: string; /** content type of request body */ type?: ContentType; /** query params */ query?: QueryParamsType; /** format of response (i.e. response.json() -> format: "json") */ format?: ResponseFormat; /** request body */ body?: unknown; /** base url */ baseUrl?: string; /** request cancellation token */ cancelToken?: CancelToken; } export type RequestParams = Omit<FullRequestParams, "body" | "method" | "query" | "path">; export interface ApiConfig<SecurityDataType = unknown> { baseUrl?: string; baseApiParams?: Omit<RequestParams, "baseUrl" | "cancelToken" | "signal">; securityWorker?: (securityData: SecurityDataType | null) => Promise<RequestParams | void> | RequestParams | void; customFetch?: typeof fetch; } export interface HttpResponse<D extends unknown, E extends unknown = unknown> extends Response { data: D; error: E; } type CancelToken = Symbol | string | number; export enum ContentType { Json = "application/json", FormData = "multipart/form-data", UrlEncoded = "application/x-www-form-urlencoded", Text = "text/plain", } export class HttpClient<SecurityDataType = unknown> { public baseUrl: string = ""; private securityData: SecurityDataType | null = null; private securityWorker?: ApiConfig<SecurityDataType>["securityWorker"]; private abortControllers = new Map<CancelToken, AbortController>(); private customFetch = (...fetchParams: Parameters<typeof fetch>) => fetch(...fetchParams); private baseApiParams: RequestParams = { credentials: "same-origin", headers: {}, redirect: "follow", referrerPolicy: "no-referrer", }; constructor(apiConfig: ApiConfig<SecurityDataType> = {}) { Object.assign(this, apiConfig); } public setSecurityData = (data: SecurityDataType | null) => { this.securityData = data; }; protected encodeQueryParam(key: string, value: any) { const encodedKey = encodeURIComponent(key); return `${encodedKey}=${encodeURIComponent(typeof value === "number" ? value : `${value}`)}`; } protected addQueryParam(query: QueryParamsType, key: string) { return this.encodeQueryParam(key, query[key]); } protected addArrayQueryParam(query: QueryParamsType, key: string) { const value = query[key]; return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); } protected toQueryString(rawQuery?: QueryParamsType): string { const query = rawQuery || {}; const keys = Object.keys(query).filter((key) => "undefined" !== typeof query[key]); return keys .map((key) => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key))) .join("&"); } protected addQueryParams(rawQuery?: QueryParamsType): string { const queryString = this.toQueryString(rawQuery); return queryString ? `?${queryString}` : ""; } private contentFormatters: Record<ContentType, (input: any) => any> = { [ContentType.Json]: (input: any) => input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input, [ContentType.Text]: (input: any) => (input !== null && typeof input !== "string" ? JSON.stringify(input) : input), [ContentType.FormData]: (input: any) => Object.keys(input || {}).reduce((formData, key) => { const property = input[key]; formData.append( key, property instanceof Blob ? property : typeof property === "object" && property !== null ? JSON.stringify(property) : `${property}`, ); return formData; }, new FormData()), [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), }; protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams { return { ...this.baseApiParams, ...params1, ...(params2 || {}), headers: { ...(this.baseApiParams.headers || {}), ...(params1.headers || {}), ...((params2 && params2.headers) || {}), }, }; } protected createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => { if (this.abortControllers.has(cancelToken)) { const abortController = this.abortControllers.get(cancelToken); if (abortController) { return abortController.signal; } return void 0; } const abortController = new AbortController(); this.abortControllers.set(cancelToken, abortController); return abortController.signal; }; public abortRequest = (cancelToken: CancelToken) => { const abortController = this.abortControllers.get(cancelToken); if (abortController) { abortController.abort(); this.abortControllers.delete(cancelToken); } }; public request = async <T = any, E = any>({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }: FullRequestParams): Promise<HttpResponse<T, E>> => { const secureParams = ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); const queryString = query && this.toQueryString(query); const payloadFormatter = this.contentFormatters[type || ContentType.Json]; const responseFormat = format || requestParams.format; return this.customFetch(`${baseUrl || this.baseUrl || ""}${path}${queryString ? `?${queryString}` : ""}`, { ...requestParams, headers: { ...(requestParams.headers || {}), ...(type && type !== ContentType.FormData ? { "Content-Type": type } : {}), }, signal: (cancelToken ? this.createAbortSignal(cancelToken) : requestParams.signal) || null, body: typeof body === "undefined" || body === null ? null : payloadFormatter(body), }).then(async (response) => { const r = response.clone() as HttpResponse<T, E>; r.data = null as unknown as T; r.error = null as unknown as E; const data = !responseFormat ? r : await response[responseFormat]() .then((data) => { if (r.ok) { r.data = data; } else { r.error = data; } return r; }) .catch((e) => { r.error = e; return r; }); if (cancelToken) { this.abortControllers.delete(cancelToken); } if (!response.ok) throw data; return data; }); }; } /** * @title Возвраты покупателями * * Работа с возвратами товаров покупателями */ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> { api = { /** * @description Возвращает заявки покупателей на возврат товаров за текущие 14 дней.<br> Максимум 20 запросов в минуту * * @name V1ClaimsList * @summary Заявки покупателей на возврат * @request GET:/api/v1/claims * @secure */ v1ClaimsList: ( query: { /** * Состояние заявки: * * `false` — на рассмотрении * * `true` — в архиве * @example true */ is_archive: boolean; /** * ID заявки * @format UUID * @example "fe3e9337-e9f9-423c-8930-946a8ebef80" */ id?: string; /** * Количество заявок в ответе. По умолчанию `50` * @format uint * @min 1 * @max 200 * @example 50 */ limit?: number; /** * После какого элемента выдавать данные. По умолчанию `0` * @format uint * @min 0 * @example 0 */ offset?: number; /** * Артикул WB * @example 196320101 */ nm_id?: number; }, params: RequestParams = {}, ) => this.request< { /** Заявки */ claims?: { /** * ID заявки * @format UUID */ id?: string; /** * Источник заявки: * * `1` — портал покупателей * * `3` — чат */ claim_type?: number; /** * Решение по возврату покупателю: * * `0` — на рассмотрении * * `1` — отказ * * `2` — одобрено */ status?: number; /** * Статус товара: * * `0` — на рассмотрении * * `1` — остаётся у покупателя * * `2` — без возврата * * `5` — без возврата * * `8` — товар будет возвращён в реализацию или оформлен на возврат после проверки WB * * `10` — возврат продавцу */ status_ex?: number; /** Артикул WB */ nm_id?: number; /** * Комментарий покупателя * @maxLength 1000 */ user_comment?: string; /** * Ответ покупателю * @maxLength 10000 */ wb_comment?: string; /** * Дата и время оформления заявки покупателем * @format date-time */ dt?: string; /** Название товара */ imt_name?: string; /** * Дата и время заказа * @format date-time */ order_dt?: string; /** * Дата и время рассмотрения заявки. Для нерассмотренной заявки — дата и время оформления * @format date-time */ dt_update?: string; /** * Фотографии из заявки покупателя * @maxItems 10 * @minItems 0 */ photos?: string[]; /** * Видео из заявки покупателя * @maxItems 1 * @minItems 0 */ video_paths?: string[]; /** * Варианты [ответа продавца на заявку](./#/paths/~1api~1v1~1claim/patch).<br> Отклонённые заявки можно пересмотреть. Если массив пуст, с заявкой работать нельзя. * * `approve1` — одобрить с проверкой брака.<br>Деньги вернутся покупателю после возврата товара. Товар будет проверен на складе. При подтверждении брака/ошибки вложения товар будет отправлен продавцу. Если брак/ошибка вложения не подтвердятся, товар будет возвращён в продажу.<br>Неприменимо при схеме <b>Самовывоз</b>. * * `approve2` — одобрить и забрать товар.<br> Деньги вернутся покупателю после возврата товара. Товар будет отправлен продавцу.<br>Неприменимо при схеме <b>Самовывоз</b>. * * `autorefund1` — одобрить без возврата товара.<br> Товар останется у покупателя. Деньги за него будут возвращены покупателю без возврата товара. * * `reject1` — отклонить с шаблоном ответа: <details><summary><strong>Брак не обнаружен</strong></summary>Здравствуйте!<br>Продавец рассмотрел и отклонил вашу заявку: он не нашёл брак, который вы описали, на фото или видео.<br>Если брак производственный, можете: — попробовать решить вопрос напрямую в чате с продавцом — в разделе «Покупки» нажмите на три точки возле товара и выберите «Задать вопрос продавцу», — обратиться в сервисный центр или независимую экспертизу, чтобы получить заключение о браке. После экспертизы отправьте скан заключения, создав новую заявку на проверку товара.<br>Если дефект непроизводственный, то можно оспорить решение продавца, для этого откройте в приложении раздел «Возврат товара по браку» или на сайте раздел «Брак или другая проблема», выберите заявку, нажмите кнопку «Оспорить решение» и напишите, почему вы не согласны. Мы всё проверим и напишем вам.</details> * * `reject2` — отклонить с шаблоном ответа: <details><summary><strong>Добавить фото/видео</strong></summary>Здравствуйте!<br>К сожалению, продавец не смог подтвердить брак, повреждение или несоответствие описанию. Отправьте новую заявку и проверьте, что дефект виден на фото и видео, а сами они хорошего качества. Напомним, что нужно прикрепить к заявке:<br>1. Фото товара целиком.<br>2. Фото и видео брака.<br>3. Фото с биркой или другой маркировкой товара.<br>4. Фото упаковки со штрих-кодом, если она осталась.<br>5. Комментарий, в котором подробно описано, что сломано и как вы это выяснили.</details> * * `reject3` — отклонить с шаблоном ответа: <details><summary><strong>Направить в сервисный центр</strong></summary>Здравствуйте!<br>Мы внимательно прочитали заявку, проверили фото и видео. К сожалению, мы не нашли брак, повреждение или несоответствие описанию в вашем товаре.<br>Обратитесь напрямую в сервисный центр — его адрес и контакты есть на сайте производителя или на гарантийном талоне. Там проведут окончательную проверку товара и выдадут вам акт. Если центр нашёл брак, то отправьте этот акт в чат на нашем сайте.</details> * * `rejectcustom` — отклонить с комментарием.<br> Комментарий передаётся в параметре `comment`. * * `approvecc1` — одобрить заявку с возвратом товара в магазин продавца.<br>Можно передать комментарий (например, телефон для связи или время работы своего отдела возвратов) в параметре `comment`. По итогу возврата необходимо ответить на заявку с `"action":"confirmreturngoodcc1"` или `"action":"rejectcustom"`.<br>Применимо только при схеме <b>Самовывоз</b>. * * `confirmreturngoodcc1` — подтвердить приёмку товара от покупателя.<br>Применимо только при схеме <b>Самовывоз</b>. */ actions?: string[]; /** Фактическая цена с учетом всех скидок. Взимается с покупателя */ price?: number; /** Код валюты цены */ currency_code?: string; /** Уникальный ID заказа, по товару которого создана заявка */ srid?: string; }[]; /** Количество заявок, соответствующих параметрам запроса. Без учёта `limit` и `offset` */ total?: number; }, | { /** * ID ошибки * @example "Invalid query params" */ title?: string; /** * Описание ошибки * @example "Failed to deserialize query string: missing field `is_archive`" */ detail?: string; /** * ID запроса * @example "e0aedc10-9789-49c1-9a83-d8422b4703dc" */ requestId?: string; } | void | string >({ path: `/api/v1/claims`, method: "GET", query: query, secure: true, ...params, }), /** * @description Отправляет ответ на заявку покупателя на возврат.<br> Максимум 20 запросов в минуту * * @name V1ClaimPartialUpdate * @summary Ответ на заявку покупателя * @request PATCH:/api/v1/claim * @secure */ v1ClaimPartialUpdate: ( data: { /** * ID заявки * @format UUID * @example "fe3e9337-e9f9-423c-8930-946a8ebef80" */ id: string; /** * Действие с заявкой.<br>Используйте одно из значений массива `actions` — ответа [метода получения заявок](./#/paths/~1api~1v1~1claims/get) * @example "rejectcustom" */ action: string; /** * Комментарий.<br>Применимо только при `"action":"rejectcustom"` или `"action":"approvecc1"`. При `"action":"rejectcustom"` параметр обязателен * @minLength 10 * @maxLength 1000 * @example "Фото не имеет отношения к товару в заявке" */ comment?: string; }, params: RequestParams = {}, ) => this.request< any, | { /** * ID ошибки * @example "Validation error" */ title?: string; /** * Описание ошибки * @example "Input model is not valid; Details: The Action field is required." */ detail?: string; /** * ID запроса * @example "0HN3PI6JUGFSL:00000004" */ requestId?: string; } | void | string >({ path: `/api/v1/claim`, method: "PATCH", body: data, secure: true, ...params, }), }; }