sintonia_webapp/app/Http/Controllers/WebstreamController.php
2025-07-02 13:14:27 +02:00

154 lines
4.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Filters\Webstream\WebstreamFilters;
use App\Models\Webstream;
use App\Services\WebstreamService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;
use Throwable;
class WebstreamController extends Controller
{
public function __construct(WebstreamService $webstreamService)
{
$this->webstreamService = $webstreamService;
}
public function index(WebstreamFilters $filters)
{
try {
if ( ! isset($filters->per_page) || is_null($filters)) {
$pagination = 20;
} else {
$pagination = $filters->per_page;
}
return Webstream::searchFilter($filters)->cursorPaginate($pagination)->toJson();
} catch (Exception $e) {
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function show(Request $request, $webstreamId)
{
try {
$webstream = Webstream::findOrFail($webstreamId);
return response()->json($webstream);
} catch (Exception $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['message' => 'Webstream not found: ' . $e->getMessage()], 404);
}
}
public function store(Request $request)
{
try {
# Todo length field needs to be validated against a type
$data = $request->validate([
'name' => ['required'],
'description' => ['required'],
'url' => ['required', 'url'],
'length' => ['required'],
]);
$isAudioStream = $this->webstreamService->isAudioStream($data['url']);
# TODO Permissions
$data['mtime'] = now();
$data['utime'] = now();
$data['creator_id'] = auth()->id();
DB::beginTransaction();
$webstream = Webstream::create($data);
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Webstream saved successfully!',
'data' => $webstream,
'isAudioStream' => $isAudioStream
]);
} catch (Exception $e) {
Log::error($e->getMessage());
DB::rollBack();
return response()->json(['message' => $e->getMessage()], 500);
} catch (Throwable $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function update(Request $request, Webstream $webstream)
{
try {
$data = $request->validate([
'name' => ['required'],
'description' => ['required'],
'url' => ['required', 'url'],
]);
$isAudioStream = $this->webstreamService->isAudioStream($data['url']);
// Update utime to current time
$data['utime'] = now();
DB::beginTransaction();
$webstream->update($data);
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Webstream updated successfully!',
'data' => $webstream,
'isAudioStream' => $isAudioStream
]);
} catch (Exception $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
} catch (Throwable $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
}
}
public function destroy(Webstream $webstream)
{
try {
DB::beginTransaction();
$webstream->delete();
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Webstream deleted successfully!'
]);
} catch (Exception $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
} catch (Throwable $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json(['message' => $e->getMessage()], 500);
}
}
}