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