tutoring/routes/web.php

315 lines
11 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
// Only alias the two dashboards (name collision)
use App\Http\Controllers\Admin\DashboardController as AdminDashboardController;
use App\Http\Controllers\Student\DashboardController as StudentDashboardController;
use App\Http\Controllers\Student\CourseController as StudentCourseController;
use App\Http\Controllers\Admin\LessonController as AdminLessonController;
use App\Http\Controllers\Admin\CalendarController as AdminCalendarController;
use App\Http\Controllers\Student\CalendarController as StudentCalendarController;
use App\Http\Controllers\Admin\BookingController as AdminBookingController;
use App\Http\Controllers\Student\BookingController as StudentBookingController;
use App\Http\Controllers\Student\LessonController as StudentLessonController;
use App\Http\Controllers\IcsFeedController;
use App\Http\Controllers\Student\BookingsListController;
use App\Http\Controllers\Admin\LessonSectionController;
use App\Http\Controllers\Admin\LessonVideoController;
use App\Http\Controllers\Admin\ChapterController;
use App\Http\Controllers\Admin\ModuleController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\Student\LessonController;
use App\Http\Controllers\Admin\StudentController;
use App\Http\Controllers\LevelController;
use App\Http\Controllers\SubjectController;
use App\Http\Controllers\Admin\CourseController;
use App\Http\Controllers\Admin\BillingController;
use App\Http\Controllers\Admin\TeacherController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\Admin\ParentController;
use App\Models\Course;
use App\Models\Lesson;
app('router')->matched(function ($event) {
\Log::info('Matched route:', [
'uri' => $event->route->uri(),
'name' => $event->route->getName(),
]);
});
/*Route::get('student/{course}/{lesson}', function ($course, $lesson) {
\Log::info('Executing route closure now');
return response("Matched two segments: course={$course}, lesson={$lesson}", 200);
})->where('any1', '.*')->where('any2', '.*');*/
Route::middleware(['auth', 'role:admin|god'])
->prefix('admin')
->name('admin.')
->group(function () {
Route::get('/users', [App\Http\Controllers\Admin\UserController::class, 'index'])->name('users.index');
Route::post('users/{user}/role', [App\Http\Controllers\Admin\UserController::class, 'updateRole'])->name('users.updateRole');
});
// Teacher-only
Route::middleware(['auth', 'role:teacher'])
->prefix('teacher')
->name('teacher.')
->group(function () {
Route::get('/dashboard', function () {
return view('teacher.dashboard');
})->name('dashboard');
Route::post('questions/{question}/answer', [App\Http\Controllers\Student\LessonQuestionController::class, 'answer'])
->name('questions.answer');
});
// Admin-only
Route::middleware(['auth','role:admin'])
->prefix('admin')
->name('admin.')
->group(function () {
Route::get('/dashboard', [AdminDashboardController::class, 'index'])
->name('dashboard');
//Route::get('/students', [StudentController::class, 'index'])
// ->name('students.index');
Route::get('/teachers', [TeacherController::class, 'index'])
->name('teachers.index');
Route::get('/courses', [CourseController::class, 'index'])
->name('courses.index');
Route::get('/addcourse', [CourseController::class, 'create'])
->name('courses.create');
Route::get('/addteacher', [TeacherController::class, 'create'])
->name('teachers.create');
Route::post('/addteacher', [TeacherController::class, 'store'])
->name('teachers.store');
Route::post('/addcourse', [CourseController::class, 'store'])
->name('courses.store');
Route::get('/levels', [LevelController::class, 'index'])
->name('levels.index');
Route::get('/addlevel', [LevelController::class, 'create'])
->name('levels.create');
Route::post('/addlevel', [LevelController::class, 'store'])
->name('levels.store');
Route::get('/subjects', [SubjectController::class, 'index'])
->name('subjects.index');
Route::get('/addsubject', [SubjectController::class, 'create'])
->name('subjects.create');
Route::post('/addsubject', [SubjectController::class, 'store'])
->name('subjects.store');
Route::post('/modules', [ModuleController::class, 'store'])
->name('modules.store');
Route::post('modules/reorder', [ModuleController::class, 'reorder'])
->name('modules.reorder');
Route::get('/courses/{course:slug}', [CourseController::class, 'show'])
->name('courses.show');
Route::post('/chapters', [ChapterController::class, 'store'])->name('chapters.store');
Route::delete('/chapters/{chapter}', [ChapterController::class, 'destroy'])->name('chapters.destroy');
Route::post('/chapters/reorder', [ChapterController::class, 'reorder'])
->name('chapters.reorder');
Route::get('/courses/{course:slug}/chapter/{chapter:slug}', [ChapterController::class, 'show'])
->withoutScopedBindings()
->name('chapters.show');
Route::post('/lessons/reorder', [AdminLessonController::class, 'reorder'])
->name('lessons.reorder');
Route::get('/courses/{course:slug}/chapter/{chapter:slug}/topic/{lesson:slug}', [AdminLessonController::class, 'show'])
->name('lessons.show');
Route::post('/videos/reorder', [LessonVideoController::class, 'reorder'])
->name('videos.reorder');
Route::post('/videos', [LessonVideoController::class, 'store'])
->name('videos.store');
Route::delete('/videos/{video}', [LessonVideoController::class, 'destroy'])
->name('videos.destroy');
Route::post('/chapters', [ChapterController::class, 'store'])
->name('chapters.store');
Route::delete('/chapters/{chapter}', [ChapterController::class, 'destroy'])
->name('chapters.destroy');
Route::post('/lessons', [AdminLessonController::class, 'store'])->name('lessons.store');
Route::delete('courses/{course:slug}/chapter/{chapter:slug}/lesson/{lesson:slug}',
[App\Http\Controllers\Admin\LessonController::class, 'destroy']
)->name('lessons.destroy');
Route::get('/calendar', [AdminCalendarController::class, 'index'])
->name('calendar');
Route::get('/bookings/create', [AdminBookingController::class, 'create'])
->name('bookings.create');
Route::post('/bookings', [AdminBookingController::class, 'store'])
->name('bookings.store');
Route::get('/bookings/block/create', [AdminBookingController::class, 'createBlock'])
->name('bookings.block.create');
Route::post('/bookings/block', [AdminBookingController::class, 'storeBlock'])
->name('bookings.block.store');
Route::get('/bookings/series/create', [AdminBookingController::class, 'createSeries'])
->name('bookings.series.create');
Route::post('/bookings/series', [AdminBookingController::class, 'storeSeries'])
->name('bookings.series.store');
Route::get('courses/{course:slug}/section/{section:slug}',
[LessonSectionController::class, 'show']
)->name('sections.show');
Route::get('sections', [LessonSectionController::class, 'index'])
->name('sections.index');
Route::post('courses/{course:slug}/sections',
[LessonSectionController::class, 'store']
)->name('sections.store');
Route::put('sections/{lessonSection}', [LessonSectionController::class, 'update'])
->name('sections.update');
Route::delete(
'courses/{course:slug}/section/{section:slug}',
[LessonSectionController::class, 'destroy']
)->name('sections.destroy');
Route::post('sections/reorder', [LessonSectionController::class, 'reorder'])
->name('sections.reorder');
Route::get('test-section-binding/{section:slug}', function (\App\Models\LessonSection $section) {
return $section;
});
Route::resource('students', StudentController::class);
Route::get('/billing/check-email', [BillingController::class, 'checkEmail'])
->name('billing.check-email');
Route::resource('parents', ParentController::class)->except(['show']);
});
// Student-only
Route::middleware(['auth', 'role:student'])
->prefix('student')
->name('student.')
->group(function () {
Route::get('/{course:slug}/{lesson:slug}', [StudentLessonController::class, 'show'])
->where([
'course' => '[A-Za-z0-9\-]+',
'lesson' => '[A-Za-z0-9\-]+',
])
->name('course.lesson');
Route::get('/dashboard', [StudentDashboardController::class, 'index'])
->name('dashboard');
Route::get('/lessons/{lesson:slug}', [LessonController::class, 'show'])
->name('lessons.show');
Route::get('/courses/{course}', [StudentCourseController::class, 'show'])
->name('courses.show');
Route::get('/calendar', [StudentCalendarController::class, 'index'])
->name('calendar');
Route::get('/bookings/create', [StudentBookingController::class, 'create'])
->name('bookings.create');
Route::get('/bookings/series/create', [StudentBookingController::class, 'createSeries'])
->name('bookings.series.create');
Route::post('/bookings', [StudentBookingController::class, 'store'])
->name('bookings.store');
Route::post('/bookings/series', [StudentBookingController::class, 'storeSeries'])
->name('bookings.series.store');
Route::get('/bookings', [BookingsListController::class, 'index'])
->name('bookings.index');
Route::get('/bookings/{booking}/cancel', [StudentBookingController::class, 'cancelConfirm'])
->name('bookings.cancel.confirm');
Route::post('/bookings/{booking}/cancel', [StudentBookingController::class, 'cancelStore'])
->name('bookings.cancel.store');
Route::post('questions/{course:slug}/{lesson:slug}', [App\Http\Controllers\Student\LessonQuestionController::class, 'store'])
->name('course.lesson.questions.store');
});
Route::get('/', [HomeController::class, 'index'])->name('home');
//Route::get('/', function () {
// return view('welcome');
//});
Route::get('/dashboard', function () {
$user = auth()->user();
// Spatie role checks:
if ($user->hasRole('admin')) {
return redirect()->route('admin.dashboard');
}
// Support either role name you choose for tutors:
if ($user->hasRole('teacher') || $user->hasRole('tutor')) {
return redirect()->route('teacher.dashboard');
}
// default for everyone else
return redirect()->route('student.dashboard');
})->middleware('auth')->name('dashboard');
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
Route::get('/calendar/teacher/{token}.ics', [IcsFeedController::class, 'teacher'])
->name('calendar.teacher.feed')
->withoutMiddleware(['web', \App\Http\Middleware\VerifyCsrfToken::class]);
Route::get('/admin/test', function () {
$user = Auth::user();
if (!$user || $user->email !== 'jollinski@gmail.com') {
abort(403, 'Admins only.');
}
return 'Hello_admin';
})->middleware('auth');
require __DIR__.'/auth.php';