Files
gigs_api/README.md
T
2026-05-27 12:51:07 +03:00

118 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ВДНХ Афиша API (Тестовое задание)
Бэкенд-приложение для фильтрации и вывода афиши событий Выставки (ВДНХ) на основе предоставленного технического задания.
## 🛠 Стек технологий
- **PHP:** 8.2 / 8.3
- **Framework:** Laravel 12.x
- **Database:** MySQL / PostgreSQL
- **API Specification:** Postman (коллекция в корне проекта)
---
## 📋 Постановка задачи
Разработать JSON API для Афиши событий (https://vdnh.ru/) со следующими требованиями:
1. Метод API для фильтрации событий по нескольким категориям и промежутку дат.
2. Реализация пагинации для списка событий.
3. Наличие сидеров (Database Seeding) для наполнения тестовыми данными.
4. Публикация на GitHub + предоставление коллекции для Postman.
## 🚀 Развертывание проекта
Выполните последовательно следующие команды в терминале:
1. **Клонирование репозитория и установка зависимостей:**
```bash
composer install
```
2. **Настройка окружения:**
```bash
cp .env.example .env
php artisan key:generate
```
*Отредактируйте файл `.env`, указав ваши доступы к базе данных (`DB_DATABASE`, `DB_USERNAME`, `DB_PASSWORD`).*
3. **Миграции и наполнение базы (Сидинг):**
```bash
php artisan migrate:fresh --seed
```
> 💡 **Что произойдет:** Команда полностью пересоздаст структуру БД и запустит сидеры, которые сгенерируют **11 реальных категорий** и **40 тестовых событий** со случайными датами для удобной проверки фильтрации.
4. **Пользователи:**
- В базе уже есть сгенерирован "test@example.com" с паролем "password".
- Чтобы использовать другие методы, находящиеся под защитой Sanctum, необходимо вызвать метод [/api/login](#1. Авторизация (Получение токена)) и получить токен, который сохранится в переменную token в [POSTMAN](#Тестирование в Postman).
- Для генерации нового пользователя или изменения его пароля/токена можно воспользоваться консольными командами, описанными ниже.
## 💻 Консольные команды (CLI)
Для удобства управления пользователями и токенами добавлены кастомные Artisan-команды:
1. **Создание пользователя и генерация API-токена:**
```bash
php artisan user:create-api-user "Ivan Ivanov" ivan@example.com "secret123"
```
*Команда регистрирует нового пользователя в базе данных и сразу генерирует для него первый Sanctum-токен.*
2. **Сброс пароля и выдача нового токена:**
```bash
php artisan user:reset-password ivan@example.com "new_secret123"
```
*Команда находит пользователя по email, обновляет его пароль и выводит в консоль новый рабочий Sanctum-токен.*
## 📡 Документация API (Эндпоинты)
*Для всех запросов обязательно передавайте заголовки:*
- `Accept: application/json`
- `Content-Type: application/json`
### 1. Авторизация (Получение токена)
* **URL:** `/api/login`
* **Метод:** `POST`
#### Тело запроса (JSON):
```json
{
"email": "user@example.com",
"password": "your_password"
}
```
### 2. Выход из системы (Logout)
* **URL:** `/api/logout`
* **Метод:** `POST`
* **Описание:** Деактивирует и удаляет текущий API-токен Sanctum, с которым был выполнен запрос. Заговоловок Authorization c токеном обязателен.
---
*В ответе возвращаются данные пользователя и его `access_token` для авторизации в защищенных эндпоинтах.*
### 2. Получение списка событий с фильтрацией и пагинацией
* **URL:** `/api/gigs`
* **Метод:** `GET`
* **Описание:** для метода необходим заголовок Authorization: Bearer {{token}}, который можно получить методом /login.
#### Параметры запроса (Query Parameters):
| Параметр | Тип | Обязательный | Описание | Пример / Значение |
| :--- | :--- | :--- | :--- | :--- |
| `categories` | `array` | Нет | Массив ID или слагов категорий | `categories[]=1&categories[]=2` |
| `date_from` | `string` | Нет | Начало диапазона дат (`YYYY-MM-DD`) | `2026-05-01` |
| `date_to` | `string` | Нет | Конец диапазона дат (`YYYY-MM-DD`) | `2026-05-31` |
| `page` | `integer` | Нет | Номер страницы пагинации | `2` |
| `per_page` | `integer` | Нет | Количество элементов на страницу | `15` *(По умолчанию: `10`)* |
#### Пример запроса:
`GET /api/gigs?categories[]=1&categories[]=4&date_from=2026-02-01&date_to=2026-05-31`
---
## 🧪 Тестирование в Postman
В корне репозитория находится файл коллекции для быстрого тестирования всех эндпоинтов: **`gigs_api_collection.json`**.