diff --git a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php index 4c38a420..136e313e 100755 --- a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php @@ -109,6 +109,7 @@ class ClaimRequestController extends Controller 'name' => $new_file_name, 'original_name' => $full_path, 'extension' => $ekstension, + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -134,6 +135,7 @@ class ClaimRequestController extends Controller 'name' => $new_file_name, 'original_name' => $full_path, 'extension' => $ekstension, + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -159,6 +161,7 @@ class ClaimRequestController extends Controller 'name' => $new_file_name, 'original_name' => $full_path, 'extension' => $ekstension, + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, diff --git a/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php b/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php index 52d88d3b..c5616634 100755 --- a/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php +++ b/Modules/Client/Http/Controllers/Api/CorporateCurrentController.php @@ -70,6 +70,7 @@ class CorporateCurrentController extends Controller 'type' => 'avatar', 'name' => File::getFileName('avatar', $corporate->id, $request->file('logo')), 'extension' => $request->file('logo')->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFileAvatar, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 7ff4810e..2f61f0d0 100755 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -162,6 +162,7 @@ class ClaimRequestController extends Controller 'name' => $new_file_name, 'original_name' => $full_path, 'extension' => $ekstension, + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -187,6 +188,7 @@ class ClaimRequestController extends Controller 'name' => $new_file_name, 'original_name' => $full_path, 'extension' => $ekstension, + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -212,6 +214,7 @@ class ClaimRequestController extends Controller 'name' => $new_file_name, 'original_name' => $full_path, 'extension' => $ekstension, + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -303,6 +306,7 @@ class ClaimRequestController extends Controller 'name' => File::getFileName('claim-result', $id, $file), 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -318,6 +322,7 @@ class ClaimRequestController extends Controller 'name' => File::getFileName('claim-diagnosis', $id, $file), 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -333,6 +338,7 @@ class ClaimRequestController extends Controller 'name' => File::getFileName('claim-kondisi', $id, $file), 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, diff --git a/Modules/Internal/Http/Controllers/Api/CorporateController.php b/Modules/Internal/Http/Controllers/Api/CorporateController.php index ab6bdea7..1fb60fa2 100755 --- a/Modules/Internal/Http/Controllers/Api/CorporateController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateController.php @@ -239,6 +239,7 @@ class CorporateController extends Controller 'type' => 'avatar', 'name' => File::getFileName('avatar', $newCorporate->id, $request->file('logo')), 'extension' => $request->file('logo')->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFileAvatar, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -353,6 +354,7 @@ class CorporateController extends Controller 'type' => 'avatar', 'name' => File::getFileName('avatar', $corporate->id, $request->file('logo')), 'extension' => $request->file('logo')->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFileAvatar, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index eabf892a..f309f306 100755 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -542,6 +542,7 @@ class RequestLogController extends Controller 'name' => File::getFileName('final-log-result', $id, $file), 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -558,6 +559,7 @@ class RequestLogController extends Controller 'name' => File::getFileName('final-log-diagnosis', $id, $file), 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -573,6 +575,7 @@ class RequestLogController extends Controller 'name' => File::getFileName('final-log-kondisi', $id, $file), 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -1150,13 +1153,14 @@ class RequestLogController extends Controller $requestLog = RequestLog::findOrFail($id); if ($request->hasFile('result_files')) { foreach ($request->result_files as $file) { - $pathFile = File::storeFile('final-log-result', $id, $file); + $fileData = File::storeFile('final-log-result', $id, $file); $requestLog->files()->updateOrCreate([ 'type' => 'final-log-result', - 'name' => File::getFileName('final-log-result', $id, $file), + 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, + 'source' => env('FILESYSTEM_DISK'), + 'path' => $fileData['path'], 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, 'reason' => $request->reason, @@ -1166,13 +1170,14 @@ class RequestLogController extends Controller if ($request->hasFile('diagnosa_files')) { foreach ($request->diagnosa_files as $file) { - $pathFile = File::storeFile('final-log-diagnosis', $id, $file); + $fileData = File::storeFile('final-log-diagnosis', $id, $file); $requestLog->files()->updateOrCreate([ - 'type' => 'final-log-diagnosis', - 'name' => File::getFileName('final-log-diagnosis', $id, $file), + 'type' => 'final-log-result', + 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, + 'source' => env('FILESYSTEM_DISK'), + 'path' => $fileData['path'], 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, 'reason' => $request->reason, @@ -1182,13 +1187,14 @@ class RequestLogController extends Controller if ($request->hasFile('kondisi_files')) { foreach ($request->kondisi_files as $file) { - $pathFile = File::storeFile('final-log-kondisi', $id, $file); + $fileData = File::storeFile('final-log-kondisi', $id, $file); $requestLog->files()->updateOrCreate([ - 'type' => 'final-log-kondisi', - 'name' => File::getFileName('final-log-kondisi', $id, $file), + 'type' => 'final-log-result', + 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, + 'source' => env('FILESYSTEM_DISK'), + 'path' => $fileData['path'], 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, 'reason' => $request->reason, @@ -1199,29 +1205,96 @@ class RequestLogController extends Controller return Helper::responseJson(data: $request->toArray(), message: 'File Success Uploaded'); } + // public function requestFiles(Request $request, $id) + // { + // Helper::setCustomPHPIniSettings(); + // $requestLog = RequestLog::findOrFail($id); + + // // Daftar file yang akan diproses + // $fileTypes = [ + // 'result_files' => 'final-log-result', + // 'diagnosa_files' => 'final-log-diagnosis', + // 'kondisi_files' => 'final-log-kondisi', + // ]; + + // foreach ($fileTypes as $inputName => $fileType) { + // if ($request->hasFile($inputName)) { + // foreach ($request->file($inputName) as $file) { + // // 1. Panggil method storeFile yang sudah diperbaiki + // $fileData = File::storeFile($fileType, $id, $file); + // dd($fileData); + // // 2. Perbaiki panggilan updateOrCreate + // $requestLog->files()->updateOrCreate( + // [ + // 'original_name' => $file->getClientOriginalName(), + // ], + // [ + // // Array 2: Data untuk di-update atau di-create + // 'name' => $fileData['name'], + // 'original_name' => $file->getClientOriginalName(), + // 'extension' => $file->getClientOriginalExtension(), + // 'source' => 's3', // Langsung set ke 's3' untuk file baru + // 'path' => $fileData['path'], + // 'created_by' => auth()->id(), + // 'updated_by' => auth()->id(), + // 'reason' => $request->reason, + // ] + // ); + // } + // } + // } + + // return Helper::responseJson(data: $requestLog->files, message: 'File Success Uploaded'); + // } + public function deleteFiles(Request $request, $id) { - // Path file yang akan dihapus - $path = 'public/' . $request->path; + // Ambil data file dari database + $file = File::where('path', $request->path)->first(); + + // Tentukan disk berdasarkan source + $disk = $file->source === 's3' ? 's3' : 'local'; - // Menghapus file dari penyimpanan - if (Storage::exists($path)) { - Storage::delete($path); + // Path file sesuai yang disimpan di DB + $path = $file->path; - // Update entri file dari basis data - File::where('path', $request->path)->update([ - 'deleted_at' => Carbon::now(), // Gunakan Carbon untuk mendapatkan tanggal dan waktu saat ini - 'deleted_by' => auth()->user()->id, - 'reason' => $request->reason + // Hapus file dari storage (cek dulu ada atau tidak) + if (Storage::disk($disk)->exists($path)) { + Storage::disk($disk)->delete($path); + + // Update status file di DB (soft delete + reason) + $file->update([ + 'deleted_at' => Carbon::now(), + 'deleted_by' => auth()->id(), + 'reason' => $request->reason, ]); - // Mengembalikan respons JSON sukses - return Helper::responseJson(data: $request->toArray(), message: 'File successfully deleted'); + + return Helper::responseJson( + data: $file->toArray(), + message: 'File successfully deleted' + ); + } else { + // Update status file di DB (soft delete + reason) + $file->update([ + 'deleted_at' => Carbon::now(), + 'deleted_by' => auth()->id(), + 'reason' => $request->reason, + ]); + + return Helper::responseJson( + data: $file->toArray(), + message: 'File successfully deleted' + ); } - // Jika file tidak ditemukan di penyimpanan, kirim respons JSON gagal - return Helper::responseJson(data: $request->toArray(), message: 'File deletion failed'); + // Jika file tidak ditemukan + return Helper::responseJson( + data: $file->toArray(), + message: 'File deletion failed' + ); } + public function cekphp(){ phpinfo(); } diff --git a/Modules/Linksehat/Http/Controllers/Api/PersonController.php b/Modules/Linksehat/Http/Controllers/Api/PersonController.php index 271afa66..e714691b 100755 --- a/Modules/Linksehat/Http/Controllers/Api/PersonController.php +++ b/Modules/Linksehat/Http/Controllers/Api/PersonController.php @@ -129,6 +129,7 @@ class PersonController extends Controller 'type' => 'avatar', 'name' => File::getFileName('avatar', $family->id, $request->file('user_avatar')), 'extension' => $request->file('user_avatar')->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFileAvatar, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, @@ -141,6 +142,7 @@ class PersonController extends Controller 'type' => 'dataDiri', 'name' => File::getFileName('dataDiri', $family->id, $request->file('verification_file')), 'extension' => $request->file('verification_file')->getClientOriginalExtension(), + 'source' => env('FILESYSTEM_DISK'), 'path' => $pathFileVerification, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, diff --git a/app/Models/File.php b/app/Models/File.php index 6b029667..a6adacf9 100755 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -18,16 +18,18 @@ class File extends Model 'name', 'original_name', 'extension', + 'source', 'path', 'created_by', 'updated_by', + 'deleted_at', 'reason' ]; protected $hidden = [ 'created_at', 'updated_at', - 'deleted_at', + // 'deleted_at', 'created_by', 'updated_by', 'deleted_by', @@ -78,20 +80,64 @@ class File extends Model public function getUrlAttribute() { - return url(Storage::url($this->path)); + // Jika path kosong, kembalikan null + if (!$this->path) { + return null; + } + + // Cek nilai 'source'. Jika 's3', gunakan disk S3. + // Selain itu (termasuk null atau 'local'), gunakan disk 'public'. + if ($this->source === 's3') { + try { + return Storage::disk('s3')->temporaryUrl( + $this->path, + now()->addMinutes(60) // expired 1 jam + ); + } catch (\Exception $e) { + return Storage::disk('s3')->url($this->path); // fallback kalau public + } + } + return Storage::disk('public')->url($this->path); } + // public static function storeFile($type, $id, $file) + // { + // // $fileName = self::getFileName($type, $id); + // $fileName = $file->getClientOriginalName(); + // $directory = self::getDirectory($type); + // $extension = $file->getClientOriginalExtension(); + // $path = $directory . $fileName . '.' . $extension; + // $file->storeAs('public/' . $directory, $fileName); + // return $path; + // } + public static function storeFile($type, $id, $file) { - // $fileName = self::getFileName($type, $id); - $fileName = $file->getClientOriginalName(); - $directory = self::getDirectory($type); + // Pastikan directory tidak punya trailing slash + $directory = rtrim(self::getDirectory($type), '/'); + + // Buat nama file yang unik dan aman + $originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $extension = $file->getClientOriginalExtension(); - $path = $directory . $fileName . '.' . $extension; - $file->storeAs('public/' . $directory, $fileName . '.' . $extension); - return $path; + $safeName = Str::slug($originalName); + $uniqueName = $safeName . '-' . uniqid() . '.' . $extension; + + // Upload file ke disk 's3' dengan visibility 'public' + $path = Storage::disk('s3')->putFileAs( + $directory, + $file, + $uniqueName, + 'public' + ); + + // Kembalikan path dan nama unik agar bisa digunakan di controller + return [ + 'path' => $directory . '/' . $uniqueName, // hasil konsisten + 'name' => $uniqueName, + ]; } + public static function storeFileChat($type, $id, $file) { // $fileName = self::getFileName($type, $id); diff --git a/config/filesystems.php b/config/filesystems.php index e9d9dbdb..f533aefe 100755 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -48,7 +48,7 @@ return [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), + 'region' => env('AWS_DEFAULT_REGION', 'ap-southeast-1'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'),