Add api key for use rest api
Test Workflow / test (push) Has been cancelled

This commit is contained in:
2026-06-30 23:32:57 +07:00
parent 2330f279aa
commit be63fc3c10
3 changed files with 2178 additions and 59 deletions
@@ -100,9 +100,6 @@ paths:
message_desc: "User not found" message_desc: "User not found"
message_body: {} message_body: {}
# = INTERNAL ENDPOINTS предназначены для работы с данными =
# = Для использования эндпоинтов предусмотрен только внутренний ключ X-Internal-Key (header) =
/api/internal/data-info: /api/internal/data-info:
post: post:
tags: tags:
@@ -137,10 +134,10 @@ paths:
value: value:
msg_id: 30019 msg_id: 30019
message_body: message_body:
top: 10, top: 10
type: "image" type: "image"
tariffStatistic: tariffStatistic:
summary: Информация по таррифам summary: Информация по тарифам
value: value:
msg_id: 30020 msg_id: 30020
message_body: message_body:
@@ -164,7 +161,7 @@ paths:
value: value:
msg_id: 30024 msg_id: 30024
tokenStatistic: tokenStatistic:
summary: Подписки summary: Статистика токенов
value: value:
msg_id: 30025 msg_id: 30025
incomingStatistic: incomingStatistic:
@@ -195,7 +192,6 @@ paths:
page_size: 10 page_size: 10
sort_by: "createdAt" sort_by: "createdAt"
sort_direction: "desc" sort_direction: "desc"
responses: responses:
'200': '200':
description: Ответ с запрашиваемой информацией description: Ответ с запрашиваемой информацией
@@ -393,7 +389,6 @@ paths:
'404': '404':
description: Файл не найден description: Файл не найден
# ========== DATA ENDPOINTS TODO ==========
/api/v{version}/data: /api/v{version}/data:
post: post:
tags: tags:
@@ -408,7 +403,6 @@ paths:
- **20007** - Поиск по изображению (ImageFoundRequestHandler) - **20007** - Поиск по изображению (ImageFoundRequestHandler)
**Пользователи:** **Пользователи:**
- **20008** - Авторизация через сторонние сервисы (AuthRequestHandler)
- **20009** - Верификация регистрации (VerifyRegisterUserHandler) - **20009** - Верификация регистрации (VerifyRegisterUserHandler)
- **30014** - Информация о пользователе (UserInfoHandler) - **30014** - Информация о пользователе (UserInfoHandler)
- **30016** - Верификация пользователя (UserVerificationHandler) - **30016** - Верификация пользователя (UserVerificationHandler)
@@ -421,7 +415,6 @@ paths:
**Платежи:** **Платежи:**
- **30005** - Платежи (PaymentHandler) - **30005** - Платежи (PaymentHandler)
- **30008** - Расчет стоимости (CostHandler)
**Мониторинг и нарушения:** **Мониторинг и нарушения:**
- **30007** - Мониторинг (MonitoringHandler) - **30007** - Мониторинг (MonitoringHandler)
@@ -463,7 +456,7 @@ paths:
$ref: '#/components/schemas/BaseRequest' $ref: '#/components/schemas/BaseRequest'
examples: examples:
fileUploadInit: fileUploadInit:
summary: Инициализация загрузки файла summary: "[20004] Инициализация загрузки файла"
value: value:
msg_id: 20004 msg_id: 20004
message_body: message_body:
@@ -471,35 +464,280 @@ paths:
file_name: "document.pdf" file_name: "document.pdf"
file_type: "document" file_type: "document"
extension: "pdf" extension: "pdf"
convert_to: "protected" convertTo: "protected"
file_size: 1048576 file_size: 1048576
fileTypes: fileTypes:
summary: Получение типов файлов summary: "[20004] Получение типов файлов"
value: value:
msg_id: 20004 msg_id: 20004
message_body: message_body:
action: "file_types" action: "file_types"
fileExtensions: fileExtensions:
summary: Получение расширений для типа summary: "[20004] Получение расширений для типа"
value: value:
msg_id: 20004 msg_id: 20004
message_body: message_body:
action: "file_extension" action: "file_extension"
file_type: "image" file_type: "image"
companyInfo: fileUploadChunks:
summary: Информация о компании summary: "[20004] Статус чанков загрузки"
value:
msg_id: 20004
message_body:
action: "chunks"
upload_id: "550e8400-e29b-41d4-a716-446655440000"
fileUploadCancel:
summary: "[20004] Отмена загрузки"
value:
msg_id: 20004
message_body:
action: "cancel"
upload_id: "550e8400-e29b-41d4-a716-446655440000"
fileUploadProgress:
summary: "[20004] Прогресс загрузки"
value:
msg_id: 20004
message_body:
action: "progress"
upload_id: "550e8400-e29b-41d4-a716-446655440000"
fileInfo:
summary: "[20005] Информация о файле"
value:
msg_id: 20005
message_body:
action: "file_info"
file_id: "550e8400-e29b-41d4-a716-446655440000"
userFilesInfo:
summary: "[20005] Статистика по файлам пользователя"
value:
msg_id: 20005
message_body:
action: "user_files_info"
userFiles:
summary: "[20005] Список файлов пользователя"
value:
msg_id: 20005
message_body:
action: "user_files"
page: 1
page_size: 20
searchFiles:
summary: "[20005] Поиск файлов с фильтрацией"
value:
msg_id: 20005
message_body:
action: "search_files"
query: "документ"
type: "application/pdf"
statuses: ["ACTIVE", "BLOCKED"]
date_filter: "month"
sort_by: "createdAt"
sort_order: "desc"
page: 1
page_size: 20
storageUsage:
summary: "[20005] Использование дискового пространства"
value:
msg_id: 20005
message_body:
action: "storage_usage"
deleteFile:
summary: "[20005] Удаление файла"
value:
msg_id: 20005
message_body:
action: "delete_file"
file_id: "550e8400-e29b-41d4-a716-446655440000"
changePermission:
summary: "[20005] Изменение прав доступа"
value:
msg_id: 20005
message_body:
action: "change_permission"
file_id: "550e8400-e29b-41d4-a716-446655440000"
permissions:
VIEW: true
DOWNLOAD: false
imageSearch:
summary: "[20007] Поиск изображения"
value:
msg_id: 20007
message_body:
file_id: "550e8400-e29b-41d4-a716-446655440000"
verifyUser:
summary: "[20009] Верификация пользователя"
value:
msg_id: 20009
message_body:
user_id: 123
verify_token: "abc123def456"
companyCreate:
summary: "[30000] Создание компании"
value: value:
msg_id: 30000 msg_id: 30000
message_body: message_body:
action: "get_info" action: "create"
company_name: "ООО Моя Компания"
company_data:
phone: "+79991234567"
email: "info@company.ru"
companyGetById:
summary: "[30000] Получение компании по ID"
value:
msg_id: 30000
message_body:
action: "getCompany"
company_id: "company-uuid-123"
tariffAdd:
summary: "[30001] Добавление тарифа"
value:
msg_id: 30001
message_body:
action: "add"
type: "MONTHLY"
tariff_name: "Премиум"
tariff_price: 999.99
tariffInfoCreate:
summary: "[30002] Создание информации о тарифе"
value:
msg_id: 30002
message_body:
action: "create"
tariff_id: 1
referralUserStats:
summary: "[30003] Статистика пользователя"
value:
msg_id: 30003
message_body:
action: "userStats"
paymentUserPayments:
summary: "[30005] Список платежей"
value:
msg_id: 30005
message_body:
action: "user_payments"
email: "user@example.com"
monitoringSet:
summary: "[30007] Установка мониторинга"
value:
msg_id: 30007
message_body:
file_id: "550e8400-e29b-41d4-a716-446655440000"
monitoring_type: "MONITORING_DAILY"
violationList:
summary: "[30009] Список нарушений"
value:
msg_id: 30009
message_body:
action: "list"
page: 0
size: 10
violationStats:
summary: "[30010] Статистика нарушений"
value:
msg_id: 30010
message_body: {}
globalSearch: globalSearch:
summary: Глобальный поиск summary: "[30011] Глобальный поиск"
value: value:
msg_id: 30011 msg_id: 30011
message_body: message_body:
query: "изображение кота" query: "изображение кота"
filters: filters:
file_type: "image" file_type: "image"
notionAdd:
summary: "[30012] Добавление заметки"
value:
msg_id: 30012
message_body:
action: "add_notion"
violation_id: 1
message: "Текст заметки"
complaintCreate:
summary: "[30013] Создание жалобы"
value:
msg_id: 30013
message_body:
action: "create"
violation_id: 1
text: "Текст жалобы"
userInfoGetAllPaginated:
summary: "[30014] Получить всех пользователей с пагинацией"
value:
msg_id: 30014
message_body:
action: "getAllWithPagination"
page: 0
size: 10
notificationList:
summary: "[30015] Список уведомлений"
value:
msg_id: 30015
message_body:
action: "list"
page: 0
size: 10
userVerificationVerify:
summary: "[30016] Верифицировать пользователя"
value:
msg_id: 30016
message_body:
action: "verified"
user_id: 123
verified: true
lawCaseCreate:
summary: "[30017] Создать юридическое дело"
value:
msg_id: 30017
message_body:
action: "create"
name: "Дело о нарушении"
description: "Описание дела"
priority: "HIGH"
violation_id: 1
tokenOpGetList:
summary: "[30018] Список операций с токенами"
value:
msg_id: 30018
message_body:
action: "get_list"
page: 0
size: 20
monitoringStatistic:
summary: "[30027] Статистика мониторинга"
value:
msg_id: 30027
message_body: {}
dockViewHistory:
summary: "[30028] История просмотров документов"
value:
msg_id: 30028
message_body:
action: "history_view"
page: 0
size: 10
responses: responses:
'200': '200':
description: Успешный ответ description: Успешный ответ
@@ -509,7 +747,7 @@ paths:
$ref: '#/components/schemas/BaseResponse' $ref: '#/components/schemas/BaseResponse'
examples: examples:
fileUploadInitSuccess: fileUploadInitSuccess:
summary: Успешная инициализация загрузки summary: "[20004] Успешная инициализация загрузки"
value: value:
msg_id: 20004 msg_id: 20004
message_code: 0 message_code: 0
@@ -521,26 +759,179 @@ paths:
chunk_size: 209715 chunk_size: 209715
status: "INITIALIZED" status: "INITIALIZED"
fileTypesSuccess: fileTypesSuccess:
summary: Типы файлов summary: "[20004] Типы файлов"
value: value:
msg_id: 20004 msg_id: 20004
message_code: 0 message_code: 0
message_desc: "Operation successful" message_desc: "Operation successful"
message_body: message_body:
file_types: file_types: ["IMAGE", "DOCUMENT", "AUDIO"]
- "IMAGE"
- "DOCUMENT"
- "AUDIO"
count: 3 count: 3
fileInfoSuccess:
summary: "[20005] Информация о файле"
value:
msg_id: 20005
message_code: 0
message_desc: "Operation successful"
message_body:
id: "550e8400-e29b-41d4-a716-446655440000"
file_name: "document.pdf"
status: "ACTIVE"
imageSearchSuccess:
summary: "[20007] Результаты поиска изображений"
value:
msg_id: 20007
message_code: 0
message_desc: "Operation successful"
message_body:
images:
- url: "https://example.com/similar-image.jpg"
title: "Похожее изображение"
page: 1
total_results: 25
verifySuccess:
summary: "[20009] Успешная верификация"
value:
msg_id: 20009
message_code: 0
message_desc: "Operation successful"
message_body:
token: "eyJhbGciOiJIUzI1NiIs..."
verified: true
email: "user@example.com"
companyCreateSuccess:
summary: "[30000] Компания создана"
value:
msg_id: 30000
message_code: 0
message_desc: "Company created successfully"
message_body:
id: "company-uuid-123"
company_name: "ООО Моя Компания"
tariffAddSuccess:
summary: "[30001] Тариф добавлен"
value:
msg_id: 30001
message_code: 0
message_desc: "Tariff added successfully"
message_body:
tariff_name: "Премиум"
tariff_type: "MONTHLY"
referralUserStatsSuccess:
summary: "[30003] Статистика пользователя"
value:
msg_id: 30003
message_code: 0
message_desc: "Operation successful"
message_body:
total_invitees: 15
total_earned: 5000.00
paymentUserPaymentsSuccess:
summary: "[30005] Список платежей"
value:
msg_id: 30005
message_code: 0
message_desc: "Operation successful"
message_body:
payments:
- payment_uuid: "payment-uuid-123"
amount: 999.99
monitoringSetSuccess:
summary: "[30007] Мониторинг установлен"
value:
msg_id: 30007
message_code: 0
message_desc: "Monitoring settings updated"
message_body:
file_id: "550e8400-e29b-41d4-a716-446655440000"
monitoring_type: "MONITORING_DAILY"
violationListSuccess:
summary: "[30009] Список нарушений"
value:
msg_id: 30009
message_code: 0
message_desc: "Operation successful"
message_body:
violations: []
total_elements: 25
globalSearchStatsSuccess:
summary: "[30011] Статистика глобального поиска"
value:
msg_id: 30011
message_code: 0
message_desc: ""
message_body:
total_searches: 150
complaintCreateSuccess:
summary: "[30013] Жалоба создана"
value:
msg_id: 30013
message_code: 0
message_desc: "Complaint created successfully"
message_body:
id: 1
status: "OPEN"
notificationListSuccess:
summary: "[30015] Список уведомлений"
value:
msg_id: 30015
message_code: 0
message_desc: "Operation successful"
message_body:
notifications: []
unread_count: 5
lawCaseCreateSuccess:
summary: "[30017] Юридическое дело создано"
value:
msg_id: 30017
message_code: 0
message_desc: "Operation successful"
message_body:
id: 1
name: "Дело о нарушении"
tokenOpListSuccess:
summary: "[30018] Список операций с токенами"
value:
msg_id: 30018
message_code: 0
message_desc: "Operation successful"
message_body:
operations: []
total_elements: 50
monitoringStatisticSuccess:
summary: "[30027] Статистика мониторинга"
value:
msg_id: 30027
message_code: 0
message_desc: "Operation successful"
message_body:
day: 10
month: 5
weekly: 7
invalidMsgId: invalidMsgId:
summary: Неверный msg_id summary: "[Common] Неверный msg_id"
value: value:
msg_id: 99999 msg_id: 99999
message_code: 4 message_code: 4
message_desc: "Message id not found" message_desc: "Message id not found"
message_body: {} message_body: {}
# ========== FILE UPLOAD ENDPOINTS ==========
/api/v{version}/files/chunk: /api/v{version}/files/chunk:
post: post:
tags: tags:
@@ -719,7 +1110,6 @@ paths:
file_path: "/uploads/user123/doc.pdf" file_path: "/uploads/user123/doc.pdf"
remaining_chunks: 2 remaining_chunks: 2
# ========== FILE DOWNLOAD ENDPOINTS ==========
/api/v{version}/files/download/{fileId}: /api/v{version}/files/download/{fileId}:
get: get:
tags: tags:
@@ -763,7 +1153,7 @@ paths:
type: string type: string
description: Имя файла для сохранения description: Имя файла для сохранения
example: 'attachment; filename="document.pdf"' example: 'attachment; filename="document.pdf"'
'200-json': '403':
description: Ошибка при скачивании description: Ошибка при скачивании
content: content:
application/json: application/json:
@@ -838,7 +1228,6 @@ paths:
type: string type: string
format: binary format: binary
# ========== FILE SIMILARITY ENDPOINTS ==========
/api/v{version}/files/{fileId}/similar: /api/v{version}/files/{fileId}/similar:
get: get:
tags: tags:
@@ -919,7 +1308,6 @@ paths:
has_previous: false has_previous: false
/api/check/{fileId}: /api/check/{fileId}:
get: get:
tags: tags:
@@ -962,7 +1350,6 @@ paths:
DOCUMENT: 45 DOCUMENT: 45
AUDIO: 12 AUDIO: 12
# ========== COMPONENTS ==========
components: components:
schemas: schemas:
BaseRequest: BaseRequest:
@@ -1025,42 +1412,24 @@ components:
properties: properties:
action: action:
type: string type: string
description: |
Действие с загрузкой:
- init - инициализация загрузки
- file_types - получение доступных типов файлов
- file_extension - получение расширений для типа
- chunks - статус чанков
- cancel - отмена загрузки
- progress - прогресс загрузки
enum: [init, file_types, file_extension, chunks, cancel, progress] enum: [init, file_types, file_extension, chunks, cancel, progress]
example: init example: init
file_name: file_name:
type: string type: string
description: Имя файла (для action=init)
example: "document.pdf" example: "document.pdf"
file_type: file_type:
type: string type: string
description: Тип файла (image, document, audio)
enum: [IMAGE, DOCUMENT, AUDIO] enum: [IMAGE, DOCUMENT, AUDIO]
example: DOCUMENT
extension: extension:
type: string type: string
description: Расширение файла
example: "pdf"
convert_to: convert_to:
type: string type: string
description: Формат конвертации
example: "protected"
file_size: file_size:
type: integer type: integer
format: int64 format: int64
description: Размер файла в байтах
example: 1048576
upload_id: upload_id:
type: string type: string
format: uuid format: uuid
description: ID сессии загрузки (для action=cancel, chunks, progress)
InitFileResponse: InitFileResponse:
type: object type: object
@@ -1068,20 +1437,14 @@ components:
upload_id: upload_id:
type: string type: string
format: uuid format: uuid
description: ID сессии загрузки
file_name: file_name:
type: string type: string
description: Имя файла
total_chunks: total_chunks:
type: integer type: integer
description: Общее количество чанков
chunk_size: chunk_size:
type: integer type: integer
description: Размер одного чанка в байтах
status: status:
type: string type: string
description: Статус загрузки
example: "INITIALIZED"
ChunkUploadResponse: ChunkUploadResponse:
type: object type: object
@@ -1162,10 +1525,8 @@ components:
type: array type: array
items: items:
type: string type: string
example: ["IMAGE", "DOCUMENT", "AUDIO"]
count: count:
type: integer type: integer
example: 3
FileExtensionResponse: FileExtensionResponse:
type: object type: object
@@ -1174,13 +1535,11 @@ components:
type: array type: array
items: items:
type: string type: string
example: ["jpg", "jpeg", "png", "gif"]
count: count:
type: integer type: integer
max_file_size: max_file_size:
type: integer type: integer
format: int64 format: int64
description: Максимальный размер файла в байтах
CanceledUploadResponse: CanceledUploadResponse:
type: object type: object
+350
View File
@@ -0,0 +1,350 @@
openapi: 3.0.3
info:
title: NoCopy API - API Keys
description: API для управления пользовательскими API ключами
version: 1.0.0
contact:
name: NoCopy
servers:
- url: http://localhost:8080
description: Локальный
- url: https://dev-workspace.not-copy.com/
description: Дев
tags:
- name: User
description: Управление пользовательскими данными и API ключами
paths:
/api/user/api-keys:
post:
tags:
- User
summary: Создание API ключа
description: |
Создаёт новый API ключ для пользователя.
- Требуется авторизация (Bearer токен)
- Если имя не указано, будет присвоено "Unnamed key"
- Возвращает полный ключ только один раз при создании
- Префикс ключа можно использовать для идентификации без раскрытия секрета
operationId: createApiKey
security:
- BearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: Название ключа для идентификации (опционально)
example: "My API Key"
maxLength: 255
examples:
withName:
summary: С указанием названия
value:
name: "Production Key"
withDescription:
summary: С описательным названием
value:
name: "Key for mobile app"
withoutName:
summary: Без названия (по умолчанию "Unnamed key")
value: {}
minimalExample:
summary: Пустое тело запроса
value: {}
responses:
'200':
description: Ключ успешно создан
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
success:
summary: API ключ создан
value:
msg_id: null
message_code: 0
message_desc: "API key created successfully"
message_body:
apiKey: "sk-live-abc123def456789ghi012jkl345mno678"
successWithDescription:
summary: API ключ с описанием создан
value:
msg_id: null
message_code: 0
message_desc: "API key created successfully"
message_body:
apiKey: "sk-test-xyz987abc654def321ghi098jkl765mno"
'401':
description: Неавторизованный доступ
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
unauthorized:
summary: Токен не предоставлен или недействителен
value:
msg_id: null
message_code: 7
message_desc: "Authentication required"
message_body: null
get:
tags:
- User
summary: Получение списка API ключей
description: |
Возвращает все API ключи текущего пользователя.
**Особенности:**
- Требуется авторизация (Bearer токен)
- Полные ключи не возвращаются, только префиксы
- Включает информацию об активности и времени использования
operationId: listApiKeys
security:
- BearerAuth: []
responses:
'200':
description: Список ключей пользователя
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
success:
summary: Список с несколькими ключами
value:
msg_id: null
message_code: 0
message_desc: null
message_body:
- id: 1
name: "Production Key"
prefix: "sk-live-abc123..."
isActive: true
createdAt: "2025-01-15T10:30:00Z"
lastUsedAt: "2025-06-30T14:22:00Z"
- id: 2
name: "Key for mobile app"
prefix: "sk-live-def456..."
isActive: true
createdAt: "2025-03-20T08:00:00Z"
lastUsedAt: "2025-06-29T18:45:00Z"
- id: 3
name: "Old Development Key"
prefix: "sk-test-ghi789..."
isActive: false
createdAt: "2025-02-10T12:00:00Z"
lastUsedAt: "2025-05-15T09:30:00Z"
singleKey:
summary: Один активный ключ
value:
msg_id: null
message_code: 0
message_desc: null
message_body:
- id: 1
name: "My API Key"
prefix: "sk-live-abc123..."
isActive: true
createdAt: "2025-06-01T00:00:00Z"
lastUsedAt: null
empty:
summary: Нет созданных ключей
value:
msg_id: null
message_code: 0
message_desc: null
message_body: []
'401':
description: Неавторизованный доступ
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
unauthorized:
summary: Токен не предоставлен или недействителен
value:
msg_id: null
message_code: 7
message_desc: "Authentication required"
message_body: null
/api/user/api-keys/{keyId}:
delete:
tags:
- User
summary: Отзыв (удаление) API ключа
description: |
Деактивирует API ключ пользователя. Ключ становится неактивным и больше не может использоваться.
**Особенности:**
- Требуется авторизация (Bearer токен)
- Пользователь может отозвать только свои ключи
- Отозванный ключ нельзя восстановить (нужно создавать новый)
operationId: revokeApiKey
security:
- BearerAuth: []
parameters:
- name: keyId
in: path
required: true
schema:
type: integer
format: int64
description: ID ключа для отзыва
example: 1
responses:
'200':
description: Ключ успешно отозван
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
success:
summary: Ключ отозван
value:
msg_id: null
message_code: 0
message_desc: null
message_body: null
'401':
description: Неавторизованный доступ
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
unauthorized:
summary: Токен не предоставлен или недействителен
value:
msg_id: null
message_code: 7
message_desc: "Authentication required"
message_body: null
'403':
description: Доступ запрещён (ключ не принадлежит пользователю)
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
forbidden:
summary: Ключ принадлежит другому пользователю
value:
msg_id: null
message_code: 6
message_desc: "Access denied"
message_body: null
'404':
description: Ключ не найден
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
notFound:
summary: Ключ с указанным ID не существует
value:
msg_id: null
message_code: 4
message_desc: "API key not found"
message_body:
keyId: 999
components:
schemas:
BaseResponse:
type: object
properties:
msg_id:
type: integer
description: Идентификатор сообщения (может быть null)
nullable: true
example: null
message_code:
type: integer
description: |
Код результата:
- 0 - Успешно
- 4 - Ресурс не найден
- 6 - Доступ запрещён
- 7 - Требуется авторизация
example: 0
message_desc:
type: string
description: Описание результата операции (может быть null)
nullable: true
example: "API key created successfully"
message_body:
description: Данные ответа
nullable: true
oneOf:
- type: object
properties:
apiKey:
type: string
description: Полный API ключ (только при создании)
example: "sk-live-abc123def456..."
description: Ответ при создании ключа
- type: array
items:
$ref: '#/components/schemas/ApiKeyInfo'
description: Список ключей пользователя
- type: object
description: Пустой объект или null
nullable: true
example: null
ApiKeyInfo:
type: object
description: Информация об API ключе
properties:
id:
type: integer
format: int64
description: Уникальный идентификатор ключа
example: 1
name:
type: string
description: Название ключа
example: "Production Key"
prefix:
type: string
description: Префикс ключа для идентификации
example: "sk-live-abc123..."
isActive:
type: boolean
description: Активен ли ключ
example: true
createdAt:
type: string
format: date-time
description: Дата и время создания ключа
example: "2025-01-15T10:30:00Z"
lastUsedAt:
type: string
format: date-time
nullable: true
description: Дата и время последнего использования (null если не использовался)
example: "2025-06-30T14:22:00Z"
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: JWT токен для авторизации (получить через /api/auth)
security:
- BearerAuth: []
File diff suppressed because it is too large Load Diff