Skip to content

07Rinat07/task_laravel

Repository files navigation

Laravel Logo

Build Status Total Downloads Latest Stable Version License

Быстрый запуск в Docker

  1. docker compose up --build
  2. Открыть http://localhost:8080

Docker сам подготовит .env, сгенерирует APP_KEY и выполнит миграции.

В браузере

  • Приложение (Docker): http://localhost:8080
  • Локальный запуск без Docker (artisan serve): http://127.0.0.1:8000
  • Swagger UI (API): http://localhost:8080/api

Важная информация и настройки

Docker

  • Приложение: http://localhost:8080
  • MySQL: порт 3307 на хосте (в контейнере 3306)
  • Основные сервисы: app (PHP-FPM), web (nginx), db (MySQL)

Окружение

  • .env.docker — базовые переменные для Docker
  • .env создается автоматически при старте контейнера
  • .env.testing — настройки для тестов (SQLite in-memory)
  • При запуске без Docker нужно вручную создать .env и сгенерировать APP_KEY
    • Если видите MissingAppKeyException, выполните php artisan key:generate
    • Для Docker после генерации ключа перезапустите контейнеры
    • Если ошибка появляется сразу после docker compose up, выполните docker compose down и запустите снова

Команды

Запуск:

docker compose up --build

Остановка:

docker compose down

Тесты (в контейнере, рекомендовано):

docker compose run --rm --entrypoint php app artisan test

Статус тестов

docker compose run --rm --entrypoint php app artisan test

Локальный запуск без Docker:

cp .env.example .env
php artisan key:generate
php artisan migrate
php artisan serve

Задание

Необходимо создать БД под управлением MySQL со следующими сущностями:

Пользователь

  • id
  • Логин
  • Пароль
  • Имя
  • Фамилия
  • Дата регистрации
  • Дата рождения Все поля, кроме "Дата рождения", не могут принимать нулевые значения.

Event

  • id
  • Заголовок
  • Текст
  • Дата создания
  • Создатель (сущность Пользователь)
  • Участники (сущность Пользователи) Все значения ненулевые.

Разработать RESTful API для:

  • регистрация пользователя
  • авторизация пользователя
  • создание события
  • получение списка событий
  • участие в событии
  • отмена участия в событии
  • удаление события создателем

Ответ с сервера должен приходить в виде такого JSON:

{"error":null, "result":{"id":1, "first_name":"Вася", "last_name":"Петров"}}

Создать простую админку, используя AdminLTE:

  • регистрация пользователя
  • авторизация пользователя
  • список событий
  • информация о пользователе

Если в процессе регистрации или авторизации произошла ошибка, необходимо показать диалоговое окно с описанием ошибки. При успешной регистрации или авторизации открывается окно со списком событий (см. скрин). При просмотре НЕ своего события внизу находится кнопка "Принять участие", при просмотре своего события - кнопка "Отказаться от участия". Элементы "Все события" и "Участники" должны обновляться каждые 30 секунд, по возможности, без перезагрузки страницы. При клике на участника показывается экран информации об участнике в произвольном виде.

Выполнено в проекте

  • БД MySQL: сущности users и events, связь многие-ко-многим event_user
  • REST API: регистрация, авторизация, создание/список событий, участие/отмена, удаление создателем
  • Формат ответа: {"error": ..., "result": ...}
  • Админка AdminLTE: регистрация, авторизация, список событий, профиль пользователя
  • Документация API в Swagger UI: http://localhost:8080/api
  • Диалоговые ошибки при неуспешной регистрации/авторизации
  • Автообновление списков событий/участников каждые 30 секунд

API (маршруты и примеры)

Базовый URL: http://localhost:8080/api

Формат ответа

{
  "error": null,
  "result": {}
}

Авторизация

Для защищенных маршрутов требуется заголовок:

Authorization: Bearer <token>

Маршруты

  • POST /register — регистрация
  • POST /login — авторизация
  • GET /events — список событий (auth, поддерживает sort, direction, per_page, page)
  • POST /events — создание события (auth)
  • POST /events/{event}/join — участие (auth)
  • POST /events/{event}/leave — отмена участия (auth)
  • DELETE /events/{event} — удаление события создателем (auth)

Примеры

POST /register

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

{
  "login": "user1",
  "password": "secret123",
  "first_name": "Ivan",
  "last_name": "Petrov",
  "birth_date": "2000-01-01"
}

Пример ответа:

{
  "error": null,
  "result": {
    "id": 1,
    "first_name": "Ivan",
    "last_name": "Petrov",
    "token": "..."
  }
}

POST /login

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

{
  "login": "user1",
  "password": "secret123"
}

Пример ответа:

{
  "error": null,
  "result": {
    "id": 1,
    "first_name": "Ivan",
    "last_name": "Petrov",
    "token": "..."
  }
}

POST /events

Headers:

Authorization: Bearer <token>

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

{
  "title": "Событие",
  "body": "Описание события"
}

Пример ответа:

{
  "error": null,
  "result": {
    "id": 1,
    "title": "Событие"
  }
}

GET /events

Headers:

Authorization: Bearer <token>

Query параметры:

  • sort: created_at | title (по умолчанию created_at)
  • direction: asc | desc (по умолчанию desc)
  • per_page: 1..100 (по умолчанию 20)
  • page: номер страницы

Пример ответа:

{
  "error": null,
  "result": {
    "items": [
      {
        "id": 1,
        "title": "Событие",
        "body": "Описание события",
        "created_at": "2025-01-21 10:00:00",
        "creator": {
          "id": 1,
          "first_name": "Ivan",
          "last_name": "Petrov"
        },
        "participants": [
          {
            "id": 1,
            "first_name": "Ivan",
            "last_name": "Petrov"
          }
        ],
        "is_creator": true,
        "is_participant": true
      }
    ],
    "pagination": {
      "current_page": 1,
      "per_page": 20,
      "total": 1,
      "last_page": 1
    },
    "sort": {
      "field": "created_at",
      "direction": "desc"
    }
  }
}

POST /events/{event}/join

Headers:

Authorization: Bearer <token>

Пример ответа:

{
  "error": null,
  "result": {
    "event_id": 1,
    "joined": true
  }
}

POST /events/{event}/leave

Headers:

Authorization: Bearer <token>

Пример ответа:

{
  "error": null,
  "result": {
    "event_id": 1,
    "joined": false
  }
}

DELETE /events/{event}

Headers:

Authorization: Bearer <token>

Пример ответа:

{
  "error": null,
  "result": {
    "event_id": 1,
    "deleted": true
  }
}

About

task_laravel for tests

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages