its 7am i havent slept i have no idea
This commit is contained in:
@@ -14,6 +14,7 @@ use App\Repository\ReviewRepository;
|
||||
use App\Service\AlbumSearchService;
|
||||
use App\Service\ImageStorage;
|
||||
use App\Service\SpotifyClient;
|
||||
use App\Service\SpotifyGenreResolver;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
@@ -21,7 +22,7 @@ use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
use Symfony\Bundle\SecurityBundle\Attribute\IsGranted;
|
||||
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||
|
||||
/**
|
||||
* AlbumController orchestrates search, CRUD, and review entry on albums.
|
||||
@@ -31,6 +32,7 @@ class AlbumController extends AbstractController
|
||||
public function __construct(
|
||||
private readonly ImageStorage $imageStorage,
|
||||
private readonly AlbumSearchService $albumSearch,
|
||||
private readonly SpotifyGenreResolver $genreResolver,
|
||||
private readonly int $searchLimit = 20
|
||||
) {
|
||||
}
|
||||
@@ -48,6 +50,7 @@ class AlbumController extends AbstractController
|
||||
'query' => $criteria->query,
|
||||
'album' => $criteria->albumName,
|
||||
'artist' => $criteria->artist,
|
||||
'genre' => $criteria->getGenre(),
|
||||
'year_from' => $criteria->yearFrom ?? '',
|
||||
'year_to' => $criteria->yearTo ?? '',
|
||||
'albums' => $result->albums,
|
||||
@@ -69,7 +72,7 @@ class AlbumController extends AbstractController
|
||||
$form = $this->createForm(AlbumType::class, $album);
|
||||
$form->handleRequest($request);
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$this->applyAlbumFormData($album, $form);
|
||||
$this->normalizeAlbumFormData($album);
|
||||
$user = $this->getUser();
|
||||
if ($user instanceof User) {
|
||||
$album->setCreatedBy($user);
|
||||
@@ -256,10 +259,9 @@ class AlbumController extends AbstractController
|
||||
$this->ensureCanManageAlbum($album);
|
||||
|
||||
$form = $this->createForm(AlbumType::class, $album);
|
||||
$form->get('artistsCsv')->setData(implode(', ', $album->getArtists()));
|
||||
$form->handleRequest($request);
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$this->applyAlbumFormData($album, $form);
|
||||
$this->normalizeAlbumFormData($album);
|
||||
$this->handleAlbumCoverUpload($album, $form);
|
||||
$em->flush();
|
||||
$this->addFlash('success', 'Album updated.');
|
||||
@@ -314,26 +316,11 @@ class AlbumController extends AbstractController
|
||||
return $user instanceof User && $album->getCreatedBy()?->getId() === $user->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies normalized metadata from the album form.
|
||||
*/
|
||||
private function applyAlbumFormData(Album $album, FormInterface $form): void
|
||||
private function normalizeAlbumFormData(Album $album): void
|
||||
{
|
||||
$album->setArtists($this->parseArtistsCsv((string) $form->get('artistsCsv')->getData()));
|
||||
$album->setReleaseDate($this->normalizeReleaseDate($album->getReleaseDate()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits the artists CSV input into a normalized list.
|
||||
*
|
||||
* @return list<string>
|
||||
*/
|
||||
private function parseArtistsCsv(string $csv): array
|
||||
{
|
||||
$parts = array_map(static fn($s) => trim((string) $s), explode(',', $csv));
|
||||
return array_values(array_filter($parts, static fn($s) => $s !== ''));
|
||||
}
|
||||
|
||||
private function handleAlbumCoverUpload(Album $album, FormInterface $form): void
|
||||
{
|
||||
if ($album->getSource() !== 'user' || !$form->has('coverUpload')) {
|
||||
@@ -351,7 +338,13 @@ class AlbumController extends AbstractController
|
||||
*/
|
||||
private function persistSpotifyAlbumPayload(array $spotifyAlbum, AlbumRepository $albumRepo, AlbumTrackRepository $trackRepo): Album
|
||||
{
|
||||
$album = $albumRepo->upsertFromSpotifyAlbum($spotifyAlbum);
|
||||
// Bring genres along when we persist Spotify albums so templates can display them immediately.
|
||||
$genresMap = $this->genreResolver->resolveGenresForAlbums([$spotifyAlbum]);
|
||||
$albumId = (string) ($spotifyAlbum['id'] ?? '');
|
||||
$album = $albumRepo->upsertFromSpotifyAlbum(
|
||||
$spotifyAlbum,
|
||||
$albumId !== '' ? ($genresMap[$albumId] ?? []) : []
|
||||
);
|
||||
$tracks = $spotifyAlbum['tracks']['items'] ?? [];
|
||||
if (is_array($tracks) && $tracks !== []) {
|
||||
$trackRepo->replaceAlbumTracks($album, $tracks);
|
||||
@@ -381,7 +374,10 @@ class AlbumController extends AbstractController
|
||||
if ($spotifyAlbum === null) {
|
||||
return false;
|
||||
}
|
||||
$albumRepo->upsertFromSpotifyAlbum($spotifyAlbum);
|
||||
// Rehydrate genres during syncs as well, in case Spotify has updated the metadata.
|
||||
$genresMap = $this->genreResolver->resolveGenresForAlbums([$spotifyAlbum]);
|
||||
$albumGenres = $genresMap[$spotifyId] ?? [];
|
||||
$albumRepo->upsertFromSpotifyAlbum($spotifyAlbum, $albumGenres);
|
||||
$tracks = $spotifyAlbum['tracks']['items'] ?? [];
|
||||
if (!is_array($tracks) || $tracks === []) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user