From 7abf3411e88a4b4cd5801e3cc568e8a1f3935581 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:30:30 +0800 Subject: [PATCH 01/18] Update web.php --- routes/web.php | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/web.php b/routes/web.php index 7889ff1..ef17caf 100644 --- a/routes/web.php +++ b/routes/web.php @@ -53,3 +53,4 @@ }); require __DIR__ . '/auth.php'; +require __DIR__.'/student.php'; From 6f03530a253ce15d9e10a05612900bb0f8e6d9e5 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:31:15 +0800 Subject: [PATCH 02/18] Create student.php --- routes/student.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 routes/student.php diff --git a/routes/student.php b/routes/student.php new file mode 100644 index 0000000..5f5fa63 --- /dev/null +++ b/routes/student.php @@ -0,0 +1,24 @@ +prefix('student')->name('student.')->group(function () { + + Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); + + Route::get('/submission', [SubmissionController::class, 'index'])->name('submission'); + Route::post('/submission', [SubmissionController::class, 'store'])->name('submission.store'); + + Route::get('/feedback', [FeedbackController::class, 'index'])->name('feedback'); + + Route::get('/profile', [ProfileController::class, 'edit'])->name('profile'); + Route::post('/profile', [ProfileController::class, 'update'])->name('profile.update'); + + Route::get('/discussion', [DiscussionController::class, 'index'])->name('discussion'); + Route::post('/discussion', [DiscussionController::class, 'store'])->name('discussion.store'); +}); From d95e3b59c675642d1f0d038b338fd007b4363f0e Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:42:02 +0800 Subject: [PATCH 03/18] Create DashController.php --- app/Http/Controllers/Student/DashController.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/Http/Controllers/Student/DashController.php diff --git a/app/Http/Controllers/Student/DashController.php b/app/Http/Controllers/Student/DashController.php new file mode 100644 index 0000000..deda557 --- /dev/null +++ b/app/Http/Controllers/Student/DashController.php @@ -0,0 +1,15 @@ +json($user); + } +} From 69cbeb9f9c0da90b01b7d209e33342e05b97a539 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:42:27 +0800 Subject: [PATCH 04/18] Create SubmissionController.php --- .../Student/SubmissionController.php | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 app/Http/Controllers/Student/SubmissionController.php diff --git a/app/Http/Controllers/Student/SubmissionController.php b/app/Http/Controllers/Student/SubmissionController.php new file mode 100644 index 0000000..f3ad1c0 --- /dev/null +++ b/app/Http/Controllers/Student/SubmissionController.php @@ -0,0 +1,34 @@ +works()->latest()->first(); + return response()->json(['work' => $work]); + } + + public function store(Request $request) + { + $request->validate([ + 'title' => 'required|string|max:255', + 'file' => 'required|file|mimes:pdf,zip|max:10240', // 10MB + ]); + + $path = $request->file('file')->store('submissions'); + + $work = $request->user()->works()->create([ + 'title' => $request->title, + 'file_path' => $path, + ]); + + return response()->json(['message' => 'Submission uploaded successfully.']); + } +} From 038d0022e76d074433bb10f0ffada6f7360d26e7 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:42:48 +0800 Subject: [PATCH 05/18] Create FeedbackController.php --- .../Controllers/Student/FeedbackController.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/Http/Controllers/Student/FeedbackController.php diff --git a/app/Http/Controllers/Student/FeedbackController.php b/app/Http/Controllers/Student/FeedbackController.php new file mode 100644 index 0000000..531d82b --- /dev/null +++ b/app/Http/Controllers/Student/FeedbackController.php @@ -0,0 +1,15 @@ +works()->with('feedback')->get(); + return response()->json(['feedback' => $feedback]); + } +} From 4c01562a3d923e3b42f79635879ba371a62be0cb Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:43:09 +0800 Subject: [PATCH 06/18] Create ProfileController.php --- .../Controllers/Student/ProfileController.php | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 app/Http/Controllers/Student/ProfileController.php diff --git a/app/Http/Controllers/Student/ProfileController.php b/app/Http/Controllers/Student/ProfileController.php new file mode 100644 index 0000000..9858931 --- /dev/null +++ b/app/Http/Controllers/Student/ProfileController.php @@ -0,0 +1,30 @@ +json(Auth::user()); + } + + public function update(Request $request) + { + $user = Auth::user(); + + $request->validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|email|unique:users,email,' . $user->id, + 'phone' => 'nullable|string|max:20', + ]); + + $user->update($request->only('name', 'email', 'phone')); + + return response()->json(['message' => 'Profile updated successfully.']); + } +} From 16dcedf4d5800bead7ca89a8acdaed4aaeee7247 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:43:41 +0800 Subject: [PATCH 07/18] Create DiscussionController.php --- .../Student/DiscussionController.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 app/Http/Controllers/Student/DiscussionController.php diff --git a/app/Http/Controllers/Student/DiscussionController.php b/app/Http/Controllers/Student/DiscussionController.php new file mode 100644 index 0000000..e5945b7 --- /dev/null +++ b/app/Http/Controllers/Student/DiscussionController.php @@ -0,0 +1,31 @@ +latest()->get(); + return response()->json(['messages' => $messages]); + } + + public function store(Request $request) + { + $request->validate([ + 'message' => 'required|string|max:1000', + ]); + + Discussion::create([ + 'user_id' => Auth::id(), + 'message' => $request->message, + ]); + + return response()->json(['message' => 'Message posted.']); + } +} From d7c3d4d2e9a91aef42cf80f72f779c8d2f993d12 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:53:49 +0800 Subject: [PATCH 08/18] Create Work.php --- app/Models/Work.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/Models/Work.php diff --git a/app/Models/Work.php b/app/Models/Work.php new file mode 100644 index 0000000..fd783b3 --- /dev/null +++ b/app/Models/Work.php @@ -0,0 +1,20 @@ +// app/Models/Work.php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Model; + +class Work extends Model +{ + protected $fillable = ['title', 'file_path', 'user_id']; + + public function user() + { + return $this->belongsTo(User::class); + } + + public function feedback() + { + return $this->hasOne(Feedback::class); + } +} From 6ff404a899bec92c79173b491eab05b904547f02 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 09:54:18 +0800 Subject: [PATCH 09/18] Create Discussion.php --- app/Models/Discussion.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/Models/Discussion.php diff --git a/app/Models/Discussion.php b/app/Models/Discussion.php new file mode 100644 index 0000000..69486ae --- /dev/null +++ b/app/Models/Discussion.php @@ -0,0 +1,15 @@ +// app/Models/Discussion.php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Model; + +class Discussion extends Model +{ + protected $fillable = ['user_id', 'message']; + + public function user() + { + return $this->belongsTo(User::class); + } +} From 9209c1f75c0ecf86749cfe7259e59f98b8d97121 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:06:06 +0800 Subject: [PATCH 10/18] Create Dashboard.vue --- resources/js/Pages/Student/Dashboard.vue | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 resources/js/Pages/Student/Dashboard.vue diff --git a/resources/js/Pages/Student/Dashboard.vue b/resources/js/Pages/Student/Dashboard.vue new file mode 100644 index 0000000..f1e1362 --- /dev/null +++ b/resources/js/Pages/Student/Dashboard.vue @@ -0,0 +1,18 @@ + + + From 091365ab90dbd24a8ba366153e029cbb01ae589d Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:06:38 +0800 Subject: [PATCH 11/18] Create Profile.vue --- resources/js/Pages/Student/Profile.vue | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 resources/js/Pages/Student/Profile.vue diff --git a/resources/js/Pages/Student/Profile.vue b/resources/js/Pages/Student/Profile.vue new file mode 100644 index 0000000..c8fa2ea --- /dev/null +++ b/resources/js/Pages/Student/Profile.vue @@ -0,0 +1,30 @@ + + + From 1bd732c578fa3ce5a9481976bdf3b27d7dfb738a Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:07:06 +0800 Subject: [PATCH 12/18] Create Submission.vue --- resources/js/Pages/Student/Submission.vue | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 resources/js/Pages/Student/Submission.vue diff --git a/resources/js/Pages/Student/Submission.vue b/resources/js/Pages/Student/Submission.vue new file mode 100644 index 0000000..459d739 --- /dev/null +++ b/resources/js/Pages/Student/Submission.vue @@ -0,0 +1,29 @@ + + + From f1dc2b2636a5da0451d7a2526f472c928ac361c5 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:07:28 +0800 Subject: [PATCH 13/18] Create Feedback.vue --- resources/js/Pages/Student/Feedback.vue | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 resources/js/Pages/Student/Feedback.vue diff --git a/resources/js/Pages/Student/Feedback.vue b/resources/js/Pages/Student/Feedback.vue new file mode 100644 index 0000000..9122508 --- /dev/null +++ b/resources/js/Pages/Student/Feedback.vue @@ -0,0 +1,25 @@ + + + From eb81b2d10ae8ac0572a3c026bcaf506ebff740a8 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:08:02 +0800 Subject: [PATCH 14/18] Create Discussion.vue --- resources/js/Pages/Student/Discussion.vue | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 resources/js/Pages/Student/Discussion.vue diff --git a/resources/js/Pages/Student/Discussion.vue b/resources/js/Pages/Student/Discussion.vue new file mode 100644 index 0000000..e638352 --- /dev/null +++ b/resources/js/Pages/Student/Discussion.vue @@ -0,0 +1,40 @@ + + + From c7d7192ced6dbdcc08a049fba79cc78a376928ac Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:18:27 +0800 Subject: [PATCH 15/18] Update student.php --- routes/student.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/routes/student.php b/routes/student.php index 5f5fa63..18040e4 100644 --- a/routes/student.php +++ b/routes/student.php @@ -1,24 +1,22 @@ prefix('student')->name('student.')->group(function () { - Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); + // Pages rendered with Vue via Inertia + Route::get('/dashboard', fn() => Inertia::render('Student/Dashboard'))->name('dashboard'); + Route::get('/submission', fn() => Inertia::render('Student/Submission'))->name('submission'); + Route::get('/feedback', fn() => Inertia::render('Student/Feedback'))->name('feedback'); + Route::get('/profile', fn() => Inertia::render('Student/Profile'))->name('profile'); + Route::get('/discussion', fn() => Inertia::render('Student/Discussion'))->name('discussion'); - Route::get('/submission', [SubmissionController::class, 'index'])->name('submission'); + // POST actions handled by controllers Route::post('/submission', [SubmissionController::class, 'store'])->name('submission.store'); - - Route::get('/feedback', [FeedbackController::class, 'index'])->name('feedback'); - - Route::get('/profile', [ProfileController::class, 'edit'])->name('profile'); Route::post('/profile', [ProfileController::class, 'update'])->name('profile.update'); - - Route::get('/discussion', [DiscussionController::class, 'index'])->name('discussion'); Route::post('/discussion', [DiscussionController::class, 'store'])->name('discussion.store'); }); From 2acf891867d50bd9672746d02879cd1ce5e19225 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:21:20 +0800 Subject: [PATCH 16/18] Create RoleMiddleware.php --- app/Http/Middleware/RoleMiddleware.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 app/Http/Middleware/RoleMiddleware.php diff --git a/app/Http/Middleware/RoleMiddleware.php b/app/Http/Middleware/RoleMiddleware.php new file mode 100644 index 0000000..ab432d1 --- /dev/null +++ b/app/Http/Middleware/RoleMiddleware.php @@ -0,0 +1,19 @@ +// app/Http/Middleware/RoleMiddleware.php + +namespace App\Http\Middleware; + +use Closure; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; + +class RoleMiddleware +{ + public function handle(Request $request, Closure $next, $role) + { + if (!Auth::check() || Auth::user()->role !== $role) { + abort(403, 'Unauthorized.'); + } + + return $next($request); + } +} From afb03519d4f034f6a2caeba00fc753dccc0ef1ea Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 10:55:35 +0800 Subject: [PATCH 17/18] Rename DashController.php to DashboardController.php --- .../Student/{DashController.php => DashboardController.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/Http/Controllers/Student/{DashController.php => DashboardController.php} (100%) diff --git a/app/Http/Controllers/Student/DashController.php b/app/Http/Controllers/Student/DashboardController.php similarity index 100% rename from app/Http/Controllers/Student/DashController.php rename to app/Http/Controllers/Student/DashboardController.php From 381b2e3326d1429ab24667dad91cccf208e2f946 Mon Sep 17 00:00:00 2001 From: a1085549 Date: Fri, 6 Jun 2025 11:01:40 +0800 Subject: [PATCH 18/18] Create Kernel.php --- app/Http/Kernel.php | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 app/Http/Kernel.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..c9f5f25 --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,47 @@ + [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + 'throttle:api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + protected \$routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'role' => \App\Http\Middleware\RoleMiddleware::class, // custom role middleware + ]; +}