Archived
1
0
This repository has been archived on 2025-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
Files
app/assets/API.md

284 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# p1ctos4ve - контракты API
## Better Auth
API использует фреймворк [Better Auth](https://better-auth.com) для управления пользователями и сессиями.
Для работы с авторизацией необходимо использовать [клиентскую библиотеку](https://www.better-auth.com/docs/concepts/client) Better Auth, прямой вызов методов авторизации из клиентов не предусматривается.
### `POST /auth/api/sign-up/email`
Регистрация нового пользователя с почтой и паролем.
**Параметры запроса:**
```json
{
"name": "string",
"email": "string",
"password": "string",
"image": "string (опционально)",
"callbackURL": "string (опционально)",
"rememberMe": "boolean (опционально, по умолчанию true)"
}
```
**Ответ (200):**
```json
{
"token": "string | null",
"user": {
"id": "string",
"email": "string",
"name": "string",
"image": "string | null",
"emailVerified": "boolean",
"createdAt": "string (date-time)",
"updatedAt": "string (date-time)"
}
}
```
### `POST /auth/api/sign-in/email`
Вход с использованием почты и пароля.
**Параметры запроса:**
```json
{
"email": "string",
"password": "string",
"callbackURL": "string (опционально)",
"rememberMe": "string (опционально)"
}
```
**Ответ (200):**
```json
{
"redirect": false,
"token": "string",
"url": null,
"user": {
"id": "string",
"email": "string",
"name": "string | null",
"image": "string | null",
"emailVerified": "boolean",
"createdAt": "string (date-time)",
"updatedAt": "string (date-time)"
}
}
```
### `POST /auth/api/sign-out`
Выход из системы и завершение текущей сессии.
**Ответ (200):**
```json
{
"success": "boolean"
}
```
## Сейвы
API для работы с сохраненными медиафайлами (видео, фото). Каждый сейв имеет настройку видимости, определяющую режим доступа.
### Режимы видимости сейва
- `public` - сейв доступен всем пользователям, отображается в публичных списках и профиле владельца
- `link` - сейв доступен только по прямой ссылке (shareUrl), не отображается в публичных списках. Владелец всегда видит его в своих списках
### `GET /saves/my`
Возвращает все сейвы текущего пользователя независимо от режима видимости.
**Аутентификация:** Опциональна
**Ответ (200):**
```json
[
{
"id": "number",
"name": "string",
"type": "string",
"description": "string",
"tags": ["string"],
"visibility": "public" | "link",
"shareUrl": "string (только для visibility: link)",
"createdAt": "string (date-time)",
"updatedAt": "string (date-time)"
}
]
```
### `GET /saves/u/{slug}`
Возвращает **только публичные сейвы** (visibility: public) конкретного пользователя по его никнейму (slug). Сейвы с видимостью "link" не включаются в этот список, даже если запрашивает владелец.
**Параметры пути:**
- `slug` (string, обязательный) - никнейм пользователя
**Аутентификация:** Опциональна
**Ответ (200):**
```json
[
{
"id": "number",
"name": "string",
"type": "string",
"description": "string",
"tags": ["string"],
"visibility": "public",
"createdAt": "string (date-time)",
"updatedAt": "string (date-time)"
}
]
```
### `GET /saves/{id}`
Возвращает информацию о конкретном сейве.
**Параметры пути:**
- `id` (number/string, обязательный) - ID сейва
**Аутентификация:** Опциональна
**Правила доступа:**
- **Владелец:** полный доступ ко всем сейвам (public и link)
- **Другие пользователи:**
- **public сейвы:** доступны всем
- **link сейвы:** доступны только при обращении по корректной shareUrl; запрос по голому ID вернет `404 Not Found`
**Ответ (200):**
```json
{
"id": "number",
"name": "string",
"type": "string",
"description": "string",
"tags": ["string"],
"visibility": "public" | "link",
"shareUrl": "string (только для visibility: link)",
"userId": "string",
"createdAt": "string (date-time)",
"updatedAt": "string (date-time)"
}
```
**Коды ошибок:**
- `404 Not Found` - сейв не найден или недоступен (для link сейвов без shareUrl)
- `403 Forbidden` - нет прав доступа
### `DELETE /saves/{id}`
Удаляет сейв по его ID. Доступно только владельцу.
**Параметры пути:**
- `id` (number/string, обязательный) - ID сейва
**Аутентификация:** Обязательна
**Ответ (200):**
```json
{
"success": true,
"message": "Сейв успешно удален"
}
```
### `PATCH /saves/{id}`
Обновляет метаданные сейва (название, описание, теги, видимость). Доступно только владельцу.
**Параметры пути:**
- `id` (number/string, обязательный) - ID сейва
**Параметры запроса:**
```json
{
"name": "string (опционально)",
"description": "string (опционально)",
"tags": ["string"] (опционально),
"visibility": "public" | "link" (опционально)
}
```
**Аутентификация:** Обязательна
**Content-Type:** `application/json`, `application/x-www-form-urlencoded`, или `multipart/form-data`
**Ответ (200):**
```json
{
"id": "number",
"name": "string",
"type": "string",
"description": "string",
"tags": ["string"],
"visibility": "public" | "link",
"shareUrl": "string (если visibility: link)",
"updatedAt": "string (date-time)"
}
```
**Примечание:** При установке `visibility: "link"` сервер автоматически генерирует или возвращает существующую `shareUrl`. При смене на `visibility: "public"` поле `shareUrl` становится неактуальным.
### `POST /saves/external`
Скачивает и сохраняет медиафайл по URL из стороннего источника.
**Параметры запроса:**
```json
{
"url": "string (URI, обязательный)",
"name": "string (опционально)",
"description": "string (опционально)",
"tags": ["string"] (опционально),
"visibility": "public" | "link" (опционально, по умолчанию: link)"
}
```
**Аутентификация:** Обязательна
**Content-Type:** `application/json`, `application/x-www-form-urlencoded`, или `multipart/form-data`
**Ответ (200):**
```json
{
"id": "number",
"name": "string",
"type": "string",
"url": "string",
"visibility": "public" | "link",
"shareUrl": "string (если visibility: link)",
"createdAt": "string (date-time)"
}
```
Если `visibility` не указана, по умолчанию устанавливается `link`.
### `POST /saves/upload`
Загружает медиафайл с устройства.
**Параметры запроса (multipart/form-data):**
- `file` (`binary`, обязательный) - файл для загрузки
- `name` (`string`, опционально) - название сейва
- `description` (`string`, опционально) - описание сейва
- `tags` (`array[string]`, опционально) - теги
- `visibility` (`"public" | "link"`, опционально, по умолчанию: "link") - режим видимости
**Аутентификация:** Обязательна
**Content-Type:** `multipart/form-data`
**Ответ (200):**
```json
{
"id": "number",
"name": "string",
"type": "string",
"url": "string",
"visibility": "public" | "link",
"shareUrl": "string (если visibility: link)",
"createdAt": "string (date-time)"
}
```
Если `visibility` не указана, по умолчанию устанавливается `link`.