added readme

This commit is contained in:
Mephimeow
2026-06-13 18:38:20 +00:00
committed by zero@thinky
parent 57ce3dea5f
commit 35ddfc938c
2 changed files with 155 additions and 2 deletions
+154 -1
View File
@@ -1,2 +1,155 @@
# Control-plane # Control-plane API
## Аутентификация
### POST /api/auth/register
```json
{
"username": "john",
"email": "john@example.com",
"password": "Secret123"
}
```
| Поле | Описание |
|------|----------|
| `username` | 330 символов |
| `email` | Валидный email |
| `password` | От 8 символов, заглавная + строчная + цифра |
`201``{ "token": "...", "refresh_token": "...", "user": { "id": "...", "username": "...", "email": "...", "created_at": "..." } }`
`400` — ошибка валидации
`409` — email уже занят
### POST /api/auth/login
```json
{ "email": "john@example.com", "password": "Secret123" }
```
`200``{ "token": "...", "refresh_token": "...", "user": { ... } }`
`401` — неверный email или пароль
`429` — превышен лимит (10 попыток/мин с IP)
### POST /api/auth/refresh
Обновить токены. Старый refresh_token удаляется, выдаётся новая пара.
```json
{ "refresh_token": "..." }
```
`200``{ "token": "...", "refresh_token": "...", "user": { ... } }`
`401` — токен невалиден или умер
### POST /api/auth/logout
Удалить refresh_token из БД.
```json
{ "refresh_token": "..." }
```
`200``{ "message": "logged out successfully" }`
---
## Защищённые (требуют Bearer-токен)
Заголовок: `Authorization: Bearer <access_token>`
### GET /api/auth/me
Профиль текущего пользователя.
`200``{ "user": { "id": "...", "username": "...", "email": "...", "created_at": "..." } }`
### PUT /api/auth/me
Обновить username.
```json
{ "username": "john_updated" }
```
`200``{ "user": { "id": "...", "username": "john_updated", ... } }`
### PUT /api/auth/password
Сменить пароль. Старый пароль обязателен для подтверждения.
```json
{ "old_password": "Secret123", "new_password": "NewSecret456!" }
```
`200``{ "message": "password changed successfully" }`
`400` — неверный старый пароль, слабый новый или совпадают
---
## Организации (все Bearer)
### POST /api/organizations
```json
{ "name": "My Corp", "slug": "my-corp" }
```
`201``{ "organization": { "id": "...", "name": "My Corp", "slug": "my-corp", "created_at": "...", "updated_at": "..." } }`
`409` — slug уже занят
### GET /api/organizations
`200``{ "organizations": [...], "total": 1 }`
### GET /api/organizations/:id
`200``{ "organization": { ... } }`
`404` — не найдена
### PUT /api/organizations/:id
```json
{ "name": "Updated Corp" }
```
`200``{ "organization": { ... } }`
### DELETE /api/organizations/:id
`200``{ "message": "organization deleted" }`
---
## Формат JWT
```json
{
"user_id": "uuid",
"email": "john@example.com",
"sub": "uuid",
"exp": 1718000000,
"iat": 1717913600
}
```
- `user_id` / `sub` — UUID пользователя
- `exp` — timestamp истечения (24ч)
- `iat` — timestamp выпуска
## Ошибки
```json
{ "error": "описание" }
```
| Статус | Описание |
|--------|----------|
| 400 | Ошибка валидации |
| 401 | Неверные данные, токен протух или невалиден |
| 404 | Пользователь или организация не найдены |
| 409 | Email или slug уже заняты |
| 429 | Превышен лимит попыток логина |
| 500 | Внутренняя ошибка |
+1 -1
View File
@@ -226,7 +226,7 @@ func (h *Handler) ChangePassword(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "password changed successfully"}) c.JSON(http.StatusOK, gin.H{"message": "password changed successfully"})
} }
// @Summary Update profile // @Summary Update epta profile
// @Description Update current user's username // @Description Update current user's username
// @Tags auth // @Tags auth
// @Accept json // @Accept json