Skip to content

RihardXXX/test-envy-feedback

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Feedback App (Laravel + Vue)

Тестовое задание: форма обратной связи. Монорепо из двух частей — Laravel 11 API (backend/) и Vue 3 SPA (frontend/).

Стек

  • Frontend: Vue 3 + Vite + TypeScript, Vuex 4, Vue Router 4.
  • Backend: Laravel 11, PHP 8.2+. Паттерн Factory для выбора сохранения (database или email). Физическая запись не производится — реализации логируют факт вызова (по ТЗ это необязательно).
  • Инфра: Docker Compose (один сервис на каждую часть, named volumes для vendor/ и node_modules/).

Структура репозитория

test-envy/
├── backend/                          Laravel 11 API
│   ├── app/
│   │   ├── Http/Controllers/FeedbackController.php
│   │   ├── Http/Requests/StoreFeedbackRequest.php
│   │   └── Services/Feedback/        Factory + реализации + DTO
│   ├── config/{app,cors,logging}.php
│   ├── routes/api.php                POST /api/feedback
│   ├── docker/entrypoint.sh          авто .env + key:generate
│   └── Dockerfile
├── frontend/                         Vue 3 SPA
│   ├── src/
│   │   ├── views/{HomeView,ListView}.vue
│   │   ├── store/index.ts            Vuex
│   │   ├── router/index.ts           Vue Router
│   │   └── types/feedback.ts
│   └── Dockerfile
├── docker-compose.yml
└── README.md

Запуск (одна команда)

Нужен только Docker Desktop (macOS/Windows) или Docker Engine + docker compose plugin (Linux). Локально PHP, Composer или Node ставить не нужно.

docker compose up --build

После сборки:

Повторный запуск (без пересборки образов):

docker compose up

В фоне / остановить / очистить тома:

docker compose up -d
docker compose down
docker compose down -v

Как проверить, что всё работает

  1. Открой http://localhost:5173 — отобразится шапка с двумя ссылками («Форма», «Список»).
  2. На странице «Форма» заполни имя и обращение, нажми «Отправить». Появится сообщение об успехе.
  3. Перейди на «Список» — увидишь только что отправленное обращение (данные держатся в Vuex и пропадут после F5 — это по ТЗ).
  4. Можно продублировать через curl:
curl -i -X POST http://localhost:8000/api/feedback \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"name":"Ivan","message":"Hello there","destination":"email"}'

Ответ 201 Created:

{
  "id": "…uuid…",
  "name": "Ivan",
  "message": "Hello there",
  "savedVia": "email",
  "createdAt": "2026-04-24T12:34:56+00:00"
}

API

POST /api/feedback

Body (application/json):

поле тип обязательное ограничения
name string да 1..100
message string да 1..2000
destination string нет database | email (default: database)

Контроллер получает FeedbackSaverFactory через DI и вызывает $factory->make($destination)->save($data). Фабрика реализована в app/Services/Feedback/FeedbackSaverFactory.php.

Ответ 201 с телом { id, name, message, savedVia, createdAt }. Ошибки валидации — 422 с полями в стандартном формате Laravel.

Запуск без Docker (альтернатива)

Backend (требуется PHP 8.2+ и Composer)

cd backend
composer install
cp .env.example .env
php artisan key:generate
php artisan serve

Frontend (требуется Node.js 20+)

cd frontend
npm install
npm run dev

Если бэк лежит не на http://localhost:8000, укажи URL во фронте:

echo "VITE_API_URL=http://localhost:8000" > frontend/.env.local

Соответствие ТЗ

  • SPA на Vue.js + Vuex (не Pinia) + Vue-Router — да, две страницы, навигация без перезагрузки.
  • Страница 1 — форма «имя / обращение», POST на бэк, результат в Vuex.
  • Страница 2 — список только из Vuex, без повторного запроса, данные теряются на F5.
  • Laravel + PHP, паттерн Factory с параметром database | email, метод save(). Физическое сохранение пропущено (по ТЗ необязательно) — вместо этого Log::info.

About

Feedback app: Laravel 11 API (Factory pattern) + Vue 3 SPA (Vuex + Router). Runs via docker compose up.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors