Пояснительная записка для API «Птицы юга Восточной Сибири»


Описание API

1. Общие сведения

В ходе изучения предметной области были выделены следующие сущности:

  1.  «user_roles»
    
  2.  «users»
    
  3.  «species_population_statuses»
    
  4.  «species_statuses»
    
  5.  «bird_orders»
    
  6.  «bird_families»
    
  7.  «bird_genera»
    
  8.  «bird_species»
    
  9.  «bird_detections»
    

2. Структура БД «Птицы юга Восточной Сибири»

Описание структуры БД

# Сущность Атрибуты
1 user_roles id, created_at, updated_at, title
2 users id, name, email, email_verified_at, password, creator_id, user_role_id, remember_token, created_at, updated_at
3 species_statuses id, created_at, updated_at, title, description
4 species_population_statuses id, created_at, updated_at, title, description
5 bird_orders id, created_at, updated_at, title, title_latin, description
6 bird_families id, created_at, updated_at, title, title_latin, description, bird_order_id
7 bird_genera id, created_at, updated_at, title, title_latin, description, bird_family_id
8 bird_species id, created_at, updated_at, title, title_latin, description, distribution, migration, habitat, bird_genus_id, species_population_status_id
9 bird_detections id, created_at, updated_at, agent_id, bird_species_id, latitude, longitude, detection_datetime, comment, confirmed

3. Структура БД

1. Сущность «user_roles»

Хранит информацию о ролях пользователей

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название роли (уникальное)

2. Сущность «users»

Таблица «users» представляет собой таблицу данных, которая используется для хранения информации о пользователях

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 name VARCHAR(255) Имя пользователя
3 email VARCHAR(255) Электронная почта (уникальная)
4 email_verified_at TIMESTAMP Время подтверждения почты (может быть null)
5 password VARCHAR(255) Пароль пользователя
6 creator_id BIGINT (FK) Внешний ключ на таблицу users (создатель пользователя)
7 user_role_id BIGINT (FK) Внешний ключ на таблицу user_roles
8 remember_token VARCHAR(100) Токен для запоминания сессии
9 created_at TIMESTAMP Время создания записи
10 updated_at TIMESTAMP Время последнего обновления записи

3. Сущность «species_statuses»

Таблица «species_statuses» представляет собой таблицу данных, которая используется для хранения информации о статусах видов птиц

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название статуса (уникальное)
5 description TEXT Описание статуса (может быть null)

4. Сущность «species_population_statuses»

Таблица «species_population_statuses» представляет собой таблицу данных, которая используется для хранения информации статусах популяции видов птиц

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название статуса популяции вида (уникальное)
5 description TEXT Описание статуса популяции вида (может быть null)

5. Сущность «bird_orders»

Таблица «bird_orders» представляет собой таблицу данных, которая используется для хранения информации об отрядах птиц

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название отряда (уникальное)
5 title_latin VARCHAR(255) Латинское название отряда (уникальное)
6 description TEXT Описание отряда (может быть null)

6. Сущность «bird_families»

Таблица «bird_families» представляет собой таблицу данных, которая используется для хранения информации о семействах птиц

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название семейства (уникальное)
5 title_latin VARCHAR(255) Латинское название семейства (уникальное)
6 description TEXT Описание семейства (может быть null)
7 bird_order_id BIGINT (FK) Внешний ключ на таблицу bird_orders

7. Сущность «bird_genera»

Таблица «bird_genera» представляет собой таблицу данных, которая используется для хранения информации о родах птиц

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название рода (уникальное)
5 title_latin VARCHAR(255) Латинское название рода (уникальное)
6 description TEXT Описание рода (может быть null)
7 bird_family_id BIGINT (FK) Внешний ключ на таблицу bird_families

8. Сущность «bird_species»

Таблица «bird_species» представляет собой таблицу данных, которая используется для хранения информации о видах птиц

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 title VARCHAR(255) Название вида (уникальное)
5 title_latin VARCHAR(255) Латинское название вида (уникальное)
6 description TEXT Описание вида (может быть null)
7 distribution TEXT Распространение вида (может быть null)
8 migration TEXT Миграция вида (может быть null)
9 habitat TEXT Среда обитания вида (может быть null)
10 bird_genus_id BIGINT (FK) Внешний ключ на таблицу bird_genera
11 species_population_status_id BIGINT (FK) Внешний ключ на таблицу species_population_statuses (может быть null)

9. Сущность «bird_detections»

Таблица «bird_detections» представляет собой таблицу данных, которая используется для хранения информации о зафиксированных птицах

Атрибут Тип Описание
1 id BIGINT (PK) Первичный ключ
2 created_at TIMESTAMP Время создания записи
3 updated_at TIMESTAMP Время последнего обновления записи
4 agent_id BIGINT (FK) Внешний ключ на таблицу users (агент, обнаруживший птицу)
5 bird_species_id BIGINT (FK) Внешний ключ на таблицу bird_species (вид птицы)
6 latitude DECIMAL(8, 6) Широта места обнаружения
7 longitude DECIMAL(9, 6) Долгота места обнаружения
8 detection_datetime DATETIME Дата и время обнаружения
9 comment TEXT Комментарий (может быть null)
10 confirmed BOOLEAN Подтверждение обнаружения (по умолчанию false)

10. Таблица «bird_species_species_status»

Таблица «bird_species_species_status» представляет собой таблицу пересечений, которая отображает связь «многие ко многим» сущности «bird_species» с сущностью «species_statuses»

Атрибут Тип Описание
1 created_at TIMESTAMP Время создания записи
2 updated_at TIMESTAMP Время последнего обновления записи
3 bird_species_id BIGINT (FK, PK) Внешний ключ на таблицу bird_species
4 species_status_id BIGINT (FK, PK) Внешний ключ на таблицу species_statuses

4. Выполнение запросов

Коды запросов

# Код Описание
1 200 Запрос выполнен успешно, данные получены
2 201 Запрос выполнен успешно, запись создана
3 401 Запрос не выполнен, ошибка авторизации
3 403 Запрос не выполнен, запрет на выполнение операции
4 404 Запрос не выполнен, запись не удалось найти
5 422 Запрос не выполнен, данные не прошли валидацию

Описание точек доступа

URL Тип запроса Входные данные Описание
1 /login GET JSON (логин, пароль) Получение токена аутентификации.
2 /bird-detections/add POST JSON (данные) Добавление нового обнаружения птицы (требуется аутентификация).
3 /bird-detections GET Нет Получение всех обнаружений птиц.
4 /bird-detections/{id} GET bigint id Получение информации о конкретном обнаружении птицы.
5 /bird-detections/edit/{id} PUT JSON (данные) Обновление информации о конкретном обнаружении птицы (требуется аутентификация).
6 /bird-detections/delete/{id} DELETE bigint id Удаление конкретного обнаружения птицы (требуется аутентификация).
7 /bird-families/add POST JSON (данные) Добавление нового семейства птиц (требуется аутентификация).
8 /bird-families GET Нет Получение всех семейств птиц.
9 /bird-families/{id} GET bigint id Получение информации о конкретном семействе птиц.
10 /bird-families/edit/{id} PUT JSON (данные) Обновление информации о конкретном семействе птиц (требуется аутентификация).
11 /bird-families/delete/{id} DELETE bigint id Удаление конкретного семейства птиц (требуется аутентификация).
12 /bird-genera/add POST JSON (данные) Добавление нового рода птиц (требуется аутентификация).
13 /bird-genera GET Нет Получение всех родов птиц.
14 /bird-genera/{id} GET bigint id Получение информации о конкретном роде птиц.
15 /bird-genera/edit/{id} PUT JSON (данные) Обновление информации о конкретном роде птиц (требуется аутентификация).
16 /bird-genera/delete/{id} DELETE bigint id Удаление конкретного рода птиц (требуется аутентификация).
17 /bird-orders/add POST JSON (данные) Добавление нового отряда птиц (требуется аутентификация).
18 /bird-orders GET Нет Получение всех отрядов птиц.
19 /bird-orders/{id} GET bigint id Получение информации о конкретном отряде птиц.
20 /bird-orders/edit/{id} PUT JSON (данные) Обновление информации о конкретном отряде птиц (требуется аутентификация).
21 /bird-orders/delete/{id} DELETE bigint id Удаление конкретного отряда птиц (требуется аутентификация).
22 /bird-species/add POST JSON (данные) Добавление нового вида птиц (требуется аутентификация).
23 /bird-species GET Нет Получение всех видов птиц.
24 /bird-species/{id} GET bigint id Получение информации о конкретном виде птиц.
25 /bird-species/edit/{id} PUT JSON (данные) Обновление информации о конкретном виде птиц (требуется аутентификация).
26 /bird-species/delete/{id} DELETE bigint id Удаление конкретного вида птиц (требуется аутентификация).
27 /species-population-statuses/add POST JSON (данные) Добавление нового статуса популяции (требуется аутентификация).
28 /species-population-statuses GET Нет Получение всех статусов популяции.
29 /species-population-statuses/{id} GET bigint id Получение информации о конкретном статусе популяции.
30 /species-population-statuses/edit/{id} PUT JSON (данные) Обновление информации о конкретном статусе популяции (требуется аутентификация).
31 /species-population-statuses/delete/{id} DELETE bigint id Удаление конкретного статуса популяции (требуется аутентификация).
32 /species-statuses/add POST JSON (данные) Добавление нового статуса вида (требуется аутентификация).
33 /species-statuses GET Нет Получение всех статусов видов.
34 /species-statuses/{id} GET bigint id Получение информации о конкретном статусе вида.
35 /species-statuses/edit/{id} PUT JSON (данные) Обновление информации о конкретном статусе вида (требуется аутентификация).
36 /species-statuses/delete/{id} DELETE bigint id Удаление конкретного статуса вида (требуется аутентификация).
37 /users/add POST JSON (данные) Добавление нового пользователя (требуется аутентификация).
38 /users GET Нет Получение всех пользователей (требуется аутентификация).
39 /users/{id} GET bigint id Получение информации о конкретном пользователе (требуется аутентификация).
40 /users/edit/{id} PUT JSON (данные) Обновление информации о конкретном пользователе (требуется аутентификация).
41 /users/delete/{id} DELETE bigint id Удаление конкретного пользователя (требуется аутентификация).
42 /user-roles/add POST JSON (данные) Добавление новой роли пользователя (требуется аутентификация).
43 /user-roles GET Нет Получение всех ролей пользователей (требуется аутентификация).
44 /user-roles/{id} GET bigint id Получение информации о конкретной роли пользователя (требуется аутентификация).
45 /user-roles/edit/{id} PUT JSON (данные) Обновление информации о конкретной роли пользователя (требуется аутентификация).
46 /user-roles/delete/{id} DELETE bigint id Удаление конкретной роли пользователя (требуется аутентификация).

1 - Получение Bearer-токена

Запрос:

GET http://siberiabirds.local/api/login HTTP/1.1

Пример тела запроса:

Accept: application/json
Content-Type: application/json

{
    "email": "[email protected]",
    "password": "qwerty123"
}

Результат выполнения запроса:

HTTP/1.1 200 OK
Date: Wed, 15 Jan 2025 18:32:33 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Successful login",
  "token": "4|52w9ueqDYXSWHPQLkgT5qAquuW5qPIO4jkIiIRa0e505e87d",
  "token_type": "Bearer"
}

2 - Создание записи в таблице «bird_species» (для создания объектов необходим токен авторизации)

2.1 - Создание записи с токеном администратора

Запрос:

POST http://siberiabirds.local/api/bird-species/add HTTP/1.1

Пример тела запроса:

Accept: application/json
Content-Type: application/json
Authorization: Bearer 4|52w9ueqDYXSWHPQLkgT5qAquuW5qPIO4jkIiIRa0e505e87d

{
    "title": "Певчий дрозд",
    "title_latin": "Turdus philomelos",
    "description": "Длина его тела — 210—250 мм, крыло — 113—122 мм, размах крыльев — 340—390 мм, масса — 55—100 г.",
    "distribution": "Европа, Малая Азия и Сибирь",
    "migration": "перелётный",
    "habitat": "Певчий дрозд заселяет различные типы лесов, и одинаково многочислен и в лиственных лесах, и в тайге.",
    "bird_genus_id": 1,
    "species_population_status_id": 2,
    "species_status_ids": [1, 2, 3]
}

Результат выполнения запроса:

HTTP/1.1 201 Created
Date: Wed, 15 Jan 2025 18:30:58 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Bird species created successfully.",
  "data": {
    "id": 12,
    "created_at": "2025-01-15T18:30:58.000000Z",
    "updated_at": "2025-01-15T18:30:58.000000Z",
    "title": "\u041f\u0435\u0432\u0447\u0438\u0439 \u0434\u0440\u043e\u0437\u0434",
    "title_latin": "Turdus philomelos",
    "description": "\u0414\u043b\u0438\u043d\u0430 \u0435\u0433\u043e \u0442\u0435\u043b\u0430 \u2014 210\u2014250 \u043c\u043c, \u043a\u0440\u044b\u043b\u043e \u2014 113\u2014122 \u043c\u043c, \u0440\u0430\u0437\u043c\u0430\u0445 \u043a\u0440\u044b\u043b\u044c\u0435\u0432 \u2014 340\u2014390 \u043c\u043c, \u043c\u0430\u0441\u0441\u0430 \u2014 55\u2014100 \u0433.",
    "distribution": "\u0415\u0432\u0440\u043e\u043f\u0430, \u041c\u0430\u043b\u0430\u044f \u0410\u0437\u0438\u044f \u0438 \u0421\u0438\u0431\u0438\u0440\u044c",
    "migration": "\u041f\u0435\u0440\u0435\u043b\u0451\u0442\u043d\u044b\u0439",
    "habitat": "\u041f\u0435\u0432\u0447\u0438\u0439 \u0434\u0440\u043e\u0437\u0434 \u0437\u0430\u0441\u0435\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043b\u0435\u0441\u043e\u0432, \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d \u0438 \u0432 \u043b\u0438\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043b\u0435\u0441\u0430\u0445, \u0438 \u0432 \u0442\u0430\u0439\u0433\u0435.",
    "bird_genus": {
      "id": 1,
      "created_at": "2025-01-15T15:55:17.000000Z",
      "updated_at": "2025-01-15T15:55:17.000000Z",
      "title": "\u0427\u0438\u0431\u0438\u0441\u044b",
      "title_latin": "Vanellus",
      "description": "\u0427\u0438\u0301\u0431\u0438\u0441\u044b, \u0438\u043b\u0438 \u043f\u0438\u0433\u0430\u043b\u0438\u0446\u044b (\u043b\u0430\u0442. Vanellus), \u2014 \u0440\u043e\u0434 \u043f\u0442\u0438\u0446 \u0438\u0437 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0440\u0436\u0430\u043d\u043a\u043e\u0432\u044b\u0445 (Charadriidae), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430. \u0427\u0438\u0431\u0438\u0441\u044b \u043e\u0431\u0438\u0442\u0430\u044e\u0442 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435: \u043d\u0430 \u0431\u0435\u0440\u0435\u0433\u0430\u0445 \u043e\u0437\u0451\u0440, \u0440\u0435\u043a \u0438 \u0432 \u0431\u043e\u043b\u043e\u0442\u0438\u0441\u0442\u044b\u0445 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044f\u0445. \u0427\u0430\u0441\u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0438 \u043d\u0430 \u0432\u043e\u0437\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0437\u0435\u043c\u043b\u044f\u0445. \u0427\u0438\u0431\u0438\u0441\u044b \u2014 \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u0438\u0435 \u043f\u0442\u0438\u0446\u044b. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u0434\u043a\u0438\u043c \u0438 \u0443\u0433\u0440\u043e\u0436\u0430\u0435\u043c\u044b\u043c \u0432\u0438\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0435\u0447\u0451\u0442\u043a\u0430, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0448\u044c 5600 \u0433\u043d\u0435\u0437\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u0430\u0440.",
      "bird_family": {
        "id": 1,
        "created_at": "2025-01-15T15:55:17.000000Z",
        "updated_at": "2025-01-15T15:55:17.000000Z",
        "title": "\u0420\u0436\u0430\u043d\u043a\u043e\u0432\u044b\u0435",
        "title_latin": "Charadriidae",
        "description": "\u0420\u0436\u0430\u0301\u043d\u043a\u043e\u0432\u044b\u0435 (\u043b\u0430\u0442. Charadriidae) \u2014 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u043f\u0442\u0438\u0446 \u0438\u0437 \u043e\u0442\u0440\u044f\u0434\u0430 \u0440\u0436\u0430\u043d\u043a\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 (Charadriiformes). \u041a \u043d\u0435\u043c\u0443 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u043d\u043e\u0433\u0438\u0435 \u0432\u0430\u0442\u0442\u043e\u0432\u044b\u0435 \u043f\u0442\u0438\u0446\u044b \u043c\u0430\u043b\u043e\u0439 \u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b, \u0436\u0438\u0432\u0443\u0449\u0438\u0435 \u043d\u0430 \u043c\u0435\u043b\u043a\u043e\u0432\u043e\u0434\u044c\u0435. \u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0440\u0436\u0430\u043d\u043a\u043e\u0432\u044b\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0435\u043d \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439, \u0443\u0442\u043e\u043b\u0449\u0451\u043d\u043d\u044b\u0439 \u043d\u0430 \u043a\u043e\u043d\u0447\u0438\u043a\u0435 \u043a\u043b\u044e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u043a\u043b\u044e\u044e\u0442 \u043f\u0438\u0449\u0443 \u0441 \u0437\u0435\u043c\u043b\u0438. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0440\u0436\u0430\u043d\u043a\u043e\u0432\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043f\u043e\u0434\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 Vanellinae.",
        "bird_order": {
          "id": 1,
          "created_at": "2025-01-15T15:55:17.000000Z",
          "updated_at": "2025-01-15T15:55:17.000000Z",
          "title": "\u0420\u0436\u0430\u043d\u043a\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435",
          "title_latin": "Charadriiformes",
          "description": "\u0420\u0436\u0430\u043d\u043a\u043e\u043e\u0431\u0440\u0430\u0301\u0437\u043d\u044b\u0435 (\u043b\u0430\u0442. Charadriiformes) \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u0442\u0440\u044f\u0434\u043e\u0432 \u0432\u043e\u0434\u043d\u044b\u0445 \u0438 \u043e\u043a\u043e\u043b\u043e\u0432\u043e\u0434\u043d\u044b\u0445 \u043f\u0442\u0438\u0446, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0441\u0451\u043c \u043c\u0438\u0440\u0435 \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u0430\u043a \u0438 \u043f\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c. \u041f\u0442\u0438\u0446\u044b \u043e\u0442 \u043c\u0435\u043b\u043a\u043e\u0433\u043e \u0434\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438\u0445 \u043c\u0430\u0441\u0441\u0430 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442 \u043e\u0442 19\u201430 \u0433 \u0443 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u043a\u0430-\u043a\u0440\u043e\u0448\u043a\u0438 (Calidris minutilla) \u0434\u043e 1,3\u20142 \u043a\u0433 \u0443 \u043c\u043e\u0440\u0441\u043a\u043e\u0439 \u0447\u0430\u0439\u043a\u0438 (Larus marinus). \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043a\u043e\u043b\u043e\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0442\u0438\u0446\u044b (\u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0442\u0438\u0440\u043a\u0443\u0448\u043a\u043e\u0432\u044b\u0435), \u0442\u0430\u043a \u0438 \u0436\u0438\u0432\u0443\u0449\u0438\u0435 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u043b\u0438\u0442-\u043e\u0442\u0448\u0435\u043b\u044c\u043d\u0438\u043a (Tringa solitaria)). \u041f\u043e\u043b\u044f\u0440\u043d\u0430\u044f \u043a\u0440\u0430\u0447\u043a\u0430 (Sterna paradisaea) \u043c\u0438\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 28 \u0442\u044b\u0441. \u043a\u043c \u043c\u0435\u0436\u0434\u0443 \u043e\u0441\u0442\u0440\u043e\u0432\u0430\u043c\u0438 \u0421\u0435\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u041b\u0435\u0434\u043e\u0432\u0438\u0442\u043e\u0433\u043e \u043e\u043a\u0435\u0430\u043d\u0430 \u0438 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435\u043c \u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u0434\u044b, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0433\u043e\u0440\u043d\u044b\u0439 \u0434\u0443\u043f\u0435\u043b\u044c (Gallinago solitaria) \u0436\u0438\u0432\u0451\u0442 \u043e\u0441\u0435\u0434\u043b\u043e."
        }
      }
    },
    "species_population_status": {
      "id": 2,
      "created_at": "2025-01-15T15:55:17.000000Z",
      "updated_at": "2025-01-15T15:55:17.000000Z",
      "title": "\u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u0438\u0439",
      "description": "\u0412\u0438\u0434 \u0431\u044b\u043b \u0432\u0441\u0442\u0440\u0435\u0447\u0435\u043d 1-5 \u0440\u0430\u0437 \u0437\u0430 \u0432\u0441\u0435 \u0433\u043e\u0434\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439."
    },
    "species_statuses": [
      {
        "id": 1,
        "created_at": "2025-01-15T15:55:17.000000Z",
        "updated_at": "2025-01-15T15:55:17.000000Z",
        "title": "\u0437\u0430\u043b\u0451\u0442\u043d\u044b\u0439",
        "description": null,
        "pivot": {
          "bird_species_id": 12,
          "species_status_id": 1,
          "created_at": "2025-01-15T18:30:58.000000Z",
          "updated_at": "2025-01-15T18:30:58.000000Z"
        }
      },
      {
        "id": 2,
        "created_at": "2025-01-15T15:55:17.000000Z",
        "updated_at": "2025-01-15T15:55:17.000000Z",
        "title": "\u0433\u043d\u0435\u0437\u0434\u044f\u0449\u0438\u0439\u0441\u044f",
        "description": null,
        "pivot": {
          "bird_species_id": 12,
          "species_status_id": 2,
          "created_at": "2025-01-15T18:30:58.000000Z",
          "updated_at": "2025-01-15T18:30:58.000000Z"
        }
      },
      {
        "id": 3,
        "created_at": "2025-01-15T15:55:17.000000Z",
        "updated_at": "2025-01-15T15:55:17.000000Z",
        "title": "\u0440\u0435\u0434\u043a\u0438\u0439",
        "description": null,
        "pivot": {
          "bird_species_id": 12,
          "species_status_id": 3,
          "created_at": "2025-01-15T18:30:58.000000Z",
          "updated_at": "2025-01-15T18:30:58.000000Z"
        }
      }
    ]
  }
}

2.2 - Выполнение запроса без токена авторизации

Результат выполнения запроса:

HTTP/1.1 401 Unauthorized
Date: Wed, 15 Jan 2025 18:33:21 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Unauthenticated."
}

2.3 - Выполнение запроса с токеном авторизации на правах агента

Результат выполнения запроса:

HTTP/1.1 403 Forbidden
Date: Wed, 15 Jan 2025 18:33:54 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "This action is unauthorized."
}

2.4 - Создание записи без валидных данных/отсутствие полей

Результат выполнения запроса:

HTTP/1.1 422 Unprocessable Content
Date: Wed, 15 Jan 2025 18:41:46 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "The title field is required. (and 1 more error)",
  "errors": {
    "title": [
      "The title field is required."
    ],
    "title_latin": [
      "The title latin has already been taken."
    ]
  }
}

3 - Получение записей из таблицы «user_roles» (доступ на получение имеют только администраторы и кураторы)

3.1 - Получение всех записей с токеном администратора

Запрос:

GET http://siberiabirds.local/api/user-roles HTTP/1.1

Пример тела запроса:

Accept: application/json
Authorization: Bearer 2|jPcKnPARV7NaMlt8Bn6NfGocHvg6GCf38rQy0W6Q86321ff7

Результат выполнения запроса:

HTTP/1.1 200 OK
Date: Wed, 15 Jan 2025 18:47:33 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "data": [
    {
      "id": 1,
      "created_at": "2025-01-15T15:55:17.000000Z",
      "updated_at": "2025-01-15T15:55:17.000000Z",
      "title": "admin"
    },
    {
      "id": 2,
      "created_at": "2025-01-15T15:55:17.000000Z",
      "updated_at": "2025-01-15T15:55:17.000000Z",
      "title": "tutor"
    },
    {
      "id": 3,
      "created_at": "2025-01-15T15:55:17.000000Z",
      "updated_at": "2025-01-15T15:55:17.000000Z",
      "title": "agent"
    },
    {
      "id": 4,
      "created_at": "2025-01-15T18:08:54.000000Z",
      "updated_at": "2025-01-15T18:08:54.000000Z",
      "title": "test role"
    }
  ]
}

3.2 - Получение записи по id с токеном администратора

Запрос:

GET http://siberiabirds.local/api/user-roles/1 HTTP/1.1

Пример тела запроса:

Accept: application/json
Authorization: Bearer 2|jPcKnPARV7NaMlt8Bn6NfGocHvg6GCf38rQy0W6Q86321ff7

Результат выполнения запроса:

HTTP/1.1 200 OK
Date: Wed, 15 Jan 2025 18:49:51 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "data": {
    "id": 1,
    "created_at": "2025-01-15T15:55:17.000000Z",
    "updated_at": "2025-01-15T15:55:17.000000Z",
    "title": "admin"
  }
}

3.3 - Получение всех записей без токена авторизации

Результат выполнения запроса:

HTTP/1.1 401 Unauthorized
Date: Wed, 15 Jan 2025 18:51:53 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Unauthenticated."
}

3.4 - Получение несуществующей записи по id

Результат выполнения запроса:

HTTP/1.1 404 Not Found
Date: Wed, 15 Jan 2025 19:16:27 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "No query results for model [App\\Models\\UserRole] 101"
}

4 - Обновление записи в таблице «bird_orders» (требуется токен администратора)

4.1 - Обновление записи с токеном администратора

Запрос:

PUT http://siberiabirds.local/api/bird-orders/edit/1 HTTP/1.1

Пример тела запроса:

Accept: application/json
Content-Type: application/json
Authorization: Bearer 4|52w9ueqDYXSWHPQLkgT5qAquuW5qPIO4jkIiIRa0e505e87d

{
    "title": "Аистообразные",
    "title_latin": "Ciconiiformes",
    "description": "Аистообра́зные, или голена́стые (лат. Ciconiiformes); в старом, нетипифицированном латинском написании научных названий — Gressores и Grallatores), — отряд новонёбных птиц, охватывающий по разным классификациям одно или несколько семейств."
}

Результат выполнения запроса:

HTTP/1.1 200 OK
Date: Wed, 15 Jan 2025 18:56:58 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Bird order updated successfully.",
  "data": {
    "id": 1,
    "created_at": "2025-01-15T15:55:17.000000Z",
    "updated_at": "2025-01-15T18:56:58.000000Z",
    "title": "\u0410\u0438\u0441\u0442\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435",
    "title_latin": "Ciconiiformes",
    "description": "\u0410\u0438\u0441\u0442\u043e\u043e\u0431\u0440\u0430\u0301\u0437\u043d\u044b\u0435, \u0438\u043b\u0438 \u0433\u043e\u043b\u0435\u043d\u0430\u0301\u0441\u0442\u044b\u0435 (\u043b\u0430\u0442. Ciconiiformes); \u0432 \u0441\u0442\u0430\u0440\u043e\u043c, \u043d\u0435\u0442\u0438\u043f\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u2014 Gressores \u0438 Grallatores), \u2014 \u043e\u0442\u0440\u044f\u0434 \u043d\u043e\u0432\u043e\u043d\u0451\u0431\u043d\u044b\u0445 \u043f\u0442\u0438\u0446, \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432."
  }
}

4.2 - Обновление записи без токена авторизации

Результат выполнения запроса:

HTTP/1.1 401 Unauthorized
Date: Wed, 15 Jan 2025 18:58:20 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Unauthenticated."
}

4.3 - Обновление записи на правах агента

Результат выполнения запроса:

HTTP/1.1 403 Forbidden
Date: Wed, 15 Jan 2025 18:58:43 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "This action is unauthorized."
}

4.4 - Обновление несуществующей записи

Результат выполнения запроса:

HTTP/1.1 404 Not Found
Date: Wed, 15 Jan 2025 19:07:17 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "No query results for model [App\\Models\\BirdOrder] 101"
}

5 - Удаление записи в таблице «species_statuses» (необходим токен авторизации администратора)

5.1 - Удаление записи с токеном администратора

Запрос:

DELETE http://siberiabirds.local/api/species-statuses/delete/1 HTTP/1.1

Тело запроса:

Accept: application/json
Authorization: Bearer 4|52w9ueqDYXSWHPQLkgT5qAquuW5qPIO4jkIiIRa0e505e87d

Результат выполнения запроса:

HTTP/1.1 200 OK
Date: Wed, 15 Jan 2025 19:01:02 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Species status deleted successfully."
}

5.2 - Удаление записи без токена авторизации

Результат выполнения запроса:

HTTP/1.1 401 Unauthorized
Date: Wed, 15 Jan 2025 19:01:36 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "Unauthenticated."
}

5.3 - Удаление записи на правах агента

Результат выполнения запроса:

HTTP/1.1 403 Forbidden
Date: Wed, 15 Jan 2025 19:02:30 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "This action is unauthorized."
}

5.4 - Удаление несуществующей записи

Результат выполнения запроса:

HTTP/1.1 404 Not Found
Date: Wed, 15 Jan 2025 19:03:49 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Vary: Authorization
X-Powered-By: PHP/8.2.12
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

{
  "message": "No query results for model [App\\Models\\SpeciesStatus] 1"
}