From 32409ce1d0b9fa9dbab1eda8dc3a2ce7f3d2011a Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Thu, 17 Aug 2017 07:03:48 +0800 Subject: [PATCH] Added backup feature and restructure user action button to partial --- app/Helpers/functions.php | 31 ++++++ app/Http/Controllers/BackupsController.php | 85 ++++++++++++++ app/Providers/AppServiceProvider.php | 2 + composer.json | 1 + composer.lock | 124 ++++++++++++++++++++- config/app.php | 1 + resources/views/backups/forms.blade.php | 65 +++++++++++ resources/views/backups/index.blade.php | 54 +++++++++ resources/views/users/chart.blade.php | 4 +- resources/views/users/edit.blade.php | 6 +- .../views/users/partials/action-buttons.blade.php | 8 ++ resources/views/users/partials/childs.blade.php | 2 +- resources/views/users/show.blade.php | 8 +- resources/views/users/tree.blade.php | 4 +- routes/web.php | 8 ++ 15 files changed, 385 insertions(+), 18 deletions(-) create mode 100644 app/Helpers/functions.php create mode 100644 app/Http/Controllers/BackupsController.php create mode 100644 resources/views/backups/forms.blade.php create mode 100755 resources/views/backups/index.blade.php create mode 100644 resources/views/users/partials/action-buttons.blade.php diff --git a/app/Helpers/functions.php b/app/Helpers/functions.php new file mode 100644 index 0000000..5986646 --- /dev/null +++ b/app/Helpers/functions.php @@ -0,0 +1,31 @@ += 1073741824) + { + $bytes = number_format($bytes / 1073741824, 2) . ' GB'; + } + elseif ($bytes >= 1048576) + { + $bytes = number_format($bytes / 1048576, 2) . ' MB'; + } + elseif ($bytes >= 1024) + { + $bytes = number_format($bytes / 1024, 2) . ' KB'; + } + elseif ($bytes > 1) + { + $bytes = $bytes . ' bytes'; + } + elseif ($bytes == 1) + { + $bytes = $bytes . ' byte'; + } + else + { + $bytes = '0 bytes'; + } + + return $bytes; +} \ No newline at end of file diff --git a/app/Http/Controllers/BackupsController.php b/app/Http/Controllers/BackupsController.php new file mode 100644 index 0000000..c9fd634 --- /dev/null +++ b/app/Http/Controllers/BackupsController.php @@ -0,0 +1,85 @@ +getMTime(), $b->getMTime()); + }); + } + + return view('backups.index',compact('backups')); + } + + public function store(Request $request) + { + $this->validate($request, [ + 'file_name' => 'nullable|max:30|regex:/^[\w._-]+$/' + ]); + + try { + $manager = app()->make(Manager::class); + $fileName = $request->get('file_name') ?: date('Y-m-d_Hi'); + + $manager->makeBackup()->run('mysql', [ + new Destination('local', 'backup/db/' . $fileName) + ], 'gzip'); + + return redirect()->route('backups.index'); + } catch (FileExistsException $e) { + return redirect()->route('backups.index'); + } + } + + public function destroy($fileName) + { + if (file_exists(storage_path('app/backup/db/') . $fileName)) { + unlink(storage_path('app/backup/db/') . $fileName); + } + return redirect()->route('backups.index'); + } + + public function download($fileName) + { + return response()->download(storage_path('app/backup/db/') . $fileName); + } + + public function restore($fileName) + { + try { + $manager = app()->make(Manager::class); + $manager->makeRestore()->run('local', 'backup/db/' . $fileName, 'mysql', 'gzip'); + } catch (FileNotFoundException $e) {} + + return redirect()->route('backups.index'); + } + + public function upload(BackupUploadRequest $request) + { + $file = $request->file('backup_file'); + + if (file_exists(storage_path('app/backup/db/') . $file->getClientOriginalName()) == false) { + $file->storeAs('backup/db', $file->getClientOriginalName()); + } + + return redirect()->route('backups.index'); + } + +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index f5e3212..3a88480 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,6 +13,8 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { + require_once app_path() . '/Helpers/functions.php'; + // Always redirect to https. if($this->app->environment() === 'production') { $this->app['request']->server->set('HTTPS', true); diff --git a/composer.json b/composer.json index 06275cc..1768260 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "type": "project", "require": { "php": ">=5.6.4", + "backup-manager/laravel": "^1.2", "laravel/framework": "5.4.*", "laravel/tinker": "~1.0", "luthfi/formfield": "^0.1.6" diff --git a/composer.lock b/composer.lock index 679a507..192c3e9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,131 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "07477f8810af9f131f85a76202d51325", + "content-hash": "bc9e15954b41c3284e71738afec16a04", "packages": [ { + "name": "backup-manager/backup-manager", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/backup-manager/backup-manager.git", + "reference": "9e53714a993135f57fe2bff001203b6f75c2387c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/backup-manager/backup-manager/zipball/9e53714a993135f57fe2bff001203b6f75c2387c", + "reference": "9e53714a993135f57fe2bff001203b6f75c2387c", + "shasum": "" + }, + "require": { + "league/flysystem": "~1.0", + "php": ">=5.5.9", + "symfony/process": "~2.1|~3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "dropbox/dropbox-sdk": "~1.1", + "league/flysystem-aws-s3-v3": "~1.0", + "league/flysystem-dropbox": "~1.0", + "league/flysystem-rackspace": "~1.0", + "league/flysystem-sftp": "~1.0", + "mockery/mockery": "~0.9", + "phpspec/phpspec": "~2.1", + "satooshi/php-coveralls": "~0.6" + }, + "suggest": { + "league/flysystem-aws-s3-v3": "AwsS3 and GoogleCS adapter support.", + "league/flysystem-dropbox": "Dropbox adapter support.", + "league/flysystem-rackspace": "Rackspace adapter support.", + "league/flysystem-sftp": "Sftp adapter support." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "BackupManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Shawn McCool", + "email": "shawn@heybigname.com", + "homepage": "http://heybigname.com/" + }, + { + "name": "Mitchell van Wijngaarden", + "email": "mitchell@kooding.nl", + "homepage": "http://heybigname.com/" + } + ], + "description": "A framework agnostic database backup manager with user-definable procedures and support for S3, Dropbox, FTP, SFTP, and more with drivers for popular frameworks.", + "time": "2017-01-05T12:10:13+00:00" + }, + { + "name": "backup-manager/laravel", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/backup-manager/laravel.git", + "reference": "343885742036ff6a20850190c9bfcfa697087a94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/backup-manager/laravel/zipball/343885742036ff6a20850190c9bfcfa697087a94", + "reference": "343885742036ff6a20850190c9bfcfa697087a94", + "shasum": "" + }, + "require": { + "backup-manager/backup-manager": "^1.0", + "illuminate/console": "^4.0||^5.0", + "illuminate/container": "^4.0||^5.0", + "illuminate/support": "^4.0||^5.0", + "php": ">=5.5.0", + "symfony/process": "^2.0||^3.0" + }, + "require-dev": { + "mockery/mockery": "dev-master", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "BackupManager\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Shawn McCool", + "email": "shawn@heybigname.com", + "homepage": "http://heybigname.com/" + }, + { + "name": "Mitchell van Wijngaarden", + "email": "mitchell@kooding.nl", + "homepage": "http://heybigname.com/" + } + ], + "description": "Database backup manager seamlessly integrated with Laravel 4 or 5 with user-definable procedures and support for S3, Dropbox, FTP, SFTP, and more.", + "time": "2017-07-31T12:23:01+00:00" + }, + { "name": "dnoegel/php-xdg-base-dir", "version": "0.1", "source": { diff --git a/config/app.php b/config/app.php index 653c78b..4f44f70 100644 --- a/config/app.php +++ b/config/app.php @@ -166,6 +166,7 @@ return [ /* * Package Service Providers... */ + BackupManager\Laravel\Laravel5ServiceProvider::class, Laravel\Tinker\TinkerServiceProvider::class, Luthfi\FormField\FormFieldServiceProvider::class, Barryvdh\Debugbar\ServiceProvider::class, diff --git a/resources/views/backups/forms.blade.php b/resources/views/backups/forms.blade.php new file mode 100644 index 0000000..88495b4 --- /dev/null +++ b/resources/views/backups/forms.blade.php @@ -0,0 +1,65 @@ +@if (Request::get('action') == 'delete' && Request::has('file_name')) +
+
+

{{ trans('backup.delete') }}

+
+
+

{!! trans('backup.sure_to_delete_file', ['filename' => Request::get('file_name')]) !!}

+
+ +
+@endif +@if (Request::get('action') == 'restore' && Request::has('file_name')) +
+

{{ trans('backup.restore') }}

+
+

{!! trans('backup.sure_to_restore', ['filename' => Request::get('file_name')]) !!}

+
+ +
+@endif +
+
+
+ {{ csrf_field() }} +
+ + + {!! $errors->first('file_name', '
:message
') !!} +
+
+ +
+
+
+
+ {{ csrf_field() }} +
+ + + {!! $errors->first('backup_file', '
:message
') !!} +
+
+ +
+
+
+
\ No newline at end of file diff --git a/resources/views/backups/index.blade.php b/resources/views/backups/index.blade.php new file mode 100755 index 0000000..d8e87c1 --- /dev/null +++ b/resources/views/backups/index.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.app') + +@section('title',trans('backup.index_title')) + +@section('content') +

{{ trans('backup.index_title') }}

+
+
+
+

{{ trans('backup.list') }}

+ + + + + + + + + + @forelse($backups as $key => $backup) + + + + + + + + @empty + + + + @endforelse + +
#{{ trans('backup.file_name') }}{{ trans('backup.file_size') }}{{ trans('backup.created_at') }}{{ trans('backup.actions') }}
{{ $key + 1 }}{{ $backup->getFilename() }}{{ formatSizeUnits($backup->getSize()) }}{{ date('Y-m-d H:i:s', $backup->getMTime()) }} + Restore + Download + Delete +
{{ trans('backup.empty') }}
+
+
+
+ @include('backups.forms') +
+
+@endsection diff --git a/resources/views/users/chart.blade.php b/resources/views/users/chart.blade.php index f2488a7..bf2c656 100644 --- a/resources/views/users/chart.blade.php +++ b/resources/views/users/chart.blade.php @@ -4,9 +4,7 @@

-
- {{ link_to_route('users.show', 'Lihat Profil '.$user->name, [$user->id], ['class' => 'btn btn-default']) }} -
+ @include('users.partials.action-buttons') {{ $user->name }} Bagan Keluarga

diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index a2e0f57..63ab744 100644 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -7,7 +7,7 @@
Edit Profil {{ $user->profileLink() }} - {{ Form::model($user, ['route' => ['users.update', $user->id], 'method' =>'patch']) }} + {{ Form::model($user, ['route' => ['users.update', $user->id], 'method' =>'patch', 'autocomplete' => 'nope']) }}
@@ -40,8 +40,8 @@

Akun Login

- {!! FormField::email('email', ['label' => 'Email', 'placeholder' => 'Misal: nama@mail.com']) !!} - {!! FormField::password('password', ['label' => 'Password', 'placeholder' => '******']) !!} + {!! FormField::email('email', ['label' => 'Email', 'placeholder' => 'Misal: nama@mail.com', 'autocomplete' => 'off']) !!} + {!! FormField::password('password', ['label' => 'Password', 'placeholder' => '******', 'autocomplete' => 'off']) !!}
diff --git a/resources/views/users/partials/action-buttons.blade.php b/resources/views/users/partials/action-buttons.blade.php new file mode 100644 index 0000000..133d78f --- /dev/null +++ b/resources/views/users/partials/action-buttons.blade.php @@ -0,0 +1,8 @@ +
+ @can ('edit', $user) + {{ link_to_route('users.edit', 'Edit Data', [$user->id], ['class' => 'btn btn-warning']) }} + @endcan + {{ link_to_route('users.show', 'Lihat Profil '.$user->name, [$user->id], ['class' => Request::segment(3) == null ? 'btn btn-default active' : 'btn btn-default']) }} + {{ link_to_route('users.chart', 'Lihat Bagan Keluarga', [$user->id], ['class' => Request::segment(3) == 'chart' ? 'btn btn-default active' : 'btn btn-default']) }} + {{ link_to_route('users.tree', 'Lihat Pohon Keluarga', [$user->id], ['class' => Request::segment(3) == 'tree' ? 'btn btn-default active' : 'btn btn-default']) }} +
\ No newline at end of file diff --git a/resources/views/users/partials/childs.blade.php b/resources/views/users/partials/childs.blade.php index 3b6d899..37377c8 100644 --- a/resources/views/users/partials/childs.blade.php +++ b/resources/views/users/partials/childs.blade.php @@ -5,7 +5,7 @@ {{ link_to_route('users.show', 'Tambah Anak', [$user->id, 'action' => 'add_child'], ['class' => 'btn btn-success btn-xs']) }}
@endcan -

Anak-Anak

+

Anak-Anak ({{ $user->childs->count() }})