Создание минимально жизнеспособного REST API доски объявлений в учебных целях.
Получение списков всех тегов, постов и пользователей
Поиск в списках
Регистрация пользователя
Зарегистрированный пользователь может:
Добавить новые посты
Прокомментировать существующие посты
Удалить и отредактировать свои посты и комментарии
PHP 8.1+
Laravel 10
Composer
MySQL
POST
/api/v1/auth/register
ЗарегистрироватьсяName | Type | Data type | Description |
---|---|---|---|
name | required | string | Имя |
nickname | required | string | Человеко-понятный идентификатор |
required | string | Email адрес | |
password | required | string | Пароль |
password_confirmed | required | string | Подтверждение пароля |
201
CREATED
{ "access_token", "token_type": "Bearer" }
POST
/api/v1/auth/login
ВойтиName | Type | Data type | Description |
---|---|---|---|
required | string | Email адрес | |
password | required | string | Пароль |
200
OK
{ "access_token", "token_type":"Bearer" }
POST
/api/v1/auth/logout
ВыйтиKey | Value |
---|---|
Authorization | Bearer {token} |
204
NO CONTENT
GET
/api/v1/profile
Получить профиль аутентифицированного пользователяKey | Value |
---|---|
Authorization | Bearer {token} |
200
OK
{ "data": { "user_id", "name", "nickname", "email", "created_at", "updated_at", "posts_count", "comments_count" } }
GET
/api/v1/profile/posts
Получить профиль и посты аутентифицированного пользователяKey | Value |
---|---|
Authorization | Bearer {token} |
Name | Type | Data type | Description |
---|---|---|---|
per_page | optional | int | Количество постов на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "post_id", "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname", "tags": [ { "tag_id", "name", "slug", }, ... ], "comments_count" } ], "links": {...}, "meta": {...}, "user": { "user_id", "name", "nickname", "email", "created_at", "updated_at" } }
GET
/api/v1/profile/comments
Получить профиль и комментарии аутентифицированного пользователяKey | Value |
---|---|
Authorization | Bearer {token} |
Name | Type | Data type | Description |
---|---|---|---|
per_page | optional | int | Количество комментариев на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "comment_id", "body", "created_at":, "updated_at", "post_id", "user_id", "user_nickname" }, ... ], "links": {...}, "meta": {...}, "user": { "user_id", "name", "nickname", "email", "created_at", "updated_at" } }
GET
/api/v1/users
Получить всех пользователейName | Type | Data type | Description |
---|---|---|---|
q | optional | string | Поисковый запрос |
per_page | optional | int | Количество пользователей на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "user_id", "name", "nickname", "email", "created_at", "updated_at", "posts_count", "comments_count" }, ... ], "links": {...}, "meta": {...} }
GET
/api/v1/users/{nickname}
Получить пользователя200
OK
{ "data": { "user_id", "name", "nickname", "email", "created_at", "updated_at", "posts_count", "comments_count" } }
GET
/api/v1/users/{nickname}/posts
Получить пользователя и его постыName | Type | Data type | Description |
---|---|---|---|
per_page | optional | int | Количество постов на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "post_id", "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname", "tags": [ { "tag_id", "name", "slug" }, ... ], "comments_count" }, ... ], "links": {...}, "meta": {...}, "user": { "user_id", "name", "nickname", "email", "created_at", "updated_at" } }
GET
/api/v1/users/{nickname}/comments
Получить пользователя и его комментарииName | Type | Data type | Description |
---|---|---|---|
per_page | optional | int | Количество комментариев на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "comment_id", "body", "created_at":, "updated_at", "post_id", "user_id", "user_nickname" }, ... ], "links": {...}, "meta": {...}, "user": { "user_id", "name", "nickname", "email", "created_at", "updated_at" } }
GET
/api/v1/tags
Получить все тегиName | Type | Data type | Description |
---|---|---|---|
q | optional | string | Поисковый запрос |
200
OK
{ "data": [ { "tag_id", "name", "slug", "post_count" }, ... ] }
GET
/api/v1/tags/{slug}
Получить тег и его постыName | Type | Data type | Description |
---|---|---|---|
per_page | optional | int | Количество постов на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "post_id", "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname" }, ], "links": {...}, "meta": {...}, "tag": { "tag_id", "name", "slug" } }
GET
/api/v1/posts
Получить все постыName | Type | Data type | Description |
---|---|---|---|
q | optional | string | Поисковый запрос |
per_page | optional | int | Количество постов на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "post_id, "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname", "tags": [ { "tag_id", "name", "slug" }, ... ], "comments_count" }, ... ], "links": {...}, "meta": {...} }
GET
/api/v1/posts/{id}
Получить пост и его комментарииName | Type | Data type | Description |
---|---|---|---|
per_page | optional | int | Количество комментариев на странице |
page | optional | int | Номер страницы |
200
OK
{ "data": [ { "comment_id", "body", "created_at", "updated_at", "post_id", "user_id", "user_nickname" }, ... ], "links": {...}, "meta": {...}, "post": { "post_id", "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname", "tags": [ { "tag_id", "name", "slug" }, ... ] } }
POST
/api/v1/posts
Добавить новый постKey | Value |
---|---|
Authorization | Bearer {token} |
Name | Type | Data type | Description |
---|---|---|---|
title | optional | string | Заголовок |
price | optional | float | Цена |
description | optional | string | Описание |
tags[id] | optional | array[int] | Массив идентификаторов тегов |
201
CREATED
{ "data": { "post_id", "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname", "tags": [ { "tag_id", "name", "slug" }, ... ] }, }
PUT
/api/v1/posts/{id}
Изменить постKey | Value |
---|---|
Authorization | Bearer {token} |
Name | Type | Data type | Description |
---|---|---|---|
title | optional | string | Заголовок |
price | optional | float | Цена |
description | optional | string | Описание |
tags[id] | optional | array[int] | Массив идентификаторов тегов |
200
OK
{ "data": { "post_id", "title", "price", "description", "created_at", "updated_at", "user_id", "user_nickname", "tags": [ { "tag_id", "name", "slug" }, ... ] }, }
DELETE
/api/v1/posts/{id}
Удалить постKey | Value |
---|---|
Authorization | Bearer {token} |
204
NO CONTENT
POST
/api/v1/posts/{id}/comments
Добавить новый комментарий к постуKey | Value |
---|---|
Authorization | Bearer {token} |
Name | Type | Data type | Description |
---|---|---|---|
body | required | string | Текст комментария |
201
CREATED
{ "data": { "comment_id", "body", "created_at", "updated_at", "post_id", "user_id", "user_nickname", }, }
PUT
/api/v1/comments/{id}
Изменить комментарийKey | Value |
---|---|
Authorization | Bearer {token} |
Name | Type | Data type | Description |
---|---|---|---|
body | required | string | Текст комментария |
200
OK
{ "data": { "comment_id", "body", "created_at", "updated_at", "post_id", "user_id", "user_nickname", } }
DELETE
/api/v1/comments/{id}
Удалить комментарийKey | Value |
---|---|
Authorization | Bearer {token} |
204
NO CONTENT
Клонируйте этот репозиторий и перейдите в папку проекта:
git clone https://github.com/AllaAverina/bulletin-board-APIcd bulletin-board-API
Установите зависимости:
composer install
Запустите MySQL, измените параметры для подключения к базе данных в файле .env.example и выполните:
copy .env.example .env
Выполните команду для запуска миграций:
php artisan migrate
Или если хотите заполнить базу данных фиктивными данными:
php artisan migrate --seed
Запустите веб-сервер:
php artisan serve
Откройте в браузере, например, http://localhost:8000/api/v1/posts
Создайте новую базу данных для тестирования, измените параметры для подключения к ней в файле .env.testing и выполните:
php artisan test
Клонируйте этот репозиторий и перейдите в папку проекта:
git clone https://github.com/AllaAverina/bulletin-board-APIcd bulletin-board-API
Установите зависимости:
docker run --rm -u "$(id -u):$(id -g)" -v "$(pwd):/var/www/html" -w /var/www/html laravelsail/php82-composer:latest composer install --ignore-platform-reqs
Создайте файл .env:
cp .env.docker.examlpe .env
Создайте псевдоним (shell alias) и запустите sail:
alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'sail up -d
Выполните команду для запуска миграций:
sail artisan migrate
Или если хотите заполнить базу данных фиктивными данными:
sail artisan migrate --seed
Откройте в браузере, например, http://localhost/api/v1/posts
Для остановки контейнеров используйте:
sail stop
Настройте файл .env.testing:
cp .env.docker.testing .env.testing
Запустите тесты:
sail artisan test