Backend API (Поточний стан)
Базовий URL під час локальної розробки бекенду:
http://127.0.0.1:8000/api
Публічні маршрути
GET /app-configGET /coursesGET /courses/{course}POST /auth/registerPOST /auth/register/request-verification-codePOST /auth/register/verify-codePOST /auth/loginPOST /auth/forgot-passwordPOST /auth/reset-passwordGET /auth/email/verify/{id}/{hash}POST /dev/token(локальний debug helper для seed-акаунтів)
Авторизація
POST /auth/register створює обліковий запис студента або викладача, відправляє email-верифікацію та повертає Sanctum bearer token.
{
"name": "New Student",
"email": "student@example.com",
"password": "password123",
"password_confirmation": "password123",
"role": "student",
"token_name": "frontend"
}Для self-registration дозволені ролі student і instructor; адміністратори керуються через seed або admin tooling.
GET /app-config повертає runtime-стан CAPTCHA, який використовує frontend. Відповідь зараз містить captcha_enabled і captcha_site_key.
Коли CAPTCHA_ENABLED=true у backend .env, реєстрація, логін і запит verification code для signup також вимагають captcha_token.
Коли CAPTCHA_ENABLED=false, бекенд приймає auth-запити без CAPTCHA, а frontend ховає CAPTCHA UI.
POST /auth/login приймає email, password та необов'язковий token_name, після чого повертає:
{
"token": "1|...",
"token_type": "Bearer",
"user": {
"id": 1,
"email": "student@example.com",
"role": "student"
}
}Заблоковані користувачі не можуть виконати логін.
До auth endpoint-ів застосовується rate limit для захисту від brute-force.
Потік reset password:
POST /auth/forgot-passwordз{ "email": "student@example.com" }надсилає email для скидання.POST /auth/reset-passwordзemail,token,password,password_confirmationоновлює пароль і відкликає чинні Sanctum-токени.
Потік верифікації email:
- Під час реєстрації надсилається підписаний verification URL.
GET /auth/email/verify/{id}/{hash}верифікує адресу, якщо підпис URL валідний.POST /auth/email/resendповторно надсилає verification email для автентифікованого користувача.
Альтернативна верифікація email через 6-значний код:
TechTutor також підтримує двокрокову реєстрацію через verification code:
POST /auth/register/request-verification-code— створює verification record, генерує 6-значний код і відправляє його на email.
- Потрібні
name,email,password,password_confirmation, optionalrole, іcaptcha_token, коли CAPTCHA увімкнена - Код діє 5 хвилин
- У відповідь повертається email
POST /auth/register/verify-code— перевіряє 6-значний код і завершує реєстрацію.- Потрібні
email,code,name,password,password_confirmation, optionalrole,token_name - Успішна відповідь повертає Sanctum bearer token і дані користувача
- Потрібні
cURL / Postman приклади для auth
Реєстрація з CAPTCHA token, коли CAPTCHA увімкнена:
curl -X POST "http://127.0.0.1:8000/api/auth/register" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "New Student",
"email": "student@example.com",
"password": "password123",
"password_confirmation": "password123",
"role": "student",
"token_name": "frontend",
"captcha_token": "demo-captcha-token"
}'Якщо CAPTCHA вимкнена, captcha_token слід прибрати з цих запитів.
Логін з CAPTCHA token, коли CAPTCHA увімкнена:
curl -X POST "http://127.0.0.1:8000/api/auth/login" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "student@example.com",
"password": "password123",
"token_name": "frontend",
"captcha_token": "demo-captcha-token"
}'Forgot password:
curl -X POST "http://127.0.0.1:8000/api/auth/forgot-password" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "student@example.com"
}'Reset password:
curl -X POST "http://127.0.0.1:8000/api/auth/reset-password" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"token": "RESET_TOKEN_HERE",
"email": "student@example.com",
"password": "new-password123",
"password_confirmation": "new-password123"
}'Реєстрація через email verification code
Запит коду верифікації:
curl -X POST "http://127.0.0.1:8000/api/auth/register/request-verification-code" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "New Student",
"email": "student@example.com",
"password": "password123",
"password_confirmation": "password123",
"role": "student",
"captcha_token": "demo-captcha-token"
}'Відповідь:
{
"message": "Verification code sent to your email.",
"email": "student@example.com"
}Перевірка коду і завершення реєстрації:
curl -X POST "http://127.0.0.1:8000/api/auth/register/verify-code" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "student@example.com",
"code": "123456",
"name": "New Student",
"password": "password123",
"password_confirmation": "password123",
"role": "student",
"token_name": "frontend"
}'Параметри запиту каталогу курсів
GET /courses підтримує фільтри каталогу і full-text пошук через MeiliSearch, коли Scout налаштований на MeiliSearch:
q: пошук за title, subtitle, description, category, slugcategorylevellanguageinstructor_idprice_type:freeабоpaidmin_pricemax_pricesort:newest,oldest,title,price_asc,price_desc,ratingper_page: 1-50
Приклад:
curl -X GET "$BASE_URL/courses?q=laravel&category=backend&price_type=paid&sort=price_desc"Коли SCOUT_DRIVER=meilisearch, параметр q йде через MeiliSearch, а решта фільтрів застосовується до каталогу звично.
Захищені маршрути (Sanctum)
Заблоковані користувачі не мають доступу до захищених маршрутів.
Автентифікований користувач
GET /auth/mePOST /auth/logoutPOST /auth/email/resend
POST /auth/logout видаляє поточний Sanctum access token.
Адміністратор
GET /admin/usersPATCH /admin/users/{user}GET /admin/platform-dashboardGET /admin/moderation-queuePATCH /admin/moderation-queue/reviews/{review}PATCH /admin/moderation-queue/comments/{comment}
GET /admin/platform-dashboard повертає метрики живого моніторингу платформи (тільки для адміна) без окремого збереження статистичних рядків.
Дані включають:
- totals по users/courses/enrollments/certificates/quiz attempts
- moderation queue counts
- payment totals і paid revenue
- payment status breakdown
- paid revenue по курсах
- recent activity feed
Дашборд викладача
GET /instructor/dashboard
Доступний викладачам і адміністраторам. Відповідь обчислюється в реальному часі на основі курсів, зарахувань, прогресу уроків, сертифікатів, спроб квізів і paid платежів.
Повертає:
courses_countpublished_courses_countdraft_courses_countenrollments_countcertificates_countrevenue_totalaverage_progressaverage_quiz_score
Курси
POST /coursesPUT /courses/{course}PATCH /courses/{course}DELETE /courses/{course}
Payload створення/оновлення курсу підтримує метадані:
subtitlecategorylevellanguagethumbnail_pathduration_minutes
Зарахування
GET /courses/{course}/enrollmentsPOST /courses/{course}/enrollmentsDELETE /courses/{course}/enrollments/{enrollment}
Для paid-курсів потрібна попередня оплата. Якщо оплати немає, endpoint повертає 402 з повідомленням про необхідність покупки.
Модулі
GET /courses/{course}/modulesPOST /courses/{course}/modulesGET /courses/{course}/modules/{module}PUT /courses/{course}/modules/{module}PATCH /courses/{course}/modules/{module}DELETE /courses/{course}/modules/{module}
Уроки
GET /modules/{module}/lessonsPOST /modules/{module}/lessonsGET /modules/{module}/lessons/{lesson}PUT /modules/{module}/lessons/{lesson}PATCH /modules/{module}/lessons/{lesson}DELETE /modules/{module}/lessons/{lesson}
Прогрес
POST /lessons/{lesson}/progressPUT /lessons/{lesson}/progress
Коли прогрес досягає 100, бекенд перевіряє завершення всіх уроків курсу і видає (або повертає) сертифікат.
Сертифікати
GET /certificatesGET /certificates/{certificate}POST /courses/{course}/certificate
Доступ до сертифікатів рольовий:
- Студенти бачать свої сертифікати
- Викладачі бачать сертифікати своїх курсів
- Адміни бачать усі сертифікати
Квізи
GET /courses/{course}/quizzesPOST /courses/{course}/quizzesGET /courses/{course}/quizzes/{quiz}PUT /courses/{course}/quizzes/{quiz}PATCH /courses/{course}/quizzes/{quiz}DELETE /courses/{course}/quizzes/{quiz}
Підтримувані типи запитань:
single_choice: рівно один варіант ізis_correct: truemultiple_choice: один або більше варіантів ізis_correct: true
Спроби квізу
GET /quizzes/{quiz}/attemptsPOST /quizzes/{quiz}/attempts
У спробі приймається тільки answers; score і passed рахує бекенд.
Аналітика квізу
GET /quizzes/{quiz}/analytics
Доступно лише викладачу курсу та адмінам. Аналітика рахується в реальному часі з quiz_attempts і quiz_questions без окремої таблиці статистики.
Відгуки
GET /courses/{course}/reviewsPOST /courses/{course}/reviewsPUT /courses/{course}/reviews/{review}PATCH /courses/{course}/reviews/{review}DELETE /courses/{course}/reviews/{review}
Коментарі до уроків
GET /lessons/{lesson}/commentsPOST /lessons/{lesson}/commentsPUT /lessons/{lesson}/comments/{comment}PATCH /lessons/{lesson}/comments/{comment}DELETE /lessons/{lesson}/comments/{comment}
Платежі
GET /paymentsGET /payments/{payment}POST /courses/{course}/paymentsPOST /courses/{course}/payments/stripe-checkoutPOST /stripe/webhookGET /payments/statusPOST /payments/stripe/confirm
POST /courses/{course}/payments — внутрішній purchase endpoint: перевіряє суму, створює paid payment, генерує receipt, надає доступ і створює/повертає active enrollment.
Stripe Checkout + webhook flow повністю реалізовані. Інтеграція LiqPay запланована. Потік провайдер-агностичний: і Stripe webhook, і internal payment формують однакові payments із status = paid.
Публікація курсів (publish request)
Викладачі можуть створювати курси як чернетки і запитувати публікацію.
- Запит викладача: у
POST/PUT/PATCHкурсу передатиrequest_publish: true - Схвалення адміном:
PATCH /courses/{course}з{ "is_published": true } - Відхилення адміном:
PATCH /courses/{course}з{ "decline_publish": true, "publish_request_declined_reason": "optional reason" }
Email-сповіщення
Поточні тригери:
- Верифікація реєстрації
- Скидання пароля
- Підтвердження зарахування
- Результат квізу
- Видача сертифіката
- Схвалення/відхилення publish request
Примітки
- Контроль доступу рольовий: student/instructor/admin
- Admin endpoints керують ролями, банами та модерацією
- Progress і quiz attempt мають перевірки enrollment/instructor
- Нові відгуки та коментарі до уроків проходять через moderation queue
- Валідація виконується через FormRequest-класи