Billie/app/Http/Controllers/NodeJS/Student/ProjectController.php

172 lines
8.4 KiB
PHP
Raw Normal View History

2025-05-06 02:47:26 +00:00
<?php
namespace App\Http\Controllers\NodeJS\Student;
use App\Http\Controllers\Controller;
use Exception;
use ZipArchive;
use App\Models\NodeJS\Project;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Symfony\Component\Process\Process;
class ProjectController extends Controller
{
public function index(Request $request)
{
$projects = Project::all();
return view('nodejs.projects.index', compact('projects'));
}
public function show(Request $request, $project_id)
{
$project = Project::find($project_id);
if (!$project) {
return redirect()->route('projects');
}
return view('nodejs.projects.show', compact('project'));
}
public function showPDF(Request $request)
{
if ($request->ajax()) {
if ($request->id) {
2025-05-06 03:25:09 +00:00
$media = Media::find($request->id);
2025-05-06 02:47:26 +00:00
if ($media) {
$path = $media->getUrl();
return response()->json($path, 200);
}
return response()->json(["message" => "media not found"], 404);
}
return response()->json(["message" => "no media was requested"], 400);
}
}
public function download(Request $request, $project_id)
{
if ($request->ajax()) {
$project = Project::find($project_id);
if (!$project) {
return response()->json(["message" => "project not found"], 404);
}
if ($request->type) {
switch ($request->type) {
case 'guides':
$zipMedia = $project->getMedia('project_zips')->where('file_name', 'guides.zip')->first();
if ($zipMedia) {
return response()->json($zipMedia->getUrl(), 200);
} else {
$guides = $project->getMedia('project_guides');
2025-05-06 03:25:09 +00:00
$tempDir = storage_path('app/public/assets/projects/' . $project->title . '/zips');
2025-05-06 02:47:26 +00:00
if (!is_dir($tempDir)) mkdir($tempDir);
foreach ($guides as $guide) {
$path = $guide->getPath();
$filename = $guide->file_name;
copy($path, $tempDir . '/' . $filename);
}
$zipPath = $tempDir . '/guides.zip';
$zip = new ZipArchive;
if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) {
2025-05-06 03:25:09 +00:00
$files = Storage::files('public/assets/projects/' . $project->title . '/zips');
2025-05-06 02:47:26 +00:00
foreach ($files as $file) {
$zip->addFile(storage_path('app/' . $file), basename($file));
}
$zip->close();
foreach ($files as $file) {
unlink(storage_path('app/' . $file));
}
} else {
throw new Exception('Failed to create zip archive');
}
2025-05-06 03:25:09 +00:00
$media = $project->addMedia($zipPath)->toMediaCollection('project_zips', 'public_projects_files');
2025-05-06 02:47:26 +00:00
return response()->json($media->getUrl(), 200);
}
break;
case 'supplements':
$zipMedia = $project->getMedia('project_zips')->where('file_name', 'supplements.zip')->first();
if ($zipMedia) {
return response()->json($zipMedia->getUrl(), 200);
} else {
$supplements = $project->getMedia('project_supplements');
2025-05-06 03:25:09 +00:00
$tempDir = storage_path('app/public/assets/projects/' . $project->title . '/zips');
2025-05-06 02:47:26 +00:00
if (!is_dir($tempDir)) mkdir($tempDir);
foreach ($supplements as $supplement) {
$path = $supplement->getPath();
$filename = $supplement->file_name;
copy($path, $tempDir . '/' . $filename);
}
$zipPath = $tempDir . '/supplements.zip';
$zip = new ZipArchive;
if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) {
2025-05-06 03:25:09 +00:00
$files = Storage::files('public/assets/projects/' . $project->title . '/zips');
2025-05-06 02:47:26 +00:00
foreach ($files as $file) {
$zip->addFile(storage_path('app/' . $file), basename($file));
}
$zip->close();
foreach ($files as $file) {
unlink(storage_path('app/' . $file));
}
} else {
throw new Exception('Failed to create zip archive');
}
2025-05-06 03:25:09 +00:00
$media = $project->addMedia($zipPath)->toMediaCollection('project_zips', 'public_projects_files');
2025-05-06 02:47:26 +00:00
return response()->json($media->getUrl(), 200);
}
break;
case 'tests':
$zipMedia = $project->getMedia('project_zips')->where('file_name', 'tests.zip')->first();
if ($zipMedia) {
return response()->json($zipMedia->getUrl(), 200);
} else {
2025-05-26 14:35:46 +00:00
// Perbaiki collection name sesuai database
$tests = $project->getMedia('project_tests');
// Tambahkan pengecekan apakah ada file tests
if (count($tests) === 0) {
return response()->json(["message" => "no tests available"], 404);
}
2025-05-06 02:47:26 +00:00
2025-05-06 03:25:09 +00:00
$tempDir = storage_path('app/public/assets/projects/' . $project->title . '/zips');
2025-05-06 02:47:26 +00:00
if (!is_dir($tempDir)) mkdir($tempDir);
2025-05-26 14:35:46 +00:00
// Copy semua file tests ke tempDir
foreach ($tests as $test) {
2025-05-06 02:47:26 +00:00
$path = $test->getPath();
$filename = $test->file_name;
2025-05-26 14:35:46 +00:00
copy($path, $tempDir . '/' . $filename);
2025-05-06 02:47:26 +00:00
}
$zipPath = $tempDir . '/tests.zip';
$zip = new ZipArchive;
if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) {
2025-05-26 14:35:46 +00:00
$files = Storage::files('public/assets/projects/' . $project->title . '/zips');
foreach ($files as $file) {
// Skip jika file adalah zip itu sendiri
if (basename(storage_path('app/' . $file)) !== 'tests.zip') {
$zip->addFile(storage_path('app/' . $file), basename($file));
}
2025-05-06 02:47:26 +00:00
}
$zip->close();
2025-05-26 14:35:46 +00:00
// Hapus file individual setelah di-zip
foreach ($files as $file) {
if (basename(storage_path('app/' . $file)) !== 'tests.zip') {
unlink(storage_path('app/' . $file));
}
}
2025-05-06 02:47:26 +00:00
} else {
throw new Exception('Failed to create zip archive');
}
2025-05-06 03:25:09 +00:00
$media = $project->addMedia($zipPath)->toMediaCollection('project_zips', 'public_projects_files');
2025-05-06 02:47:26 +00:00
return response()->json($media->getUrl(), 200);
}
break;
}
} else {
return response()->json(["message" => "no type was requested"], 400);
}
}
}
}