Skip to content

Commit

Permalink
Merge pull request #227 from AndresC1/feature/backup
Browse files Browse the repository at this point in the history
feat: Integracion de backup para la BD
  • Loading branch information
AndresC1 committed Jul 18, 2024
2 parents 728cb9f + 14e29fc commit 2c84aa7
Show file tree
Hide file tree
Showing 8 changed files with 234 additions and 69 deletions.
114 changes: 114 additions & 0 deletions app/Http/Controllers/BackupController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php

namespace App\Http\Controllers;

use App\Http\Requests\Backup\ImportBackupRequest;
use App\Models\Backup;
use Illuminate\Http\Request;

class BackupController extends Controller
{
function exportBackup()
{
$host = env('DB_HOST');
$port = env('DB_PORT');
$database = env('DB_DATABASE');
$user = env('DB_USERNAME');
$password = env('DB_PASSWORD');

$backupName = 'backup_' . now('America/Managua')->format('Y-m-d_His') . '.sql';
$backupPath = storage_path('app/backup/' . $backupName);

$command = "mysqldump -h {$host} -P {$port} -u {$user} -p{$password} {$database} > {$backupPath}";
exec($command);

$fileBackup = Backup::create([
'name' => $backupName,
'path' => $backupPath,
'disk' => 'local',
'size' => round(filesize($backupPath) / 1024 / 1024, 2)."MB",
'type' => 'sql',
'created_at' => now('America/Managua')->format('Y-m-d H:i:s'),
'updated_at' => now('America/Managua')->format('Y-m-d H:i:s')
]);
exec($command);


return response()->json([
'backup' => $fileBackup,
'message' => 'Backup created successfully',
'status' => 200
], 200);
}

function downloadBackup(ImportBackupRequest $request)
{
$request->validated();
$backup = Backup::find($request->backup_id);

if($backup->deleted_at != null){
return response()->json([
'message' => 'Backup not found',
'status' => 400
], 400);
}

return response()->download($backup->path);
}

function listBackups()
{
$backups = Backup::Where('deleted_at', null)->get();

return response()->json([
'backups' => $backups,
'message' => 'Backups obtained successfully',
'status' => 200
], 200);
}

function deleteBackup(ImportBackupRequest $request)
{
$request->validated();
$backup = Backup::find($request->backup_id);

if($backup->deleted_at == null){
$backup->deleted_at = now('America/Managua')->format('Y-m-d H:i:s');
$backup->deleted_by = auth()->user()->id;
$backup->save();
}

return response()->json([
'message' => 'Backup deleted successfully',
'status' => 200
], 200);
}

function restoreBackup(ImportBackupRequest $request)
{
$request->validated();
$backup = Backup::find($request->backup_id);

if($backup->deleted_at != null){
return response()->json([
'message' => 'Backup not found',
'status' => 400
], 400);
}

$host = env('DB_HOST');
$port = env('DB_PORT');
$database = env('DB_DATABASE');
$user = env('DB_USERNAME');
$password = env('DB_PASSWORD');

$command = "mysql -h {$host} -P {$port} -u {$user} -p{$password} {$database} < {$backup->path}";

exec($command);

return response()->json([
'message' => 'Backup restored successfully',
'status' => 200
], 200);
}
}
61 changes: 0 additions & 61 deletions app/Http/Controllers/ExportSQL/ExportSQLController.php

This file was deleted.

42 changes: 42 additions & 0 deletions app/Http/Requests/Backup/ImportBackupRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace App\Http\Requests\Backup;

use Illuminate\Foundation\Http\FormRequest;

class ImportBackupRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
"backup_id" => ["required", "exists:backups,id"],
];
}

/**
* Get the error messages for the defined validation rules.
*
* @return array<string, string>
*/

public function messages(): array
{
return [
"backup_id.required" => "Backup ID is required",
"backup_id.exists" => "Backup not found",
];
}
}
27 changes: 27 additions & 0 deletions app/Models/Backup.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Backup extends Model
{
use HasFactory;

protected $fillable = [
'name',
'path',
'disk',
'size',
'type',
'deleted_at',
'deleted_by',
'created_at',
'updated_at'
];

public function deletedBy(){
return $this->belongsTo(User::class, 'deleted_by');
}
}
4 changes: 4 additions & 0 deletions app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,8 @@ public function sales(){
public function productOutput(){
return $this->hasMany(OutputsProduct::class, 'user_id');
}

public function backup(){
return $this->hasMany(Backup::class, 'deleted_by');
}
}
5 changes: 5 additions & 0 deletions config/database.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
'dump' => [
'dump_binary_path' => '/usr/bin',
'use_single_transaction',
'timeout' => 60 * 5,
]
],

'pgsql' => [
Expand Down
34 changes: 34 additions & 0 deletions database/migrations/2024_07_18_004646_create_backups_table.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('backups', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('path');
$table->string('disk');
$table->string('size');
$table->string('type');
$table->timestamp('deleted_at')->nullable();
$table->foreignId('deleted_by')->nullable()->constrained('users')->cascadeOnDelete()->cascadeOnUpdate();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('backups');
}
};
16 changes: 8 additions & 8 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@
use App\Http\Controllers\DetailsPurchaseController;
use App\Http\Controllers\SaleController;
use App\Http\Controllers\Conversion\ConverterController;
use App\Http\Controllers\ExportSQL\ExportSQLController;
use App\Http\Controllers\ExportarExcel\ExportController;
use App\Http\Controllers\Earning\EarningsController;
use Illuminate\Http\Request;
use App\Http\Controllers\BackupController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Information\AplicationController;

Expand Down Expand Up @@ -184,12 +183,13 @@
Route::get('/list_measurements', [ConverterController::class, "list_units"]);
Route::get('/list_type_measurements', [ConverterController::class, "list_types_measurements"]);
Route::get('/converter', [ConverterController::class, "converter"]);
// Exportar SQL
Route::middleware('check_permission:export_database_for_organization')->prefix('/export')->group(function () {
Route::get('/sql', [ExportSQLController::class, "exportSQLForOrganizations"]);
});
Route::middleware('check_permission:export_database_global')->group(function () {
Route::get('/export_sql', [ExportSQLController::class, "exportSQLGlobal"]);

Route::prefix('backup')->middleware('check_permission:export_database_global')->group(function () {
Route::post('/export', [BackupController::class, "exportBackup"]);
Route::get('/download', [BackupController::class, "downloadBackup"]);
Route::get('/list', [BackupController::class, "listBackups"]);
Route::delete('/delete', [BackupController::class, "deleteBackup"]);
Route::post('/import', [BackupController::class, "restoreBackup"]);
});

//exportar
Expand Down

0 comments on commit 2c84aa7

Please sign in to comment.