Skip to content

Commit b0cf7c6

Browse files
committed
api update (v1.0)
1 parent bdcecd5 commit b0cf7c6

10 files changed

Lines changed: 323 additions & 19 deletions

File tree

docs/api/auth.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: Auth
44
---
55

66
# 1. Auth
7-
**v0 — System Token Only**
7+
**v1 — System Token Only**
88

99
Для **MVP** авторизации используется **один тип токена** — системный `access_token` с полным доступом ко всему API. Пользовательских аккаунтов и ролей нет.
1010

docs/api/cameras.mdx

Lines changed: 151 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,15 @@ sidebar_position: 2
33
title: Cameras
44
---
55

6+
import HighlightParam from '@site/src/components/HighlightParam';
7+
import HighlightBlock from '@site/src/components/HighlightBlock';
8+
import JSONHighlight from '@site/src/components/JSONHighlight';
9+
610
# 2. Cameras
711

12+
Для работы с камерами обязательно использование [токена авторизации](/docs/api/auth), если в документации конкретного
13+
эндпоинта не указано иное.
14+
815
### 2.1 `GET /cameras`
916

1017
Возвращает список всех зарегистрированных камер.
@@ -26,6 +33,10 @@ title: Cameras
2633
**Модель Camera**
2734
- **camera_id** (`integer`) — уникальный идентификатор камеры.
2835
- **title** (`string`) — человекочитаемое описание камеры (адрес/куда смотрит).
36+
- <HighlightParam>**source** (`string`) — URL с видеопотоком камеры (напр. `.m3u8`) или строка для подключения (`rtsp://...`)</HighlightParam>
37+
- <HighlightParam>**image_width** (`integer`) — ширина изображения видеопотока в пикселях (напр., `1920`)</HighlightParam>
38+
- <HighlightParam>**image_height** (`integer`) — высота изображения видеопотока в пикселях (напр., `1080`)</HighlightParam>
39+
- <HighlightParam>**calib** (`json`) — вложенный json-объект с информацией о калибровке и вытягивании изображения с камеры. Сохраняется в одну ячейку таблицы БД. Может быть `null`.</HighlightParam>
2940
- **latitude** (`float`, `-90..90`) — широта камеры.
3041
- **longitude** (`float`, `-180..180`) — долгота камеры.
3142
- **created_at** (`string`, ISO 8601) — дата создания.
@@ -39,11 +50,22 @@ Authorization: Bearer <token>
3950
```
4051

4152
**Пример ответа (массив)**
42-
```json
53+
<JSONHighlight data={
4354
[
4455
{
4556
"camera_id": 1,
4657
"title": "Кронверкский просп., парковка напротив ИТМО",
58+
"source": "rtsp://...",
59+
"image_width": 1920,
60+
"image_height": 1080,
61+
"calib": {
62+
"image_width": 1920, "image_height": 1080,
63+
"K": [[1739.237279181759, 0.0, 947.5335576199107],
64+
[0.0, 2244.705015334057, 564.6946579168148],
65+
[0.0, 0.0, 1.0]],
66+
"D": [-0.37062084436192333, 0.05057465862770827, 0.033198096980616335, 0.012812747166936252],
67+
"balance": 0.0, "model": "opencv_fisheye_k1k2k3k4"
68+
},
4769
"latitude": 59.955976,
4870
"longitude": 30.309426,
4971
"created_at": "2025-10-08T09:12:00Z",
@@ -52,13 +74,17 @@ Authorization: Bearer <token>
5274
{
5375
"camera_id": 2,
5476
"title": "Ломоносова, 9 — двор",
77+
"source": "https://... .m3u8",
78+
"image_width": 1920,
79+
"image_height": 1080,
80+
"calib": null,
5581
"latitude": 59.927366,
5682
"longitude": 30.338487,
5783
"created_at": "2025-10-08T09:15:00Z",
5884
"updated_at": "2025-10-08T09:15:00Z"
5985
}
60-
]
61-
```
86+
]}
87+
highlight={["source", "image_width", "image_height", "calib"]}/>
6288

6389
**Ошибки** (в дополнение к [общим](/docs/api/#общие-ошибки))
6490

@@ -74,6 +100,10 @@ Authorization: Bearer <token>
74100

75101
**Request body (required)**
76102
- **title** (`string`, 1..200) — описание камеры (по какому адресу она находится и куда направлена).
103+
- <HighlightParam>**source** (`string`) — URL с видеопотоком камеры (напр. `.m3u8`) или строка для подключения (`rtsp://...`)</HighlightParam>
104+
- <HighlightParam>**image_width"** (`integer`) — ширина изображения видеопотока в пикселях (напр., `1920`)</HighlightParam>
105+
- <HighlightParam>**image_height** (`integer`) — высота изображения видеопотока в пикселях (напр., `1080`)</HighlightParam>
106+
- <HighlightParam>**calib** (`json`) — вложенный json-объект с информацией о калибровке и вытягивании изображения с камеры. Сохраняется в одну ячейку таблицы БД. Может быть `null`.</HighlightParam>
77107
- **latitude** (`float`, `-90..90`) — широта камеры.
78108
- **longitude** (`float`, `-180..180`) — долгота камеры.
79109

@@ -89,12 +119,17 @@ POST /api/v0/cameras/new HTTP/1.1
89119
Host: api.parktrack.live
90120
Content-Type: application/json
91121
Authorization: Bearer <token>
92-
122+
```
123+
<JSONHighlight data={
93124
{
94125
"title": "Кронверкский просп., парковка напротив ИТМО",
126+
"source": "https://... .m3u8",
127+
"image_width": 1920,
128+
"image_height": 1080,
129+
"calib": null,
95130
"latitude": 59.955976,
96131
"longitude": 30.309426
97-
}
132+
}} highlight={["source", "image_width", "image_height", "calib"]}/>
98133
```
99134
100135
**Пример ответа (201)**
@@ -178,6 +213,10 @@ Content-Type: application/json
178213
**Response (200)** — объект **Camera**
179214
- **camera_id** (`integer`) — уникальный идентификатор камеры.
180215
- **title** (`string`) — человекочитаемое описание камеры (адрес/куда смотрит).
216+
- <HighlightParam>**source** (`string`) — URL с видеопотоком камеры (напр. `.m3u8`) или строка для подключения (`rtsp://...`)</HighlightParam>
217+
- <HighlightParam>**image_width"** (`integer`) — ширина изображения видеопотока в пикселях (напр., `1920`)</HighlightParam>
218+
- <HighlightParam>**image_height** (`integer`) — высота изображения видеопотока в пикселях (напр., `1080`)</HighlightParam>
219+
- <HighlightParam>**calib** (`json`) — вложенный json-объект с информацией о калибровке и вытягивании изображения с камеры. Сохраняется в одну ячейку таблицы БД. Может быть `null`.</HighlightParam>
181220
- **latitude** (`float`, `-90..90`) — широта камеры.
182221
- **longitude** (`float`, `-180..180`) — долгота камеры.
183222
- **created_at** (`string`, ISO 8601) — дата создания.
@@ -191,16 +230,19 @@ Authorization: Bearer <token>
191230
```
192231

193232
**Пример ответа (200)**
194-
```json
233+
<JSONHighlight data={
195234
{
196235
"camera_id": 1,
197236
"title": "Кронверкский просп., парковка напротив ИТМО",
237+
"source": "https://... .m3u8",
238+
"image_width": 1920,
239+
"image_height": 1080,
240+
"calib": null,
198241
"latitude": 59.955976,
199242
"longitude": 30.309426,
200243
"created_at": "2025-10-08T08:00:00Z",
201244
"updated_at": "2025-10-08T08:10:00Z"
202-
}
203-
```
245+
}} highlight={["source", "image_width", "image_height", "calib"]}/>
204246

205247
**Ошибки** (в дополнение к [общим](/docs/api/#общие-ошибки))
206248
| Код | Тип | Описание |
@@ -223,6 +265,10 @@ Authorization: Bearer <token>
223265

224266
**Request body** *(любые из полей ниже; минимум одно поле)*
225267
- **title** (`string`, 1..200) — описание камеры.
268+
- <HighlightParam>**source** (`string`) — URL с видеопотоком камеры (напр. `.m3u8`) или строка для подключения (`rtsp://...`)</HighlightParam>
269+
- <HighlightParam>**image_width"** (`integer`) — ширина изображения видеопотока в пикселях (напр., `1920`)</HighlightParam>
270+
- <HighlightParam>**image_height** (`integer`) — высота изображения видеопотока в пикселях (напр., `1080`)</HighlightParam>
271+
- <HighlightParam>**calib** (`json`) — вложенный json-объект с информацией о калибровке и вытягивании изображения с камеры. Сохраняется в одну ячейку таблицы БД. Может быть `null`.</HighlightParam>
226272
- **latitude** (`float`, `-90..90`) — широта камеры.
227273
- **longitude** (`float`, `-180..180`) — долгота камеры.
228274

@@ -231,6 +277,10 @@ Authorization: Bearer <token>
231277
**Response (200)** — объект **Camera** (актуальное состояние после обновления)
232278
- **camera_id** (`integer`)
233279
- **title** (`string`)
280+
- <HighlightParam>**source** (`string`)</HighlightParam>
281+
- <HighlightParam>**image_width"** (`integer`)</HighlightParam>
282+
- <HighlightParam>**image_height** (`integer`)</HighlightParam>
283+
- <HighlightParam>**calib** (`json`)</HighlightParam>
234284
- **latitude** (`float`)
235285
- **longitude** (`float`)
236286
- **created_at** (`string`, ISO 8601)
@@ -312,10 +362,99 @@ Authorization: Bearer <token>
312362

313363
**Ошибки**
314364

365+
| Код | Тип | Описание |
366+
|---------|-------------|--------------------------------------------------------------------------------|
367+
| **404** | `Not Found` | Камера с указанным `camera_id` не найдена. |
368+
| **409** | `Conflict` | Удаление невозможно из-за зависимостей (есть парковочные зоны с этой камерой). |
369+
370+
**Пример ответа (404)**
371+
```json
372+
{
373+
"error_description": "Camera not found"
374+
}
375+
```
376+
377+
---
378+
379+
<HighlightBlock>
380+
381+
### 2.6 `GET /cameras/next`
382+
383+
Возвращает следующую камеру для очередной детекции автомобилей.
384+
385+
_Примеры:_
386+
1. Если в прошлый раз этот эндпоинт вернул камеру с id=1, то вернуться должна камера с id=2;
387+
2. Если всего камер 3 и последний раз возвращалась камера с id=3, то вернуться должна камера с id=1.
388+
389+
**Headers**
390+
- `Authorization: Bearer <token>`
391+
392+
**Пример запроса**
393+
```http
394+
GET /api/v0/cameras/next HTTP/1.1
395+
Host: api.parktrack.live
396+
Authorization: Bearer <token>
397+
```
398+
399+
**Пример ответа 1 (200)**
400+
```json
401+
{
402+
"camera_id": 1,
403+
"source": "https://<path>.m3u8",
404+
"image_width": 1920,
405+
"image_height": 1080,
406+
"calib": "https://<path_to_calib>.json"
407+
}
408+
```
409+
410+
**Пример ответа 2 (200)**
411+
```json
412+
{
413+
"camera_id": 1,
414+
"source": "https://<path>.m3u8",
415+
"image_width": 1920,
416+
"image_height": 1080,
417+
"calib": null
418+
}
419+
```
420+
421+
**Ошибки**
422+
423+
| Код | Тип | Описание |
424+
|---------|--------------------------|--------------------------------------------------------------------------|
425+
| **404** | `Not Found` | Не добавлено ни одной камеры |
426+
427+
**Пример ответа (404)**
428+
```json
429+
{
430+
"error_description": "No cameras added"
431+
}
432+
```
433+
434+
### 2.7 `GET /cameras/<camera_id>/snapshot`
435+
436+
Возвращает кадр из видеопотока камеры (изображение, захваченное из `source` камеры).
437+
438+
**Headers**
439+
- `Authorization: Bearer <token>`
440+
441+
**Пример запроса**
442+
```http
443+
GET /cameras/1/snapshot
444+
Host: api.parktrack.live
445+
Authorization: Bearer <token>
446+
```
447+
448+
**Пример ответа (200)**
449+
```
450+
<изображение>
451+
```
452+
453+
**Ошибки**
454+
315455
| Код | Тип | Описание |
316456
|---------|--------------------------|--------------------------------------------------------------------------|
317-
| **404** | `Not Found` | Камера с указанным `camera_id` не найдена. |
318-
| **409** | `Conflict` | Удаление невозможно из-за зависимостей (если каскадное удаление запрещено). |
457+
| **404** | `Not Found` | Такой камеры нет |
319458

320459
**Пример ответа (404)**
321460
```json
@@ -325,3 +464,5 @@ Authorization: Bearer <token>
325464
```
326465

327466
---
467+
468+
</HighlightBlock>

docs/api/index.mdx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,25 @@ sidebar_position: 2
33
title: API
44
---
55

6-
# General API (v0.0)
6+
import HighlightParam from '@site/src/components/HighlightParam';
77

8+
# General API (v1.0)
89

910
**Base address:**
10-
`https://api.parktrack.live/api/v0`
11+
<HighlightParam>`https://api.parktrack.live`</HighlightParam>
12+
13+
:::warning Обновление API
14+
17 ноября документация `Cameras`, `Parking Zones` была обновлена, все изменения выделены жёлтым цветом.
15+
:::
1116

1217
## Swagger версия
1318

1419
Документация API также доступна в Swagger. Там можно будет поиграться с API и вручную поотправлять запросы, когда API сервер будет готов.
1520

1621
[Открыть документацию в Swagger](https://swagger.parktrack.live)
1722

18-
:::warning Предупреждение
19-
OpenAPI для Swagger был написан ChatGPT по документации на этом сайте, он почти не проверялся вручную и может содержать неточности или ошибки.
23+
:::info Предупреждение
24+
Swagger может содержать неточности или ошибки, приоритетной считать документацию на этом сайте.
2025
:::
2126

2227
## Общие ошибки

docs/api/parking_zones.mdx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ sidebar_position: 3
33
title: Parking Zones
44
---
55

6+
import HighlightParam from '@site/src/components/HighlightParam';
7+
68
# 3. Parking Zones
79

810
## Модель `Zone`
@@ -28,13 +30,16 @@ title: Parking Zones
2830
2931
---
3032

31-
### 3.1 `GET /zones`
33+
### 3.1 `GET /zones` (Auth, NoAuth)
3234

33-
Возвращает список всех парковочных зон.
35+
Возвращает список всех парковочных зон <HighlightParam>(авторизация не обязательна)</HighlightParam>.
3436

3537
**Headers**
3638
- `Authorization: Bearer <token>`
3739

40+
<HighlightParam>В случае отсутствия токена авторизации возвращаются все поля кроме `camera_id`.</HighlightParam>
41+
42+
3843
**Query-параметры (необязательные)**
3944
- **camera_id** (`integer`) — вернуть зоны только указанной камеры.
4045
- **min_free_count** (`integer`) — фильтр по минимальному количеству свободных мест в зоне.
@@ -147,16 +152,18 @@ Authorization: Bearer <token>
147152

148153
---
149154

150-
### 3.3 `GET /zones/<zone_id>`
155+
### 3.3 `GET /zones/<zone_id>` (Auth, NoAuth)
151156

152-
Возвращает данные о конкретной парковочной зоне.
157+
Возвращает данные о конкретной парковочной зоне <HighlightParam>(авторизация не обязательна).</HighlightParam>
153158

154159
**Path-параметры**
155160
- **zone_id** (`integer`, required)
156161

157162
**Headers**
158163
- `Authorization: Bearer <token>`
159164

165+
<HighlightParam>В случае отсутствия токена авторизации возвращаются все поля кроме `camera_id`.</HighlightParam>
166+
160167
**Response (200)** — объект **Zone**
161168
```json
162169
{
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react';
2+
import {useColorMode} from '@docusaurus/theme-common';
3+
import styles from './styles.module.css';
4+
5+
export default function HighlightBlock({children}) {
6+
const {colorMode} = useColorMode();
7+
8+
return (
9+
<div
10+
className={
11+
colorMode === 'dark'
12+
? styles.dark
13+
: styles.light
14+
}
15+
>
16+
{children}
17+
</div>
18+
);
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.light {
2+
background: #fff3a0; /* жёлтый фон */
3+
padding: 16px;
4+
border-radius: 8px;
5+
}
6+
7+
.dark {
8+
color: #ffe36b; /* жёлтый текст */
9+
background: transparent; /* без подложки */
10+
padding: 16px;
11+
border-radius: 8px;
12+
}

0 commit comments

Comments
 (0)