/* eslint-disable */ /* tslint:disable */ // @ts-nocheck /* * --------------------------------------------------------------- * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## * ## ## * ## AUTHOR: acacode ## * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## * --------------------------------------------------------------- */ export interface HealthResponseDto { /** * Имя сервиса, который вернул health-check ответ. * @example "image-platform-api" */ service: string; /** * Текущее состояние сервиса. * @example "ok" */ status: string; } export interface AssetResponseDto { /** * Внутренний UUID asset. * @example "59fcf4f6-9891-4df4-8bb7-a4dbe570bb66" */ id: string; /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; /** * Текущая версия source image. * @example 1 */ currentVersion: number; /** * Статус asset. * @example "active" */ status: AssetResponseDtoStatusEnum; /** * Source URL текущей версии. * @example "https://storage.yandexcloud.net/shared1318/img/1.jpg" */ sourceUrl: string; /** * Hostname source URL текущей версии. * @example "storage.yandexcloud.net" */ sourceHost: string; /** * Дата создания asset. * @example "2026-05-05T12:00:00.000Z" */ createdAt: string; /** * Дата обновления asset. * @example "2026-05-05T12:00:00.000Z" */ updatedAt: string; } export interface AssetsListResponseDto { /** Список assets. */ assets: AssetResponseDto[]; } export interface CreateAssetRequestDto { /** * Публичный стабильный идентификатор asset. Если не передан, Backend сгенерирует идентификатор автоматически. * @example "asset_123" */ publicId?: string; /** * Постоянная ссылка на исходное изображение. Сейчас поддерживаются только публичные http/https URL. * @example "https://storage.yandexcloud.net/shared1318/img/1.jpg" */ sourceUrl: string; } export interface CreateAssetResponseDto { /** * Внутренний UUID asset в PostgreSQL. * @example "59fcf4f6-9891-4df4-8bb7-a4dbe570bb66" */ id: string; /** * Публичный идентификатор asset для Gateway URL. * @example "asset_123" */ publicId: string; /** * Номер версии source image. Используется в URL как `v{version}`. * @example 1 */ version: number; /** * Нормализованный hostname исходного изображения. * @example "storage.yandexcloud.net" */ sourceHost: string; /** * Базовый путь Gateway для запроса variant. Width, quality и format передаются query params. * @example "/images/asset_123/v1/card" */ imageBasePath: string; } export interface CreateAssetVersionRequestDto { /** * Постоянная ссылка на новую версию исходного изображения. * @example "https://storage.yandexcloud.net/shared1318/img/1.jpg" */ sourceUrl: string; } export interface CreateAssetVersionResponseDto { /** * Внутренний UUID asset. * @example "59fcf4f6-9891-4df4-8bb7-a4dbe570bb66" */ assetId: string; /** * Внутренний UUID новой версии source image. * @example "3b5da974-bb7f-4d73-b172-d6ad9c244528" */ versionId: string; /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; /** * Предыдущая активная версия source image. * @example 1 */ previousVersion: number; /** * Новая активная версия source image. * @example 2 */ version: number; /** * Нормализованный source URL новой версии. * @example "https://storage.yandexcloud.net/shared1318/img/1.jpg" */ sourceUrl: string; /** * Hostname source URL новой версии. * @example "storage.yandexcloud.net" */ sourceHost: string; /** * Базовый Gateway path для новой версии. * @example "/images/asset_demo/v2/card" */ imageBasePath: string; /** * Дата создания версии. * @example "2026-05-05T12:00:00.000Z" */ createdAt: string; } export interface AssetPictureImageResponseDto { /** * Fallback image URL для ``. * @example "http://localhost:8888/images/asset_demo/v1/card?w=960&q=80&f=jpg" */ src: string; /** * Fallback image format. * @example "jpg" */ format: AssetPictureImageResponseDtoFormatEnum; /** * Fallback image Content-Type. * @example "image/jpeg" */ type: string; /** * Fallback image width. * @example 960 */ width: number; /** * Fallback image height. `0` означает auto height. * @example 0 */ height: number; } export interface AssetPictureSourceResponseDto { /** * Source format. * @example "webp" */ format: AssetPictureSourceResponseDtoFormatEnum; /** * Source MIME type для ``. * @example "image/webp" */ type: string; /** Готовая строка srcset с width descriptors. */ srcSet: string; } export interface AssetPictureResponseDto { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; /** * Preset, для которого построен picture contract. * @example "card" */ preset: string; /** * Версия source image. * @example 1 */ version: number; /** * Quality для всех URL. * @example 80 */ quality: number; /** * Значение sizes для ``. * @example "100vw" */ sizes: string; /** * Width descriptors, вошедшие в srcset. * @example [320,640,960] */ widths: string[]; /** Fallback image для ``. */ image: AssetPictureImageResponseDto; /** Sources для ``. */ sources: AssetPictureSourceResponseDto[]; } export interface AssetVariantResponseDto { /** * Внутренний UUID variant. * @example "7748d24e-5f30-4064-8ee8-4745a4d2aef1" */ id: string; /** * Preset или `custom`. * @example "card" */ preset: string; /** * Версия source image, для которой создан variant. * @example 1 */ version: number; /** * Ширина variant. * @example 640 */ width: number; /** * Высота variant. `0` означает auto height. * @example 0 */ height: number; /** * Режим resize. * @example "fit" */ resize: AssetVariantResponseDtoResizeEnum; /** * Качество variant. * @example 80 */ quality: number; /** * Запрошенный формат. * @example "webp" */ requestedFormat: AssetVariantResponseDtoRequestedFormatEnum; /** * Фактический формат bytes. * @example "webp" */ format: AssetVariantResponseDtoFormatEnum; /** * Статус генерации. * @example "ready" */ status: AssetVariantResponseDtoStatusEnum; /** * Публичный Gateway URL для variant. * @example "http://localhost:8888/images/asset_demo/v1/card?w=640&q=80&f=webp" */ url: string; /** * S3 key variant object. * @example "variants/asset_demo/v1/abc.webp" */ s3Key: string; /** * Content-Type готового object. * @example "image/webp" */ contentType?: object; /** * Размер готового object в bytes. * @example 71844 */ sizeBytes?: object; /** Ошибка последней генерации, если status=`failed`. */ error?: object; /** * Дата создания variant. * @example "2026-05-05T12:00:00.000Z" */ createdAt: string; /** * Дата обновления variant. * @example "2026-05-05T12:00:00.000Z" */ updatedAt: string; } export interface AssetVariantsResponseDto { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; /** Список variants. */ variants: AssetVariantResponseDto[]; } export interface CreateAssetVariantsRequestDto { /** * Preset для генерации или `custom`. * @example "card" */ preset: string; /** * Режим генерации: один variant или вся family preset. * @example "single" */ mode?: CreateAssetVariantsRequestDtoModeEnum; /** * Версия source image. Если не передана, используется currentVersion asset. * @example 1 */ version?: number; /** * Ширина variant. Обязательна для responsive preset в mode=`single` и custom. * @example 640 */ width?: number; /** * Высота variant для custom. `0` или отсутствие означает auto height. * @example 333 */ height?: number; /** * Качество. Если не передано, берётся из preset/custom config. * @example 80 */ quality?: number; /** * Фактический формат для single generation. * @example "webp" */ format?: CreateAssetVariantsRequestDtoFormatEnum; /** Форматы для family generation. Если не переданы, используются все форматы preset. */ formats?: CreateAssetVariantsRequestDtoFormatsEnum[]; /** * Resize mode для custom transforms. * @example "fill" */ resize?: CreateAssetVariantsRequestDtoResizeEnum; } export interface CreateAssetVariantsResponseDto { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; /** * Версия source image, для которой поставлены jobs. * @example 1 */ version: number; /** Созданные или переиспользованные variants. */ variants: AssetVariantResponseDto[]; } export interface EnsureImageVariantRequestDto { /** * Публичный идентификатор asset из Gateway URL. * @example "asset_123" */ assetId: string; /** * Версия source image из Gateway URL `v{version}`. * @min 1 * @example 4 */ version: number; /** * Имя preset трансформации. Сейчас используется как часть variant key. * @example "card" */ preset: string; /** * Целевая ширина variant в пикселях. Обязательна для responsive presets и custom. * @min 1 * @example 640 */ width?: number; /** * Целевая высота variant в пикселях. `0` или отсутствие означает auto height. * @min 0 * @example 420 */ height?: number; /** * Качество сжатия для imgproxy. Если не передано, берётся из preset. * @min 1 * @example 80 */ quality?: number; /** * Формат, который запросил клиент. Для `auto` Gateway выбирает фактический формат по `Accept` header. * @example "auto" */ requestedFormat?: EnsureImageVariantRequestDtoRequestedFormatEnum; /** * Режим resize для custom transforms. Для обычных presets берётся из preset config. * @example "fit" */ resize?: EnsureImageVariantRequestDtoResizeEnum; /** * Фактический output format после negotiation. Именно этот формат попадает в S3 key и L1 cache key. * @example "webp" */ format: EnsureImageVariantRequestDtoFormatEnum; } export interface PresetResponseDto { /** * Имя preset. * @example "card" */ name: string; /** * Режим preset. * @example "responsive" */ mode: PresetResponseDtoModeEnum; /** * Разрешённые форматы. * @example ["avif","webp","jpg"] */ formats: string[]; /** * Разрешённые значения quality. * @example [75,80] */ qualities: string[]; /** * Quality по умолчанию. * @example 80 */ quality: number; /** * Resize mode preset. * @example "fit" */ resize: PresetResponseDtoResizeEnum; /** * Фиксированная ширина для fixed preset. * @example 256 */ width?: number; /** * Фиксированная высота для fixed preset. * @example 256 */ height?: number; /** * Разрешённые ширины для responsive preset. * @example [320,640,960] */ widths?: string[]; } export interface CustomTransformConfigResponseDto { /** * Включены ли custom transforms. * @example true */ enabled: boolean; /** * Разрешённые форматы custom transforms. * @example ["avif","webp","jpg","png"] */ formats: string[]; /** * Максимальная ширина custom transform. * @example 4096 */ maxWidth: number; /** * Максимальная высота custom transform. * @example 4096 */ maxHeight: number; /** * Quality по умолчанию для custom transform. * @example 80 */ quality: number; } export interface PresetsResponseDto { /** Static presets. */ presets: PresetResponseDto[]; /** Custom transform config. */ custom: CustomTransformConfigResponseDto; /** * Mock allowlist source hosts. * @example ["storage.yandexcloud.net"] */ allowedSourceHosts: string[]; } /** * Статус asset. * @example "active" */ export enum AssetResponseDtoStatusEnum { Active = "active", Disabled = "disabled", Deleted = "deleted", } /** * Fallback image format. * @example "jpg" */ export enum AssetPictureImageResponseDtoFormatEnum { Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Source format. * @example "webp" */ export enum AssetPictureSourceResponseDtoFormatEnum { Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Режим resize. * @example "fit" */ export enum AssetVariantResponseDtoResizeEnum { Fit = "fit", Fill = "fill", } /** * Запрошенный формат. * @example "webp" */ export enum AssetVariantResponseDtoRequestedFormatEnum { Auto = "auto", Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Фактический формат bytes. * @example "webp" */ export enum AssetVariantResponseDtoFormatEnum { Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Статус генерации. * @example "ready" */ export enum AssetVariantResponseDtoStatusEnum { Pending = "pending", Processing = "processing", Ready = "ready", Failed = "failed", } /** * Режим генерации: один variant или вся family preset. * @example "single" */ export enum CreateAssetVariantsRequestDtoModeEnum { Single = "single", Family = "family", } /** * Фактический формат для single generation. * @example "webp" */ export enum CreateAssetVariantsRequestDtoFormatEnum { Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } export enum CreateAssetVariantsRequestDtoFormatsEnum { Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Resize mode для custom transforms. * @example "fill" */ export enum CreateAssetVariantsRequestDtoResizeEnum { Fit = "fit", Fill = "fill", } /** * Формат, который запросил клиент. Для `auto` Gateway выбирает фактический формат по `Accept` header. * @example "auto" */ export enum EnsureImageVariantRequestDtoRequestedFormatEnum { Auto = "auto", Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Режим resize для custom transforms. Для обычных presets берётся из preset config. * @example "fit" */ export enum EnsureImageVariantRequestDtoResizeEnum { Fit = "fit", Fill = "fill", } /** * Фактический output format после negotiation. Именно этот формат попадает в S3 key и L1 cache key. * @example "webp" */ export enum EnsureImageVariantRequestDtoFormatEnum { Avif = "avif", Webp = "webp", Jpg = "jpg", Png = "png", } /** * Режим preset. * @example "responsive" */ export enum PresetResponseDtoModeEnum { Fixed = "fixed", Responsive = "responsive", } /** * Resize mode preset. * @example "fit" */ export enum PresetResponseDtoResizeEnum { Fit = "fit", Fill = "fill", } export interface ListAssetsParams { /** * Максимальное количество assets в ответе. * @example 50 */ limit?: string; /** * Смещение для простого paging. * @example 0 */ offset?: string; } export interface GetAssetParams { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; } export interface CreateAssetVersionParams { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; } export interface GetAssetPictureParams { /** * Static preset для picture contract. * @example "card" */ preset: string; /** * Версия source image. Если не передана, используется currentVersion asset. * @example 1 */ version?: string; /** * Quality. Если не передано, берётся default quality preset. * @example 80 */ quality?: string; /** * Значение для HTML `sizes`. * @example "(min-width: 768px) 50vw, 100vw" */ sizes?: string; /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; } export interface ListAssetVariantsParams { /** * Версия source image. Если не передана, возвращаются variants всех версий. * @example 1 */ version?: string; /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; } export interface CreateAssetVariantsParams { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; } export namespace System { /** * @description Возвращает простой health-check ответ. Используется для локальной проверки, мониторинга и smoke tests. * @tags system * @name GetHealth * @summary проверить состояние Backend API * @request GET:/api/health */ export namespace GetHealth { export type RequestParams = {}; export type RequestQuery = {}; export type RequestBody = never; export type RequestHeaders = {}; export type ResponseBody = HealthResponseDto; } } export namespace Assets { /** * @description Возвращает последние зарегистрированные assets вместе с source URL текущей версии. * @tags assets * @name ListAssets * @summary получить список assets * @request GET:/api/assets */ export namespace ListAssets { export type RequestParams = {}; export type RequestQuery = { /** * Максимальное количество assets в ответе. * @example 50 */ limit?: string; /** * Смещение для простого paging. * @example 0 */ offset?: string; }; export type RequestBody = never; export type RequestHeaders = {}; export type ResponseBody = AssetsListResponseDto; } /** * @description Создаёт asset и первую версию source image. Source URL сохраняется в PostgreSQL, а публичный image URL строится через Gateway без раскрытия исходной ссылки клиенту. * @tags assets * @name CreateAsset * @summary зарегистрировать исходное изображение * @request POST:/api/assets */ export namespace CreateAsset { export type RequestParams = {}; export type RequestQuery = {}; export type RequestBody = CreateAssetRequestDto; export type RequestHeaders = {}; export type ResponseBody = CreateAssetResponseDto; } /** * @description Возвращает metadata asset и source URL текущей версии. * @tags assets * @name GetAsset * @summary получить asset по publicId * @request GET:/api/assets/{publicId} */ export namespace GetAsset { export type RequestParams = { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; }; export type RequestQuery = {}; export type RequestBody = never; export type RequestHeaders = {}; export type ResponseBody = AssetResponseDto; } /** * @description Регистрирует новый source URL для существующего asset, увеличивает currentVersion и тем самым создаёт новый immutable Gateway URL `/v{version}` без purge старых URLs. * @tags assets * @name CreateAssetVersion * @summary создать новую версию source image * @request POST:/api/assets/{publicId}/versions */ export namespace CreateAssetVersion { export type RequestParams = { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; }; export type RequestQuery = {}; export type RequestBody = CreateAssetVersionRequestDto; export type RequestHeaders = {}; export type ResponseBody = CreateAssetVersionResponseDto; } /** * @description Возвращает готовый контракт для `` и `` по static preset: sources, srcset, fallback src, sizes и versioned Gateway URLs. Endpoint не ставит generation jobs: Gateway сгенерирует bytes lazy или отдаст cache. * @tags assets * @name GetAssetPicture * @summary получить picture/srcset URLs * @request GET:/api/assets/{publicId}/picture */ export namespace GetAssetPicture { export type RequestParams = { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; }; export type RequestQuery = { /** * Static preset для picture contract. * @example "card" */ preset: string; /** * Версия source image. Если не передана, используется currentVersion asset. * @example 1 */ version?: string; /** * Quality. Если не передано, берётся default quality preset. * @example 80 */ quality?: string; /** * Значение для HTML `sizes`. * @example "(min-width: 768px) 50vw, 100vw" */ sizes?: string; }; export type RequestBody = never; export type RequestHeaders = {}; export type ResponseBody = AssetPictureResponseDto; } /** * @description Возвращает variants asset: preset/custom параметры, status, S3 key, public URL и ошибку генерации, если она была. * @tags assets * @name ListAssetVariants * @summary получить variants asset * @request GET:/api/assets/{publicId}/variants */ export namespace ListAssetVariants { export type RequestParams = { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; }; export type RequestQuery = { /** * Версия source image. Если не передана, возвращаются variants всех версий. * @example 1 */ version?: string; }; export type RequestBody = never; export type RequestHeaders = {}; export type ResponseBody = AssetVariantsResponseDto; } /** * @description Business endpoint для явной подготовки variants. В режиме `single` создаёт один variant, в режиме `family` создаёт набор variants preset по всем разрешённым widths/formats. Endpoint не ждёт bytes, а возвращает созданные/переиспользованные rows и public URLs. * @tags assets * @name CreateAssetVariants * @summary поставить generation jobs для variants * @request POST:/api/assets/{publicId}/variants */ export namespace CreateAssetVariants { export type RequestParams = { /** * Публичный идентификатор asset. * @example "asset_demo" */ publicId: string; }; export type RequestQuery = {}; export type RequestBody = CreateAssetVariantsRequestDto; export type RequestHeaders = {}; export type ResponseBody = CreateAssetVariantsResponseDto; } } export namespace InternalImages { /** * @description Внутренний endpoint для Gateway. На L1 cache miss Backend проверяет PostgreSQL и S3, создаёт variant при необходимости, публикует RabbitMQ job, ждёт генерацию worker и возвращает готовые image bytes. * @tags internal-images * @name EnsureImageVariant * @summary подготовить variant изображения для Gateway * @request POST:/api/internal/images/ensure */ export namespace EnsureImageVariant { export type RequestParams = {}; export type RequestQuery = {}; export type RequestBody = EnsureImageVariantRequestDto; export type RequestHeaders = {}; export type ResponseBody = File; } } export namespace Presets { /** * @description Возвращает статический config presets, custom transform limits и mock allowlist source hosts. * @tags presets * @name GetPresets * @summary получить доступные presets и custom config * @request GET:/api/presets */ export namespace GetPresets { export type RequestParams = {}; export type RequestQuery = {}; export type RequestBody = never; export type RequestHeaders = {}; export type ResponseBody = PresetsResponseDto; } } /** * Фетчер для SWR * Принимает URL и возвращает Promise с данными */ export const fetcher = (url: string): Promise => { return fetch(url, { headers: { "Content-Type": "application/json", }, }).then((res) => { if (!res.ok) { throw new Error(`HTTP Error ${res.status}`); } return res.json(); }); }; export type QueryParamsType = Record; export type ResponseFormat = keyof Omit; export interface FullRequestParams extends Omit { /** 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 { baseUrl?: string; baseApiParams?: Omit; securityWorker?: ( securityData: SecurityDataType | null, ) => Promise | RequestParams | void; customFetch?: typeof fetch; } export interface HttpResponse extends Response { data: D; error: E; } type CancelToken = Symbol | string | number; export enum ContentType { Json = "application/json", JsonApi = "application/vnd.api+json", FormData = "multipart/form-data", UrlEncoded = "application/x-www-form-urlencoded", Text = "text/plain", } export class HttpClient { public baseUrl: string = ""; private securityData: SecurityDataType | null = null; private securityWorker?: ApiConfig["securityWorker"]; private abortControllers = new Map(); private customFetch = (...fetchParams: Parameters) => fetch(...fetchParams); private baseApiParams: RequestParams = { credentials: "same-origin", headers: {}, redirect: "follow", referrerPolicy: "no-referrer", }; constructor(apiConfig: ApiConfig = {}) { 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 any> = { [ContentType.Json]: (input: any) => input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input, [ContentType.JsonApi]: (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) => { if (input instanceof FormData) { return input; } return 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 ({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }: FullRequestParams): Promise => { 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 as HttpResponse; r.data = null as unknown as T; r.error = null as unknown as E; const responseToParse = responseFormat ? response.clone() : response; const data = !responseFormat ? r : await responseToParse[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.data; }); }; } /** * @title Image Platform API * @version 0.1.0 * @contact * * Backend API для управления image assets, metadata в PostgreSQL, S3 variants, RabbitMQ jobs и генерацией через imgproxy. */ export class Api { http: HttpClient; constructor(http?: HttpClient) { this.http = http || new HttpClient(); } system = { /** * @description Возвращает простой health-check ответ. Используется для локальной проверки, мониторинга и smoke tests. * * @tags system * @name GetHealth * @summary проверить состояние Backend API * @request GET:/api/health */ getHealth: (params: RequestParams = {}) => this.http.request({ path: `/api/health`, method: "GET", format: "json", ...params, }), }; assets = { /** * @description Возвращает последние зарегистрированные assets вместе с source URL текущей версии. * * @tags assets * @name ListAssets * @summary получить список assets * @request GET:/api/assets */ listAssets: (query: ListAssetsParams, params: RequestParams = {}) => this.http.request({ path: `/api/assets`, method: "GET", query: query, format: "json", ...params, }), /** * @description Создаёт asset и первую версию source image. Source URL сохраняется в PostgreSQL, а публичный image URL строится через Gateway без раскрытия исходной ссылки клиенту. * * @tags assets * @name CreateAsset * @summary зарегистрировать исходное изображение * @request POST:/api/assets */ createAsset: (data: CreateAssetRequestDto, params: RequestParams = {}) => this.http.request({ path: `/api/assets`, method: "POST", body: data, type: ContentType.Json, format: "json", ...params, }), /** * @description Возвращает metadata asset и source URL текущей версии. * * @tags assets * @name GetAsset * @summary получить asset по publicId * @request GET:/api/assets/{publicId} */ getAsset: ( { publicId, ...query }: GetAssetParams, params: RequestParams = {}, ) => this.http.request({ path: `/api/assets/${publicId}`, method: "GET", format: "json", ...params, }), /** * @description Регистрирует новый source URL для существующего asset, увеличивает currentVersion и тем самым создаёт новый immutable Gateway URL `/v{version}` без purge старых URLs. * * @tags assets * @name CreateAssetVersion * @summary создать новую версию source image * @request POST:/api/assets/{publicId}/versions */ createAssetVersion: ( { publicId, ...query }: CreateAssetVersionParams, data: CreateAssetVersionRequestDto, params: RequestParams = {}, ) => this.http.request({ path: `/api/assets/${publicId}/versions`, method: "POST", body: data, type: ContentType.Json, format: "json", ...params, }), /** * @description Возвращает готовый контракт для `` и `` по static preset: sources, srcset, fallback src, sizes и versioned Gateway URLs. Endpoint не ставит generation jobs: Gateway сгенерирует bytes lazy или отдаст cache. * * @tags assets * @name GetAssetPicture * @summary получить picture/srcset URLs * @request GET:/api/assets/{publicId}/picture */ getAssetPicture: ( { publicId, ...query }: GetAssetPictureParams, params: RequestParams = {}, ) => this.http.request({ path: `/api/assets/${publicId}/picture`, method: "GET", query: query, format: "json", ...params, }), /** * @description Возвращает variants asset: preset/custom параметры, status, S3 key, public URL и ошибку генерации, если она была. * * @tags assets * @name ListAssetVariants * @summary получить variants asset * @request GET:/api/assets/{publicId}/variants */ listAssetVariants: ( { publicId, ...query }: ListAssetVariantsParams, params: RequestParams = {}, ) => this.http.request({ path: `/api/assets/${publicId}/variants`, method: "GET", query: query, format: "json", ...params, }), /** * @description Business endpoint для явной подготовки variants. В режиме `single` создаёт один variant, в режиме `family` создаёт набор variants preset по всем разрешённым widths/formats. Endpoint не ждёт bytes, а возвращает созданные/переиспользованные rows и public URLs. * * @tags assets * @name CreateAssetVariants * @summary поставить generation jobs для variants * @request POST:/api/assets/{publicId}/variants */ createAssetVariants: ( { publicId, ...query }: CreateAssetVariantsParams, data: CreateAssetVariantsRequestDto, params: RequestParams = {}, ) => this.http.request({ path: `/api/assets/${publicId}/variants`, method: "POST", body: data, type: ContentType.Json, format: "json", ...params, }), }; internalImages = { /** * @description Внутренний endpoint для Gateway. На L1 cache miss Backend проверяет PostgreSQL и S3, создаёт variant при необходимости, публикует RabbitMQ job, ждёт генерацию worker и возвращает готовые image bytes. * * @tags internal-images * @name EnsureImageVariant * @summary подготовить variant изображения для Gateway * @request POST:/api/internal/images/ensure */ ensureImageVariant: ( data: EnsureImageVariantRequestDto, params: RequestParams = {}, ) => this.http.request({ path: `/api/internal/images/ensure`, method: "POST", body: data, type: ContentType.Json, format: "blob", ...params, }), }; presets = { /** * @description Возвращает статический config presets, custom transform limits и mock allowlist source hosts. * * @tags presets * @name GetPresets * @summary получить доступные presets и custom config * @request GET:/api/presets */ getPresets: (params: RequestParams = {}) => this.http.request({ path: `/api/presets`, method: "GET", format: "json", ...params, }), }; }