academy/app/Http/Controllers/adminmycoursesController.php

231 lines
7.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use App\Models\CourseAssignStudent;
use App\Models\Course;
use App\Models\studentDetails;
use Illuminate\Support\Facades\Schema;
class adminmycoursesController extends Controller
{
public function index()
{
if (!session()->has('admin_id')) {
return redirect('/admin/login')->with('error', 'Please login first!');
}
// Fetch courses and manually attach modules to each course object
$courses = DB::table('courses')->orderBy('id', 'desc')->get();
foreach ($courses as $course) {
$course->modules = DB::table('course_modules')
->where('course_id', $course->id)
->orderBy('semester', 'asc')
->orderBy('id', 'asc')
->get();
}
// Needed for the "Assign Course to Students" modal on this page
$students = studentDetails::all();
return view('admin.adminmycourses', compact('courses', 'students'));
}
// --- COURSE CRUD METHODS ---
public function store(Request $request)
{
$request->validate([
'title' => 'required|string|max:255',
'course_code' => 'required|string|max:50',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:2048',
'duration' => 'required|string',
'level' => 'required|string',
'author' => 'nullable|string',
'desc' => 'nullable|string',
'status' => 'required|string',
]);
$imagePath = null;
if ($request->hasFile('image')) {
$imagePath = $request->file('image')->store('courses', 'public');
}
DB::table('courses')->insert([
'title' => $request->title,
'course_code' => $request->course_code,
'image' => $imagePath,
'duration' => $request->duration,
'level' => $request->level,
'author' => $request->author ?? 'Admin',
'desc' => $request->desc,
'student' => $request->student ?? 0,
'rating' => $request->rating ?? 0.0,
'badge' => $request->badge,
'trending' => $request->has('trending') ? 1 : 0,
'status' => $request->status,
'created_at' => now(),
'updated_at' => now(),
]);
return redirect()->back()->with('success', 'Course added successfully!');
}
public function update(Request $request, $id)
{
$request->validate([
'title' => 'required|string|max:255',
'course_code' => 'required|string|max:50',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:2048',
'duration' => 'required|string',
'level' => 'required|string',
'status' => 'required|string',
]);
$course = DB::table('courses')->where('id', $id)->first();
if (!$course) {
return redirect()->back()->with('error', 'Course not found!');
}
$imagePath = $course->image;
if ($request->hasFile('image')) {
if ($course->image && Storage::disk('public')->exists($course->image)) {
Storage::disk('public')->delete($course->image);
}
$imagePath = $request->file('image')->store('courses', 'public');
}
DB::table('courses')->where('id', $id)->update([
'title' => $request->title,
'course_code' => $request->course_code,
'image' => $imagePath,
'duration' => $request->duration,
'level' => $request->level,
'author' => $request->author ?? $course->author ?? 'Admin',
'desc' => $request->desc ?? $request->description ?? $course->desc,
'badge' => $request->badge ?? $course->badge,
'trending' => $request->has('trending') ? 1 : 0,
'status' => $request->status,
'updated_at' => now(),
]);
return redirect()->back()->with('success', 'Course updated successfully!');
}
public function destroy($id)
{
$course = DB::table('courses')->where('id', $id)->first();
if ($course) {
if ($course->image && Storage::disk('public')->exists($course->image)) {
Storage::disk('public')->delete($course->image);
}
// Clean up related modules
DB::table('course_modules')->where('course_id', $id)->delete();
DB::table('courses')->where('id', $id)->delete();
return redirect()->back()->with('success', 'Course deleted successfully!');
}
return redirect()->back()->with('error', 'Course not found!');
}
// --- MODULE CRUD METHODS ---
public function storeModule(Request $request)
{
$request->validate([
'course_id' => 'required',
'module_code' => 'required|string|max:50',
'title' => 'required|string|max:255',
'semester' => 'required|string',
'credits' => 'nullable|integer',
'description' => 'nullable|string',
]);
DB::table('course_modules')->insert([
'course_id' => $request->course_id,
'module_code' => $request->module_code,
'title' => $request->title,
'semester' => $request->semester,
'credits' => $request->credits,
'description' => $request->description,
'created_at' => now(),
'updated_at' => now(),
]);
return redirect()->back()->with('success', 'Module added successfully!');
}
public function updateModule(Request $request, $id)
{
$request->validate([
'module_code' => 'required|string|max:50',
'title' => 'required|string|max:255',
'semester' => 'required|string',
'credits' => 'nullable|integer',
'description' => 'nullable|string',
]);
DB::table('course_modules')->where('id', $id)->update([
'module_code' => $request->module_code,
'title' => $request->title,
'semester' => $request->semester,
'credits' => $request->credits,
'description' => $request->description,
'updated_at' => now(),
]);
return redirect()->back()->with('success', 'Module updated successfully!');
}
public function destroyModule($id)
{
DB::table('course_modules')->where('id', $id)->delete();
return redirect()->back()->with('success', 'Module deleted successfully!');
}
// --- ASSIGN COURSE TO STUDENTS ---
/**
* Handles the POST from the "Assign Course to Students" modal.
* Route name: assign.course
*/
public function assignCourse(Request $request)
{
$request->validate([
'course_id' => 'required|exists:courses,id',
'student_ids' => 'required|array|min:1',
'student_ids.*' => 'exists:student_details,id',
]);
foreach ($request->student_ids as $studentId) {
CourseAssignStudent::updateOrCreate(
[
'course_id' => $request->course_id,
'student_id' => $studentId,
]
);
// CourseAssignStudent::updateOrCreate(
// [
// 'course_id' => $request->course_id,
// 'student_id' => $studentId,
// ],
// [
// 'assigned_at' => now(),
// ]
// );
}
return redirect()->back()->with('success', 'Course assigned to selected students successfully!');
}
}
Schema::getColumnListing('course_assign_student');