2022-10-21 20:06:43 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Repositories;
|
|
|
|
|
2024-06-05 15:49:23 +00:00
|
|
|
use App\Enums\PlayableType;
|
2022-10-21 20:06:43 +00:00
|
|
|
use App\Models\Song;
|
2024-01-03 17:02:18 +00:00
|
|
|
use App\Models\User;
|
2022-10-21 20:06:43 +00:00
|
|
|
use App\Values\Genre;
|
|
|
|
use Illuminate\Support\Collection;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
|
|
class GenreRepository
|
|
|
|
{
|
|
|
|
/** @return Collection|array<array-key, Genre> */
|
2024-01-03 17:02:18 +00:00
|
|
|
public function getAll(?User $scopedUser = null): Collection
|
2022-10-21 20:06:43 +00:00
|
|
|
{
|
2024-06-05 15:49:23 +00:00
|
|
|
return Song::query(type: PlayableType::SONG, user: $scopedUser ?? auth()->user())
|
|
|
|
->accessible()
|
|
|
|
->select('songs.genre', DB::raw('COUNT(songs.id) AS song_count'), DB::raw('SUM(songs.length) AS length'))
|
|
|
|
->groupBy('songs.genre')
|
|
|
|
->orderBy('songs.genre')
|
2022-10-21 20:06:43 +00:00
|
|
|
->get()
|
2024-04-18 11:27:07 +00:00
|
|
|
->transform(static fn (object $record): Genre => Genre::make( // @phpstan-ignore-line
|
|
|
|
name: $record->genre ?: Genre::NO_GENRE, // @phpstan-ignore-line
|
|
|
|
songCount: $record->song_count, // @phpstan-ignore-line
|
|
|
|
length: $record->length // @phpstan-ignore-line
|
2022-10-21 20:06:43 +00:00
|
|
|
));
|
|
|
|
}
|
|
|
|
|
2024-01-03 17:02:18 +00:00
|
|
|
public function getOne(string $name, ?User $scopedUser = null): ?Genre
|
2022-10-21 20:06:43 +00:00
|
|
|
{
|
|
|
|
/** @var object|null $record */
|
2024-06-05 15:49:23 +00:00
|
|
|
$record = Song::query(type: PlayableType::SONG, user: $scopedUser ?? auth()->user())
|
|
|
|
->accessible()
|
|
|
|
->select('songs.genre', DB::raw('COUNT(songs.id) AS song_count'), DB::raw('SUM(songs.length) AS length'))
|
|
|
|
->groupBy('songs.genre')
|
|
|
|
->where('songs.genre', $name === Genre::NO_GENRE ? '' : $name)
|
2022-10-21 20:06:43 +00:00
|
|
|
->first();
|
|
|
|
|
|
|
|
return $record
|
|
|
|
? Genre::make(
|
|
|
|
name: $record->genre ?: Genre::NO_GENRE,
|
|
|
|
songCount: $record->song_count,
|
|
|
|
length: $record->length
|
|
|
|
)
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
}
|