Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
MediaController
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 4
272
0.00% covered (danger)
0.00%
0 / 1
 index
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
90
 upload
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
6
 destroy
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 bulkDelete
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Http\Controllers\admin;
4
5use App\Http\Controllers\Controller;
6use App\Models\Media;
7use Illuminate\Http\Request;
8use Illuminate\Support\Str;
9
10class MediaController extends Controller
11{
12    public function index(Request $request)
13    {
14        if ($request->ajax()) {
15            $query = Media::query();
16
17            if ($request->has('search') && $request->search != '') {
18                $query->where('name', 'like', '%' . $request->search . '%');
19            }
20
21            if ($request->has('type') && $request->type != 'all') {
22                if ($request->type == 'image') {
23                    $query->where('mime_type', 'like', 'image/%');
24                } elseif ($request->type == 'video') {
25                    $query->where('mime_type', 'like', 'video/%');
26                } elseif ($request->type == 'document') {
27                    $query->whereNot('mime_type', 'like', 'image/%')->whereNot('mime_type', 'like', 'video/%');
28                }
29            }
30
31            $media = $query->latest()->paginate(24);
32
33            return response()->json($media);
34        }
35
36        return view('admin.media.index');
37    }
38
39    public function upload(Request $request)
40    {
41        $request->validate([
42            'file' => 'required|file|max:10240', // 10MB max
43        ]);
44
45        try {
46            $file = $request->file('file');
47            $originalName = $file->getClientOriginalName();
48            $extension = $file->getClientOriginalExtension();
49            $fileName = Str::uuid() . '.' . $extension;
50            $mimeType = $file->getMimeType();
51            $size = $file->getSize();
52
53            $path = $file->storeAs('media', $fileName, 'public');
54
55            $media = Media::create([
56                'name' => pathinfo($originalName, PATHINFO_FILENAME),
57                'file_name' => $fileName,
58                'mime_type' => $mimeType,
59                'extension' => $extension,
60                'size' => $size,
61                'path' => $path,
62                'disk' => 'public',
63            ]);
64
65            return response()->json([
66                'success' => true,
67                'media' => $media,
68                'message' => 'File uploaded successfully',
69            ]);
70        } catch (\Exception $e) {
71            return response()->json([
72                'success' => false,
73                'message' => $e->getMessage(),
74            ], 500);
75        }
76    }
77
78    public function destroy($id)
79    {
80        try {
81            $media = Media::findOrFail($id);
82            $media->delete(); // File is deleted from disk in model's deleting event
83
84            return response()->json([
85                'success' => true,
86                'message' => 'Media deleted successfully',
87            ]);
88        } catch (\Exception $e) {
89            return response()->json([
90                'success' => false,
91                'message' => 'Error deleting media: ' . $e->getMessage(),
92            ], 500);
93        }
94    }
95
96    public function bulkDelete(Request $request)
97    {
98        $request->validate([
99            'ids' => 'required|array',
100            'ids.*' => 'integer|exists:media,id',
101        ]);
102
103        try {
104            $medias = Media::whereIn('id', $request->ids)->get();
105            foreach ($medias as $media) {
106                $media->delete();
107            }
108
109            return response()->json([
110                'success' => true,
111                'message' => count($request->ids) . ' items deleted successfully',
112            ]);
113        } catch (\Exception $e) {
114            return response()->json([
115                'success' => false,
116                'message' => 'Error deleting media: ' . $e->getMessage(),
117            ], 500);
118        }
119    }
120}