Files
no-copy/infrastructure/open-api-controller.yaml
T

1575 lines
54 KiB
YAML
Raw Normal View History

2026-06-29 16:01:14 +07:00
openapi: 3.0.3
info:
title: NoCopy API
2026-07-01 11:49:54 +07:00
description: |
Основной API для работы с файлами, загрузкой, поиском и управлением данными.
Включает контроллеры:
- ApiController (основная обработка данных, файлы, поиск)
- FileController (загрузка и скачивание файлов)
2026-06-29 16:01:14 +07:00
version: 1.0.0
contact:
name: NoCopy
servers:
- url: http://localhost:8080
description: Локальный
- url: https://dev-workspace.not-copy.com/
description: Дев
tags:
- name: Auth
description: Аутентификация и регистрация
- name: Files
description: Работа с файлами (загрузка, скачивание, проверка)
- name: Data
description: Основные операции с данными
- name: Internal
description: Внутренние эндпоинты для администрирования
paths:
/api/auth:
post:
tags:
- Auth
summary: Универсальный эндпоинт аутентификации
description: |
Обрабатывает запросы аутентификации по msg_id:
- **20001** - Вход в систему
- **20002** - Регистрация
- **20010** - Сброс пароля
operationId: handleAuth
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BaseRequest'
examples:
login:
summary: Вход в систему
value:
msg_id: 20001
message_body:
email: "user@example.com"
password: "securePassword123"
register:
summary: Регистрация
value:
msg_id: 20002
message_body:
fullName: "Vladislav Sergevich"
email: "321@mail.ru"
password: "qweqweqwe123"
phone: "+79994521523"
mail_verified: "false"
accountType: "b2c"
ip: "127.0.0.1"
user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
resetPassword:
summary: Сброс пароля
value:
version: 1
msg_id: 20010
message_body:
email: "user@example.com"
responses:
'200':
description: Успешный ответ
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
loginSuccess:
summary: Успешный вход
value:
msg_id: 20001
message_code: 0
message_desc: "Operation successful"
message_body:
token: "eyJhbGciOiJIUzI1NiIs..."
user_id: 123
invalidCredentials:
summary: Неверные учетные данные
value:
msg_id: 20001
message_code: 2
message_desc: "Invalid credentials"
message_body: {}
userNotFound:
summary: Пользователь не найден
value:
msg_id: 20010
message_code: 2
message_desc: "User not found"
message_body: {}
/api/internal/data-info:
post:
tags:
- Internal
summary: Внутренняя информация (статистика)
description: |
Эндпоинт для получения внутренней статистики и информации.
operationId: handleInternalInfo
parameters:
- name: X-Internal-Key
in: header
required: true
description: Внутренний ключ для доступа к API
schema:
type: string
example: "your-internal-key-here"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BaseRequest'
examples:
userInfo:
summary: Информация о пользователе
value:
msg_id: 30014
message_body:
user_id: 123
userFileInfo:
summary: Информация по файлам
value:
msg_id: 30019
message_body:
2026-06-30 23:32:57 +07:00
top: 10
2026-06-29 16:01:14 +07:00
type: "image"
tariffStatistic:
2026-06-30 23:32:57 +07:00
summary: Информация по тарифам
2026-06-29 16:01:14 +07:00
value:
msg_id: 30020
message_body:
active_only: true
dynamicStatistic:
summary: Динамика
value:
msg_id: 30021
fileUserStatistic:
summary: Статистика по файлам пользователей
value:
msg_id: 30022
message_body:
active_only: true
violations:
summary: Нарушения
value:
msg_id: 30023
subscribesStatistic:
summary: Подписки
value:
msg_id: 30024
tokenStatistic:
2026-06-30 23:32:57 +07:00
summary: Статистика токенов
2026-06-29 16:01:14 +07:00
value:
msg_id: 30025
incomingStatistic:
summary: Доходы статистика
value:
msg_id: 30026
complaintStatistic:
summary: Жалобы
value:
msg_id: 30029
filesInfo:
summary: Информация о файлах
value:
msg_id: 40001
message_body:
action: "get_all"
page: 1
page_size: 10
sort_by: "createdAt"
sort_direction: "desc"
tariffsInfo:
summary: Информация о тарифах
value:
msg_id: 40004
message_body:
action: "get_all"
page: 1
page_size: 10
sort_by: "createdAt"
sort_direction: "desc"
responses:
'200':
description: Ответ с запрашиваемой информацией
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
/api/internal/data-control:
post:
tags:
- Internal
summary: Управление контентом
description: Эндпоинт для модерации и управления контентом.
operationId: handleInternalControl
parameters:
- name: X-Internal-Key
in: header
required: true
description: Внутренний ключ для доступа к API
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BaseRequest'
examples:
userInfoGetAll:
summary: Получить всех пользователей с пагинацией
value:
msg_id: 30014
message_body:
action: "getAllWithPagination"
page: 0
size: 10
sort_by: "createdAt"
sort_direction: "desc"
userInfoGetById:
summary: Получить информацию о пользователе по ID
value:
msg_id: 30014
message_body:
action: "getInfoById"
user_id: 123
userInfoUpdate:
summary: Обновить дополнительную информацию пользователя
value:
msg_id: 30014
message_body:
action: "update"
user_id: 123
ip_address: "192.168.1.1"
user_agent: "Mozilla/5.0"
userInfoDelete:
summary: Удалить дополнительную информацию пользователя
value:
msg_id: 30014
message_body:
action: "delete"
user_id: 123
complaintCreate:
summary: Создать жалобу
value:
msg_id: 30030
message_body:
action: "create"
violation_id: 456
complaint_text: "Нарушение правил использования"
complaintUpdateStatus:
summary: Обновить статус жалобы
value:
msg_id: 30030
message_body:
action: "update_status"
id: "complaint-uuid"
status: "RESOLVED"
complaintUpdate:
summary: Обновить жалобу
value:
msg_id: 30030
message_body:
action: "update"
id: "complaint-uuid"
complaint_text: "Обновленный текст жалобы"
complaintDelete:
summary: Удалить жалобу
value:
msg_id: 30030
message_body:
action: "delete"
id: "complaint-uuid"
fileModerate:
summary: Модерировать файл
value:
msg_id: 40002
message_body:
action: "moderate_file"
file_id: "file-uuid"
file_status: "APPROVED"
comment: "Файл проверен"
fileChangeStatus:
summary: Изменить статус файла
value:
msg_id: 40002
message_body:
action: "change_file_status"
file_id: "file-uuid"
file_status: "BLOCKED"
fileReviewAppeal:
summary: Рассмотреть апелляцию
value:
msg_id: 40002
message_body:
action: "review_appeal"
appeal_id: "appeal-uuid"
approve: true
comment: "Апелляция одобрена"
tariffAdd:
summary: Добавить тариф
value:
msg_id: 40003
message_body:
action: "add"
name: "Premium"
price: 999.99
type: "MONTHLY"
tokens: 1000
disk_size: 50
max_users: 5
max_files_count: 100
tariff_term: "MONTHLY"
description: "Премиум тариф"
account_type: "PREMIUM"
tariffRemove:
summary: Удалить тариф
value:
msg_id: 40003
message_body:
action: "remove"
id: "tariff-uuid"
tariffUpdate:
summary: Обновить тариф
value:
msg_id: 40003
message_body:
action: "update"
id: "tariff-uuid"
name: "Premium Plus"
price: 1499.99
description: "Обновленный премиум тариф"
responses:
'200':
description: Результат операции управления
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
'401':
description: Неверный или отсутствующий внутренний ключ
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
/api/internal/data-download/{fileId}:
get:
tags:
- Internal
summary: Внутреннее скачивание файла
description: Прямое скачивание файла из хранилища для внутренних нужд
operationId: internalDownloadFile
parameters:
- name: X-Internal-Key
in: header
required: true
description: Внутренний ключ для доступа к API
schema:
type: string
- name: fileId
in: path
required: true
schema:
type: string
description: ID файла
responses:
'200':
description: Файл
content:
application/octet-stream:
schema:
type: string
format: binary
'404':
description: Файл не найден
/api/v{version}/data:
post:
tags:
- Data
summary: Основной эндпоинт обработки данных
description: |
Обрабатывает запросы по msg_id. Доступные операции:
**Файлы:**
- **20004** - Инициализация загрузки/информация о типах файлов/статус чанков (FileUploadHandler)
- **20005** - Операции с файлами (FileEntityHandler)
- **20007** - Поиск по изображению (ImageFoundRequestHandler)
**Пользователи:**
- **20009** - Верификация регистрации (VerifyRegisterUserHandler)
- **30014** - Информация о пользователе (UserInfoHandler)
- **30016** - Верификация пользователя (UserVerificationHandler)
**Компании и тарифы:**
- **30000** - Управление компанией (CompanyHandler)
- **30001** - Управление тарифами (TariffHandler)
- **30002** - Информация о тарифах (TariffInfoHandler)
- **30003** - Реферальная система (ReferralHandler)
**Платежи:**
- **30005** - Платежи (PaymentHandler)
**Мониторинг и нарушения:**
- **30007** - Мониторинг (MonitoringHandler)
- **30009** - Нарушения (ViolationHandler)
- **30010** - Статистика нарушений (ViolationStatisticsHandler)
- **30027** - Статистика мониторинга (MonitoringStatisticHandler)
**Поиск и жалобы:**
- **30011** - Глобальный поиск (GlobalSearchHandler)
- **30012** - Уведомления о нарушениях (ViolationNotionHandler)
- **30013** - Жалобы (ComplaintEntityHandler)
**Уведомления:**
- **30015** - Уведомления (NotificationHandler)
**Юридические дела:**
- **30017** - Управление делами (LawCaseHandler)
**Токены:**
- **30018** - Операции с токенами (TokenOperationHandler)
**Просмотр документов:**
- **30028** - Просмотр документов (DockViewFileHandler)
operationId: handleDataRequest
parameters:
- name: version
in: path
required: true
schema:
type: integer
minimum: 1
description: Версия API
example: 1
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BaseRequest'
examples:
fileUploadInit:
2026-06-30 23:32:57 +07:00
summary: "[20004] Инициализация загрузки файла"
2026-06-29 16:01:14 +07:00
value:
msg_id: 20004
message_body:
action: "init"
file_name: "document.pdf"
file_type: "document"
extension: "pdf"
2026-06-30 23:32:57 +07:00
convertTo: "protected"
2026-06-29 16:01:14 +07:00
file_size: 1048576
fileTypes:
2026-06-30 23:32:57 +07:00
summary: "[20004] Получение типов файлов"
2026-06-29 16:01:14 +07:00
value:
msg_id: 20004
message_body:
action: "file_types"
fileExtensions:
2026-06-30 23:32:57 +07:00
summary: "[20004] Получение расширений для типа"
2026-06-29 16:01:14 +07:00
value:
msg_id: 20004
message_body:
action: "file_extension"
file_type: "image"
2026-06-30 23:32:57 +07:00
fileUploadChunks:
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] Создание компании"
2026-06-29 16:01:14 +07:00
value:
msg_id: 30000
message_body:
2026-06-30 23:32:57 +07:00
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: {}
2026-06-29 16:01:14 +07:00
globalSearch:
2026-06-30 23:32:57 +07:00
summary: "[30011] Глобальный поиск"
2026-06-29 16:01:14 +07:00
value:
msg_id: 30011
message_body:
query: "изображение кота"
filters:
file_type: "image"
2026-06-30 23:32:57 +07:00
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
2026-06-29 16:01:14 +07:00
responses:
'200':
description: Успешный ответ
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
fileUploadInitSuccess:
2026-06-30 23:32:57 +07:00
summary: "[20004] Успешная инициализация загрузки"
2026-06-29 16:01:14 +07:00
value:
msg_id: 20004
message_code: 0
message_desc: "Operation successful"
message_body:
upload_id: "550e8400-e29b-41d4-a716-446655440000"
file_name: "document.pdf"
total_chunks: 5
chunk_size: 209715
status: "INITIALIZED"
fileTypesSuccess:
2026-06-30 23:32:57 +07:00
summary: "[20004] Типы файлов"
2026-06-29 16:01:14 +07:00
value:
msg_id: 20004
message_code: 0
message_desc: "Operation successful"
message_body:
2026-06-30 23:32:57 +07:00
file_types: ["IMAGE", "DOCUMENT", "AUDIO"]
2026-06-29 16:01:14 +07:00
count: 3
2026-06-30 23:32:57 +07:00
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
2026-06-29 16:01:14 +07:00
invalidMsgId:
2026-06-30 23:32:57 +07:00
summary: "[Common] Неверный msg_id"
2026-06-29 16:01:14 +07:00
value:
msg_id: 99999
message_code: 4
message_desc: "Message id not found"
message_body: {}
/api/v{version}/files/chunk:
post:
tags:
- Files
summary: Загрузка чанка файла
description: Загрузка части файла (чанка) в рамках multipart-загрузки
operationId: uploadChunk
parameters:
- name: version
in: path
required: true
schema:
type: integer
description: Версия API
- name: upload_id
in: query
required: true
schema:
type: string
format: uuid
description: ID сессии загрузки
- name: chunk_number
in: query
required: true
schema:
type: integer
minimum: 0
description: Номер чанка (начиная с 0)
- name: findSimilar
in: query
required: false
schema:
type: integer
default: 0
description: Искать похожие файлы (1 - да, 0 - нет)
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- chunk
properties:
chunk:
type: string
format: binary
description: Файл чанка
responses:
'200':
description: Результат загрузки чанка
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
success:
summary: Чанк загружен успешно
value:
msg_id: 20000
message_code: 0
message_desc: "Chunk uploaded successfully"
message_body:
upload_id: "550e8400-e29b-41d4-a716-446655440000"
chunk_number: 0
chunk_size: 209715
file_id: "abc123"
message: "Chunk uploaded successfully"
duplicateFile:
summary: Найден дубликат файла
value:
msg_id: 20004
message_code: 2
message_desc: "Duplicate file upload"
message_body:
duplicate_file_id: "xyz789"
user_id: 123
message: "Duplicate file found"
/api/v{version}/files/{uploadId}/complete:
post:
tags:
- Files
summary: Завершение загрузки файла
description: Подтверждение завершения загрузки всех чанков
operationId: completeUpload
parameters:
- name: version
in: path
required: true
schema:
type: integer
description: Версия API
- name: uploadId
in: path
required: true
schema:
type: string
format: uuid
description: ID сессии загрузки
responses:
'200':
description: Статус завершения загрузки
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
success:
summary: Сборка файла запущена
value:
msg_id: 20004
message_code: 0
message_desc: "File assembly in progress"
message_body:
upload_id: "550e8400-e29b-41d4-a716-446655440000"
status: "COMPLETING"
uploaded_chunks: 5
total_chunks: 5
message: "File assembly in progress"
incomplete:
summary: Не все чанки загружены
value:
msg_id: 20004
message_code: 2
message_desc: "Not all chunks uploaded"
message_body:
upload_id: "550e8400-e29b-41d4-a716-446655440000"
status: "IN_PROGRESS"
uploaded_chunks: 3
total_chunks: 5
message: "Not all chunks uploaded"
/api/v{version}/files/progress/{uploadId}:
get:
tags:
- Files
summary: Прогресс загрузки файла
description: Получение текущего статуса загрузки
operationId: getUploadProgress
parameters:
- name: version
in: path
required: true
schema:
type: integer
description: Версия API
- name: uploadId
in: path
required: true
schema:
type: string
format: uuid
description: ID сессии загрузки
responses:
'200':
description: Прогресс загрузки
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
inProgress:
summary: Загрузка в процессе
value:
msg_id: 20004
message_code: 0
message_desc: "Operation successful"
message_body:
upload_id: "550e8400-e29b-41d4-a716-446655440000"
file_name: "document.pdf"
total_chunks: 5
uploaded_chunks: 3
status: "IN_PROGRESS"
progress_percentage: 60.0
file_path: "/uploads/user123/doc.pdf"
remaining_chunks: 2
/api/v{version}/files/download/{fileId}:
get:
tags:
- Files
summary: Скачивание защищенного файла
description: |
Скачивание файла с проверкой прав доступа. Требуется авторизация.
Проверяет права пользователя на скачивание файла.
operationId: downloadFile
parameters:
- name: version
in: path
required: true
schema:
type: integer
description: Версия API
- name: fileId
in: path
required: true
schema:
type: string
description: ID файла
- name: Authorization
in: header
required: true
schema:
type: string
description: Токен авторизации
example: "Bearer eyJhbGciOiJIUzI1NiIs..."
responses:
'200':
description: Файл для скачивания
content:
application/octet-stream:
schema:
type: string
format: binary
headers:
Content-Disposition:
schema:
type: string
description: Имя файла для сохранения
example: 'attachment; filename="document.pdf"'
2026-06-30 23:32:57 +07:00
'403':
2026-06-29 16:01:14 +07:00
description: Ошибка при скачивании
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
fileBlocked:
summary: Файл заблокирован
value:
msg_id: 20004
message_code: 1
message_desc: "File is blocked,deleted or removed"
message_body:
file_id: "abc123"
noPermission:
summary: Нет прав на скачивание
value:
msg_id: 20004
message_code: 2
message_desc: "Not have permission for download"
message_body:
file_id: "abc123"
/api/v{version}/files/public-download/{fileId}:
get:
tags:
- Files
summary: Публичное скачивание файла
description: Скачивание файла без авторизации (если разрешено)
operationId: publicDownloadFile
parameters:
- name: version
in: path
required: true
schema:
type: integer
description: Версия API
- name: fileId
in: path
required: true
schema:
type: string
description: ID файла
responses:
'200':
description: Файл для скачивания
content:
application/octet-stream:
schema:
type: string
format: binary
/api/file/link:
post:
tags:
- Files
summary: Получение ссылки на файл для DocViewer
description: Создает ссылку для просмотра документа и логирует просмотр
operationId: getFileLink
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DocViewerRequest'
responses:
'200':
description: Файл для скачивания/просмотра
content:
application/octet-stream:
schema:
type: string
format: binary
/api/v{version}/files/{fileId}/similar:
get:
tags:
- Files
summary: Поиск похожих файлов
description: |
Поиск файлов, похожих на указанный.
Для изображений использует алгоритм перцептивного хеша.
Для документов и аудио проверяет на полные дубликаты.
operationId: findSimilarFiles
parameters:
- name: version
in: path
required: true
schema:
type: integer
description: Версия API
- name: fileId
in: path
required: true
schema:
type: string
description: ID файла для поиска похожих
- name: similarityLevels
in: query
required: false
schema:
type: array
items:
type: string
description: Уровни схожести для фильтрации
example: ["HIGH", "MEDIUM"]
- name: page
in: query
required: false
schema:
type: integer
default: 0
description: Номер страницы
- name: size
in: query
required: false
schema:
type: integer
default: 20
description: Размер страницы
- name: sort
in: query
required: false
schema:
type: string
default: "hammingDistance"
description: Поле для сортировки
responses:
'200':
description: Список похожих файлов
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
examples:
success:
summary: Найдены похожие файлы
value:
msg_id: 20004
message_code: 0
message_desc: "Similar files found"
message_body:
content:
- file_id: "xyz789"
similarity: 95.5
file_name: "similar_image.jpg"
page: 0
size: 20
total_elements: 1
total_pages: 1
has_next: false
has_previous: false
/api/check/{fileId}:
get:
tags:
- Files
summary: Проверка защиты файла
description: Проверяет, защищен ли файл системой NoCopy
operationId: checkFileProtection
parameters:
- name: fileId
in: path
required: true
schema:
type: string
description: ID файла для проверки
responses:
'200':
description: Результат проверки
content:
application/json:
schema:
$ref: '#/components/schemas/BaseResponse'
/api/check/file_stats:
get:
tags:
- Files
summary: Статистика защиты файлов
description: Получение статистики по защищенным файлам пользователя
operationId: checkFileProtectStats
responses:
'200':
description: Статистика по типам файлов
content:
application/json:
schema:
type: object
additionalProperties: true
example:
IMAGE: 150
DOCUMENT: 45
AUDIO: 12
components:
schemas:
BaseRequest:
type: object
required:
- msg_id
- message_body
properties:
msg_id:
type: integer
description: Идентификатор сообщения/операции
example: 20004
message_body:
type: object
description: Тело запроса с параметрами операции
additionalProperties: true
BaseResponse:
type: object
properties:
msg_id:
type: integer
description: Идентификатор сообщения (копируется из запроса)
example: 20004
message_code:
type: integer
description: |
Код результата:
- 0 - Успешно
- 1 - Предупреждение/особый случай
- 2 - Ошибка валидации/бизнес-логики
- 4 - Ресурс не найден
example: 0
message_desc:
type: string
description: Описание результата операции
example: "Operation successful"
message_body:
type: object
description: Данные ответа
additionalProperties: true
DocViewerRequest:
type: object
required:
- file_id
properties:
file_id:
type: string
description: ID файла для просмотра
user_id:
type: integer
description: ID пользователя (если не передан в заголовке)
action:
type: string
description: Действие с документом
FileUploadRequest:
type: object
properties:
action:
type: string
enum: [init, file_types, file_extension, chunks, cancel, progress]
example: init
file_name:
type: string
example: "document.pdf"
file_type:
type: string
enum: [IMAGE, DOCUMENT, AUDIO]
extension:
type: string
convert_to:
type: string
file_size:
type: integer
format: int64
upload_id:
type: string
format: uuid
InitFileResponse:
type: object
properties:
upload_id:
type: string
format: uuid
file_name:
type: string
total_chunks:
type: integer
chunk_size:
type: integer
status:
type: string
ChunkUploadResponse:
type: object
properties:
upload_id:
type: string
format: uuid
chunk_number:
type: integer
chunk_size:
type: integer
format: int64
file_id:
type: string
message:
type: string
UploadProgressResponse:
type: object
properties:
upload_id:
type: string
format: uuid
file_name:
type: string
total_chunks:
type: integer
uploaded_chunks:
type: integer
status:
type: string
progress_percentage:
type: number
format: float
file_path:
type: string
remaining_chunks:
type: integer
CompleteUploadResponse:
type: object
properties:
upload_id:
type: string
format: uuid
status:
type: string
uploaded_chunks:
type: integer
total_chunks:
type: integer
message:
type: string
file_path:
type: string
ChunkStatusResponse:
type: object
properties:
upload_id:
type: string
format: uuid
total_chunks:
type: integer
uploaded_chunks:
type: integer
missing_chunks:
type: integer
chunk_status:
type: object
additionalProperties:
type: boolean
FileTypesResponse:
type: object
properties:
file_types:
type: array
items:
type: string
count:
type: integer
FileExtensionResponse:
type: object
properties:
extension:
type: array
items:
type: string
count:
type: integer
max_file_size:
type: integer
format: int64
CanceledUploadResponse:
type: object
properties:
upload_id:
type: string
format: uuid
message:
type: string
ActionResponse:
type: object
properties:
action:
type: string
available_actions:
type: array
items:
type: string
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: JWT токен для авторизации
security:
- BearerAuth: []