/* 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,
}),
};
}