Completed
Push — master ( dc5510...4d2223 )
by CodexShaper
06:27
created

BackupController::backups()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 28
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 17
nc 4
nop 1
dl 0
loc 28
ccs 0
cts 24
cp 0
crap 20
rs 9.7
c 1
b 0
f 0
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
            $files           = $this->getPaginateFiles($request);
37
            $results         = [];
38
            foreach ($files as $file) {
39
                $results[] = (object) [
40
                    'info'         => pathinfo($file),
41
                    'lastModified' => date("F j, Y, g:i a", Storage::lastModified($file)),
42
                    'size'         => Storage::size($file),
43
                ];
44
            }
45
46
            return response()->json([
47
                'success'         => true,
48
                'files'           => $results,
49
                'userPermissions' => $userPermissions,
50
                'pagination'      => $files,
51
            ]);
52
        }
53
54
        return response()->json(['success' => false]);
55
56
    }
57
    /**
58
     * Get Pagination Data
59
     *
60
     * @return \Illuminate\Pagination\LengthAwarePaginator
61
     */
62
    public function getPaginateFiles(Request $request)
63
    {
64
        $driver    = dbm_driver();
65
        $directory = 'backups' . DIRECTORY_SEPARATOR . $driver;
66
        $files     = collect(Storage::allFiles($directory));
67
68
        $query = $request->q;
69
        if (!empty($query)) {
70
            $files = $files->filter(function ($file) use ($query) {
71
                $info = pathinfo($file);
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
     * Create new backup
83
     *
84
     * @return \Illuminate\Http\JsonResponse
85
     */
86
    public function backup(Request $request)
87
    {
88
        if ($request->ajax()) {
89
90
            if (($response = DBM::authorize('backup.create')) !== true) {
91
                return $response;
92
            }
93
94
            try
95
            {
96
                $table = null;
97
98
                if ($request->isTable) {
99
                    $table = $request->table;
100
                }
101
102
                Artisan::call('dbm:backup', [
103
                    '--table' => $table,
104
                ]);
105
106
                return response()->json(['success' => true]);
107
108
            } catch (\Exception $e) {
109
110
                return response()->json([
111
                    'success' => true,
112
                    'errors'  => [$e->getMessage()],
113
                ], 200);
114
            }
115
        }
116
117
        return response()->json(['success' => false]);
118
    }
119
    /**
120
     * Restore from a specific backup
121
     *
122
     * @return \Illuminate\Http\JsonResponse
123
     */
124
    public function restore(Request $request)
125
    {
126
        if ($request->ajax()) {
127
128
            if (($response = DBM::authorize('backup.restore')) !== true) {
129
                return $response;
130
            }
131
132
            try
133
            {
134
                Artisan::call('dbm:restore', [
135
                    '--path' => $request->path,
136
                ]);
137
                return response()->json(['success' => true]);
138
139
            } catch (\Exception $e) {
140
141
                return response()->json([
142
                    'success' => true,
143
                    'errors'  => [$e->getMessage()],
144
                ], 200);
145
            }
146
        }
147
148
        return response()->json(['success' => false]);
149
150
    }
151
    /**
152
     * Return specific backup file for download
153
     *
154
     * @return \Illuminate\Http\JsonResponse
155
     */
156
    public function download(Request $request)
157
    {
158
        if ($request->ajax()) {
159
160
            if (($response = DBM::authorize('backup.download')) !== true) {
161
                return $response;
162
            }
163
164
            try
165
            {
166
                $file = Storage::get($request->path);
167
                return response()->json(['success' => true, 'file' => $file]);
168
169
            } catch (\Exception $e) {
170
171
                return response()->json([
172
                    'success' => true,
173
                    'errors'  => [$e->getMessage()],
174
                ], 200);
175
            }
176
        }
177
178
        return response()->json(['success' => false]);
179
    }
180
    /**
181
     * Remove a backup
182
     *
183
     * @return \Illuminate\Http\JsonResponse
184
     */
185
    public function delete(Request $request)
186
    {
187
        if ($request->ajax()) {
188
189
            if (($response = DBM::authorize('backup.delete')) !== true) {
190
                return $response;
191
            }
192
193
            try
194
            {
195
                Storage::delete($request->path);
196
                return response()->json(['success' => true]);
197
198
            } catch (\Exception $e) {
199
200
                return response()->json([
201
                    'success' => true,
202
                    'errors'  => [$e->getMessage()],
203
                ], 200);
204
            }
205
        }
206
207
        return response()->json(['success' => false]);
208
    }
209
}
210