feat(BE): spot

This commit is contained in:
Michael 2025-07-04 00:16:09 +02:00
parent 5af0b32634
commit ba56bccc35
12 changed files with 193 additions and 73 deletions

View file

@ -0,0 +1,15 @@
<?php
namespace App\Filters\FiltersType;
use Log;
class SpotFilter
{
function __invoke($query, $spotTableName, $idColumnName) {
try {
return $query->whereIn('id', $spotTableName::select($idColumnName));
} catch (\Exception $e) {
Log::error($e);
}
}
}

View file

@ -2,44 +2,38 @@
namespace App\Filters\Show; namespace App\Filters\Show;
use App\Filters\FiltersType\AllFilter;
use App\Filters\FiltersType\LikeFilter; use App\Filters\FiltersType\LikeFilter;
use App\Models\Spot\SpotPlaylist;
class ShowFilters class ShowFilters
{ {
protected $filters = [ protected $filters = [
'name' => LikeFilter::class, 'name' => LikeFilter::class,
'dj' => LikeFilter::class, 'all' => AllFilter::class,
'genre' => LikeFilter::class,
'description' => LikeFilter::class,
'color' => LikeFilter::class,
'background_color' => LikeFilter::class,
'live_stream_using_airtime_auth' => LikeFilter::class,
'live_stream_using_custom_auth' => LikeFilter::class,
'live_stream_user' => LikeFilter::class,
'live_stream_pass' => LikeFilter::class,
'linked' => LikeFilter::class,
'is_linkable' => LikeFilter::class,
'image_path' => LikeFilter::class,
'has_autoplaylist' => LikeFilter::class,
'autoplaylist_id' => LikeFilter::class,
'autoplaylist_repeat' => LikeFilter::class,
]; ];
public function apply($query) public function apply($query, $filters)
{ {
foreach ($this->receivedFilters() as $name => $value) { foreach ($this->receivedFilters($filters) as $name => $value) {
if ($name != 'per_page') { switch ($name) {
case 'all':
$name = array_diff(array_keys($this->filters), ['all']);
$filterInstance = new $this->filters['all'];
break;
default:
$filterInstance = new $this->filters[$name]; $filterInstance = new $this->filters[$name];
$query = $filterInstance($query, $name, $value); break;
} }
$query = $filterInstance($query, $name, $value);
} }
return $query; return $query;
} }
public function receivedFilters() public function receivedFilters($filters)
{ {
return request()->only(array_keys($this->filters)); return $filters->only(array_keys($this->filters));
} }
} }

View file

@ -8,11 +8,13 @@ use App\Models\File;
use App\Models\Playlist; use App\Models\Playlist;
use App\Models\PlaylistContent; use App\Models\PlaylistContent;
use App\Models\SmartBlock; use App\Models\SmartBlock;
use App\Models\Spot\SpotPlaylist;
use App\Models\Webstream; use App\Models\Webstream;
use DateInterval; use DateInterval;
use DateTime; use DateTime;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class PlaylistController extends Controller class PlaylistController extends Controller
{ {
@ -22,6 +24,7 @@ class PlaylistController extends Controller
* @return string * @return string
*/ */
public function index(Request $request) { public function index(Request $request) {
try {
if ( ! isset($request->per_page) || is_null($request)) { if ( ! isset($request->per_page) || is_null($request)) {
$pagination = 5; $pagination = 5;
} else { } else {
@ -29,10 +32,21 @@ class PlaylistController extends Controller
} }
return Playlist::searchFilter($request) return Playlist::searchFilter($request)
->with(['creator', 'tracks.file', 'tracks.block', 'tracks.block.criteria', 'tracks.block.creator']) ->with(
[
'creator',
'tracks.file',
'tracks.block',
'tracks.block.criteria',
'tracks.block.creator'
]
)
->orderBy('name') ->orderBy('name')
->paginate($pagination) ->paginate($pagination)
->toJson(); ->toJson();
} catch (\Exception $e) {
Log::error($e);
}
} }
/** /**
@ -56,6 +70,9 @@ class PlaylistController extends Controller
'creator_id' => $user->id, 'creator_id' => $user->id,
'description' => $request->description, 'description' => $request->description,
]); ]);
if($request['playlist_type'] === 'spot') {
$dbPlaylist->spotPlaylist()->create();
}
// dd($request->tracks); // dd($request->tracks);
foreach($request->tracks as $key => $file) { foreach($request->tracks as $key => $file) {
if (!isset($file['id'])) { if (!isset($file['id'])) {

View file

@ -25,15 +25,17 @@ class ShowController extends Controller
use ShowInstancesTrait; use ShowInstancesTrait;
use ShowDjTrait; use ShowDjTrait;
public function index(ShowFilters $filters) public function index(Request $request)
{ {
if ( ! isset($filters->per_page) || is_null($filters)) {
$pagination = 20; $pagination = 20;
} else {
$pagination = $filters->per_page;
}
return Show::searchFilter($filters)->cursorPaginate($pagination)->toJson(); if(isset($request->per_page) || is_null($request)) {
$pagination = $request->per_page;
}
return Show::searchFilter($request)
->orderBy('name')
->paginate($pagination)
->toJson();
} }
/** /**

View file

@ -14,6 +14,7 @@ use http\Exception\BadMethodCallException;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class SmartBlockController extends Controller class SmartBlockController extends Controller
{ {
@ -71,29 +72,26 @@ class SmartBlockController extends Controller
* @return mixed string * @return mixed string
*/ */
public function save(Request $request) { public function save(Request $request) {
$user = Auth::user(); try {
//dd($user); $user = Auth::user();//dd($user);
$request->validate([ $request->validate([
'name' => 'required|string', 'name' => 'required|string',
'type' => 'required|string', 'type' => 'required|string',
'criteria' => 'required|array' 'criteria' => 'required|array'
]); ]);
$criteria = $this->createCriteria($request); $criteria = $this->createCriteria($request);
$length = 0; $length = 0;
$dbSmartBlock = SmartBlock::firstOrNew(['id' => $request->id]); $dbSmartBlock = SmartBlock::firstOrNew(['id' => $request->id]);
$dbSmartBlock->fill([ $dbSmartBlock->fill([
'name' => $request->name, 'name' => $request->name,
'creator_id' => $user->id, 'creator_id' => $user->id,
'description' => $request->description, 'description' => $request->description,
'length' => $request->length, 'length' => $request->length,
])->save(); ])->save();
if ($request['smart_block_type'] === 'spot') {
$this->saveCriteria($dbSmartBlock, $criteria); $dbSmartBlock->spotSmartBlock()->create();
//ToDo: save content }
$this->saveCriteria($dbSmartBlock, $criteria);//ToDo: save content
if (is_array($request->tracks) && count($request->tracks) > 0) { if (is_array($request->tracks) && count($request->tracks) > 0) {
SmartBlockContent::where('block_id', '=', $dbSmartBlock->id)->delete(); SmartBlockContent::where('block_id', '=', $dbSmartBlock->id)->delete();
foreach ($request->tracks as $key => $track) { foreach ($request->tracks as $key => $track) {
@ -102,6 +100,9 @@ class SmartBlockController extends Controller
} }
return $dbSmartBlock->toJson(); return $dbSmartBlock->toJson();
} catch (\Exception $e) {
Log::error($e);
}
} }
/** /**

View file

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Filters\PlaylistFilter; use App\Filters\PlaylistFilter;
use App\Models\Spot\SpotPlaylist;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use MusicBrainz\Value\Track; use MusicBrainz\Value\Track;
@ -30,6 +31,10 @@ class Playlist extends Model
return $this->hasMany(PlaylistContent::class); return $this->hasMany(PlaylistContent::class);
} }
public function spotPlaylist(){
return $this->hasOne(SpotPlaylist::class, 'playlist_id');
}
public function scopeSearchFilter($query, $request) { public function scopeSearchFilter($query, $request) {
$filters = new PlaylistFilter(); $filters = new PlaylistFilter();
return $filters->apply($query, $request); return $filters->apply($query, $request);

View file

@ -2,14 +2,14 @@
namespace App\Models\Show; namespace App\Models\Show;
use App\Filters\Show\ShowFilters;
use App\Models\Playlist; use App\Models\Playlist;
use App\Models\ShowInstances\ShowInstances; use App\Models\ShowInstances\ShowInstances;
use App\Models\SmartBlock; use App\Models\SmartBlock;
use App\Models\Spot\SpotShow;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Show extends Model class Show extends Model
{ {
@ -66,13 +66,18 @@ class Show extends Model
return $this->hasMany(ShowInstances::class, 'show_id'); return $this->hasMany(ShowInstances::class, 'show_id');
} }
public function scopeSearchFilter($query, $filters) public function scopeSearchFilter($query, $request)
{ {
return $filters->apply($query); $filters = new ShowFilters();
return $filters->apply($query, $request);
} }
public function playlist() public function playlist()
{ {
return $this->belongsTo(Playlist::class, 'autoplaylist_id', 'id'); return $this->belongsTo(Playlist::class, 'autoplaylist_id', 'id');
} }
public function spotShow(){
return $this->hasOne(SpotShow::class, 'show_id');
}
} }

View file

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Filters\PlaylistFilter; use App\Filters\PlaylistFilter;
use App\Models\Spot\SpotSmartBlock;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -41,4 +42,8 @@ class SmartBlock extends Model
$filters = new PlaylistFilter(); $filters = new PlaylistFilter();
return $filters->apply($query, $request); return $filters->apply($query, $request);
} }
public function spotSmartBlock(){
return $this->hasOne(SpotSmartBlock::class, 'block_id');
}
} }

View file

@ -0,0 +1,23 @@
<?php
namespace App\Models\Spot;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class SpotPlaylist extends Model
{
protected $table = 'wa_spot_playlist';
protected $fillable = [
'playlist_id',
];
/**
* Get the playlist associated with this spot.
*/
public function playlist(): BelongsTo
{
return $this->belongsTo(Playlist::class, 'playlist_id');
}
}

View file

@ -0,0 +1,24 @@
<?php
namespace App\Models\Spot;
use App\Models\Show\Show;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class SpotShow extends Model
{
protected $table = 'wa_spot_show';
protected $fillable = [
'show_id',
];
/**
* Get the show associated with this spot.
*/
public function show(): BelongsTo
{
return $this->belongsTo(Show::class, 'show_id');
}
}

View file

@ -0,0 +1,24 @@
<?php
namespace App\Models\Spot;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use PhpParser\Node\Stmt\Block;
class SpotSmartBlock extends Model
{
protected $table = 'wa_spot_block';
protected $fillable = [
'block_id',
];
/**
* Get the block associated with this spot.
*/
public function block(): BelongsTo
{
return $this->belongsTo(Block::class, 'block_id');
}
}

View file

@ -6,6 +6,7 @@ use App\Http\Resources\ShowResource;
use App\Lib\RabbitMQSender; use App\Lib\RabbitMQSender;
use App\Models\Show\Show; use App\Models\Show\Show;
use App\Models\Show\ShowHosts; use App\Models\Show\ShowHosts;
use App\Models\Spot\SpotShow;
use Exception; use Exception;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Throwable; use Throwable;
@ -31,6 +32,10 @@ trait ShowTrait
} }
$this->manageShowInstances($show); $this->manageShowInstances($show);
$show->save(); $show->save();
## TODO Add show to table of spots
if($showData['show_type'] === 'spot') {
$show->spotShow()->create();
}
DB::commit(); DB::commit();
} catch (Exception $e) { } catch (Exception $e) {
DB::rollBack(); DB::rollBack();