Skip to content

AllaAverina/bulletin-board-API

Repository files navigation

Laravel Logo

Доска объявлений

Создание минимально жизнеспособного REST API доски объявлений в учебных целях.

Функционал

  • Получение списков всех тегов, постов и пользователей
  • Поиск в списках
  • Регистрация пользователя
  • Зарегистрированный пользователь может:
    • Добавить новые посты
    • Прокомментировать существующие посты
    • Удалить и отредактировать свои посты и комментарии

Требования

Документация

Аутентификация

POST /api/v1/auth/register Зарегистрироваться
Body
Name Type Data type Description
name required string Имя
nickname required string Человеко-понятный идентификатор
email required string Email адрес
password required string Пароль
password_confirmed required string Подтверждение пароля
Success Response
HTTP Code: 201 CREATED
{
    "access_token",
    "token_type": "Bearer"
}
POST /api/v1/auth/login Войти
Body
Name Type Data type Description
email required string Email адрес
password required string Пароль
Success Response
HTTP Code: 200 OK
{
    "access_token",
    "token_type":"Bearer"
}
POST /api/v1/auth/logout Выйти
Headers
Key Value
Authorization Bearer {token}
Success Response
HTTP Code: 204 NO CONTENT

Профиль

GET /api/v1/profile Получить профиль аутентифицированного пользователя
Headers
Key Value
Authorization Bearer {token}
Response
HTTP Code: 200 OK
{
    "data": {
        "user_id",
        "name",
        "nickname",
        "email",
        "created_at",
        "updated_at",
        "posts_count",
        "comments_count"
    }
}
GET /api/v1/profile/posts Получить профиль и посты аутентифицированного пользователя
Headers
Key Value
Authorization Bearer {token}
Params
Name Type Data type Description
per_page optional int Количество постов на странице
page optional int Номер страницы
Response
HTTP Code: 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 Получить профиль и комментарии аутентифицированного пользователя
Headers
Key Value
Authorization Bearer {token}
Params
Name Type Data type Description
per_page optional int Количество комментариев на странице
page optional int Номер страницы
Success Response
HTTP Code: 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 Получить всех пользователей
Params
Name Type Data type Description
q optional string Поисковый запрос
per_page optional int Количество пользователей на странице
page optional int Номер страницы
Success Response
HTTP Code: 200 OK
{
    "data": [
        {
            "user_id",
            "name",
            "nickname",
            "email",
            "created_at",
            "updated_at",
            "posts_count",
            "comments_count"
        },
        ...
    ],
    "links": {...},
    "meta": {...}
}
GET /api/v1/users/{nickname} Получить пользователя
Success Response
HTTP Code: 200 OK
{
    "data": {
        "user_id",
        "name",
        "nickname",
        "email",
        "created_at",
        "updated_at",
        "posts_count",
        "comments_count"
    }
}
GET /api/v1/users/{nickname}/posts Получить пользователя и его посты
Params
Name Type Data type Description
per_page optional int Количество постов на странице
page optional int Номер страницы
Success Response
HTTP Code: 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 Получить пользователя и его комментарии
Params
Name Type Data type Description
per_page optional int Количество комментариев на странице
page optional int Номер страницы
Success Response
HTTP Code: 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 Получить все теги
Params
Name Type Data type Description
q optional string Поисковый запрос
Success Response
HTTP Code: 200 OK
{
    "data": [
        {
            "tag_id",
            "name",
            "slug",
            "post_count"
        },
        ...
    ]
}
GET /api/v1/tags/{slug} Получить тег и его посты
Params
Name Type Data type Description
per_page optional int Количество постов на странице
page optional int Номер страницы
Success Response
HTTP Code: 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 Получить все посты
Params
Name Type Data type Description
q optional string Поисковый запрос
per_page optional int Количество постов на странице
page optional int Номер страницы
Success Response
HTTP Code: 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} Получить пост и его комментарии
Params
Name Type Data type Description
per_page optional int Количество комментариев на странице
page optional int Номер страницы
Success Response
HTTP Code: 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 Добавить новый пост
Headers
Key Value
Authorization Bearer {token}
Body
Name Type Data type Description
title optional string Заголовок
price optional float Цена
description optional string Описание
tags[id] optional array[int] Массив идентификаторов тегов
Success Response
HTTP Code: 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} Изменить пост
Headers
Key Value
Authorization Bearer {token}
Body
Name Type Data type Description
title optional string Заголовок
price optional float Цена
description optional string Описание
tags[id] optional array[int] Массив идентификаторов тегов
Success Response
HTTP Code: 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} Удалить пост
Headers
Key Value
Authorization Bearer {token}
Success Response
HTTP Code: 204 NO CONTENT

Комментарии

POST /api/v1/posts/{id}/comments Добавить новый комментарий к посту
Headers
Key Value
Authorization Bearer {token}
Body
Name Type Data type Description
body required string Текст комментария
Success Response
HTTP Code: 201 CREATED
{
    "data": {
        "comment_id",
        "body",
        "created_at",
        "updated_at",
        "post_id",
        "user_id",
        "user_nickname",
    },
}
PUT /api/v1/comments/{id} Изменить комментарий
Headers
Key Value
Authorization Bearer {token}
Body
Name Type Data type Description
body required string Текст комментария
Success Response
HTTP Code: 200 OK
{
    "data": {
        "comment_id",
        "body",
        "created_at",
        "updated_at",
        "post_id",
        "user_id",
        "user_nickname",
    }
}
DELETE /api/v1/comments/{id} Удалить комментарий
Headers
Key Value
Authorization Bearer {token}
Success Response
HTTP Code: 204 NO CONTENT

Запуск

  1. Клонируйте этот репозиторий и перейдите в папку проекта:
git clone https://github.com/AllaAverina/bulletin-board-API
cd bulletin-board-API
  1. Установите зависимости:
composer install
  1. Запустите MySQL, измените параметры для подключения к базе данных в файле .env.example и выполните:
copy .env.example .env
  1. Выполните команду для запуска миграций:
php artisan migrate

Или если хотите заполнить базу данных фиктивными данными:

php artisan migrate --seed
  1. Запустите веб-сервер:
php artisan serve
  1. Откройте в браузере, например, http://localhost:8000/api/v1/posts

Запуск тестов

Создайте новую базу данных для тестирования, измените параметры для подключения к ней в файле .env.testing и выполните:

php artisan test 

Запуск в Docker

  1. Клонируйте этот репозиторий и перейдите в папку проекта:
git clone https://github.com/AllaAverina/bulletin-board-API
cd bulletin-board-API
  1. Установите зависимости:
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
  1. Создайте файл .env:
cp .env.docker.examlpe .env
  1. Создайте псевдоним (shell alias) и запустите sail:
alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'
sail up -d
  1. Выполните команду для запуска миграций:
sail artisan migrate

Или если хотите заполнить базу данных фиктивными данными:

sail artisan migrate --seed
  1. Откройте в браузере, например, http://localhost/api/v1/posts
  2. Для остановки контейнеров используйте:
sail stop

Запуск тестов в Docker

  1. Настройте файл .env.testing:
cp .env.docker.testing .env.testing
  1. Запустите тесты:
sail artisan test