Completed
Push — master ( 0b4fd8...dc5510 )
by CodexShaper
06:02
created

BackupController::backups()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 43
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 28
c 1
b 0
f 0
nc 6
nop 1
dl 0
loc 43
ccs 0
cts 36
cp 0
crap 42
rs 8.8497
1
<?php
2
3
namespace CodexShaper\DBM\Http\Controllers;
4
5
use CodexShaper\DBM\Database\Schema\Table;
6
use CodexShaper\DBM\Facades\Manager as DBM;
7
use Illuminate\Http\Request;
8
use Illuminate\Support\Facades\Artisan;
9
use Illuminate\Support\Facades\Storage;
10
11
class BackupController extends Controller
12
{
13
    /**
14
     * Load backups
15
     *
16
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
17
     */
18
    public function index()
19
    {
20
        return view('dbm::app');
21
    }
22
    /**
23
     * Get all backup files
24
     *
25
     * @return \Illuminate\Http\JsonResponse
26
     */
27
    public function backups(Request $request)
28
    {
29
        if ($request->ajax()) {
30
31
            if (($response = DBM::authorize('backup.browse')) !== true) {
32
                return $response;
33
            }
34
35
            $userPermissions = DBM::userPermissions();
36
            $driver          = dbm_driver();
37
            $directory       = 'backups' . DIRECTORY_SEPARATOR . $driver;
38
            $page            = (int) $request->page ?: 1;
39
            $files           = collect(Storage::allFiles($directory));
40
            $query           = $request->q;
41
            if (!empty($query)) {
42
                $files = $files->filter(function ($file) use ($query) {
43
                    $info = pathinfo($file);
44
                    return false !== stristr($info['basename'], $query);
45
                });
46
            }
47
            $perPage = (int) $request->perPage;
48
            $slice   = $files->slice(($page - 1) * $perPage, $perPage);
49
50
            $files = new \Illuminate\Pagination\LengthAwarePaginator($slice, $files->count(), $perPage);
51
52
            $results = [];
53
            foreach ($files as $file) {
54
                $results[] = (object) [
55
                    'info'         => pathinfo($file),
56
                    'lastModified' => date("F j, Y, g:i a", Storage::lastModified($file)),
57
                    'size'         => Storage::size($file),
58
                ];
59
            }
60
61
            return response()->json([
62
                'success'         => true,
63
                'files'           => $results,
64
                'userPermissions' => $userPermissions,
65
                'pagination'      => $files,
66
            ]);
67
        }
68
69
        return response()->json(['success' => false]);
70
71
    }
72
    /**
73
     * Create new backup
74
     *
75
     * @return \Illuminate\Http\JsonResponse
76
     */
77
    public function backup(Request $request)
78
    {
79
        if ($request->ajax()) {
80
81
            if (($response = DBM::authorize('backup.create')) !== true) {
82
                return $response;
83
            }
84
85
            try
86
            {
87
                $table = null;
88
89
                if ($request->isTable) {
90
                    $table = $request->table;
91
                }
92
93
                Artisan::call('dbm:backup', [
94
                    '--table' => $table,
95
                ]);
96
97
                return response()->json(['success' => true]);
98
99
            } catch (\Exception $e) {
100
101
                return response()->json([
102
                    'success' => true,
103
                    'errors'  => [$e->getMessage()],
104
                ], 200);
105
            }
106
        }
107
108
        return response()->json(['success' => false]);
109
    }
110
    /**
111
     * Restore from a specific backup
112
     *
113
     * @return \Illuminate\Http\JsonResponse
114
     */
115
    public function restore(Request $request)
116
    {
117
        if ($request->ajax()) {
118
119
            if (($response = DBM::authorize('backup.restore')) !== true) {
120
                return $response;
121
            }
122
123
            try
124
            {
125
                Artisan::call('dbm:restore', [
126
                    '--path' => $request->path,
127
                ]);
128
                return response()->json(['success' => true]);
129
130
            } catch (\Exception $e) {
131
132
                return response()->json([
133
                    'success' => true,
134
                    'errors'  => [$e->getMessage()],
135
                ], 200);
136
            }
137
        }
138
139
        return response()->json(['success' => false]);
140
141
    }
142
    /**
143
     * Return specific backup file for download
144
     *
145
     * @return \Illuminate\Http\JsonResponse
146
     */
147
    public function download(Request $request)
148
    {
149
        if ($request->ajax()) {
150
151
            if (($response = DBM::authorize('backup.download')) !== true) {
152
                return $response;
153
            }
154
155
            try
156
            {
157
                $file = Storage::get($request->path);
158
                return response()->json(['success' => true, 'file' => $file]);
159
160
            } catch (\Exception $e) {
161
162
                return response()->json([
163
                    'success' => true,
164
                    'errors'  => [$e->getMessage()],
165
                ], 200);
166
            }
167
        }
168
169
        return response()->json(['success' => false]);
170
    }
171
    /**
172
     * Remove a backup
173
     *
174
     * @return \Illuminate\Http\JsonResponse
175
     */
176
    public function delete(Request $request)
177
    {
178
        if ($request->ajax()) {
179
180
            if (($response = DBM::authorize('backup.delete')) !== true) {
181
                return $response;
182
            }
183
184
            try
185
            {
186
                Storage::delete($request->path);
187
                return response()->json(['success' => true]);
188
189
            } catch (\Exception $e) {
190
191
                return response()->json([
192
                    'success' => true,
193
                    'errors'  => [$e->getMessage()],
194
                ], 200);
195
            }
196
        }
197
198
        return response()->json(['success' => false]);
199
    }
200
}
201