Files
lis/htdocs/app/Http/Controllers/JsonTransferController.php
Duidev Software House 5d172ab337 Update
2025-10-14 07:59:56 +07:00

125 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Response;
use ZipArchive;
class JsonTransferController extends Controller
{
protected $exportPath = 'database/seeders/data/';
public function index()
{
//POSTGRESS
$tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
$tableNames = array_map(fn($t) => $t->tablename, $tables);
//MYSQL
//$tables = DB::select('SHOW TABLES');
//$tableNames = array_map('current', $tables);
$tableInfo = [];
foreach ($tableNames as $table) {
$filePath = base_path($this->exportPath . $table . '.json');
$fileSize = file_exists($filePath) ? filesize($filePath) : null;
$tableInfo[] = [
'name' => $table,
'size' => $fileSize,
];
}
return view('backup', compact('tableInfo'));
}
public function generate()
{
//POSTGRESS
$tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
$tableNames = array_map(fn($t) => $t->tablename, $tables);
//MYSQL
//$tables = DB::select('SHOW TABLES');
//$tableNames = array_map('current', $tables);
foreach ($tableNames as $table) {
try {
$data = DB::table($table)->get();
$json = json_encode($data, JSON_PRETTY_PRINT);
file_put_contents(base_path($this->exportPath . $table . '.json'), $json);
} catch (\Exception $e) {
// Bisa log error-nya atau skip tabel ini
\Log::warning("Gagal ekspor tabel $table: " . $e->getMessage());
continue;
}
}
return redirect()->back()->with('success', 'Semua tabel berhasil diekspor.');
}
public function downloadTable($table)
{
$file = base_path($this->exportPath . $table . '.json');
if (!file_exists($file)) {
return abort(404, 'File tidak ditemukan.');
}
return response()->download($file);
}
public function downloadAll()
{
$zipFile = base_path('database/seeders/data/all_json.zip');
$zip = new ZipArchive;
File::delete($zipFile);
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
foreach (File::files(base_path($this->exportPath)) as $file) {
$zip->addFile($file->getRealPath(), basename($file));
}
$zip->close();
}
return response()->download($zipFile);
}
public function importTable($table)
{
$path = base_path($this->exportPath . $table . '.json');
if (!file_exists($path)) {
return redirect()->back()->with('error', "File JSON untuk tabel $table tidak ditemukan.");
}
$json = file_get_contents($path);
$data = json_decode($json, true);
if (!is_array($data)) {
return redirect()->back()->with('error', "File JSON untuk tabel $table tidak valid.");
}
try {
DB::beginTransaction();
// Kosongkan tabel sebelum import (opsional, hati-hati!)
DB::table($table)->truncate();
$chunks = array_chunk($data, 200); // ubah 1000 sesuai kemampuan server
foreach ($chunks as $chunk) {
DB::table($table)->insert($chunk);
}
DB::commit();
return redirect()->back()->with('success', "Data untuk tabel $table berhasil di-import.");
} catch (\Exception $e) {
DB::rollBack();
return redirect()->back()->with('error', "Gagal import tabel $table: " . $e->getMessage());
}
}
}