fix: separates get/post routes

This commit is contained in:
2025-07-23 21:37:31 -05:00
parent 93f5b716b2
commit 75e9c1e8c3
3 changed files with 46 additions and 17 deletions

View File

@@ -3,6 +3,7 @@
namespace App\User\Action\Command;
use OneToMany\RichBundle\Contract\CommandInterface;
use Symfony\Component\Form\FormInterface;
/** @implements CommandInterface<SaveUserMediaPreferencesCommand> */
class SaveUserMediaPreferencesCommand implements CommandInterface
@@ -14,4 +15,15 @@ class SaveUserMediaPreferencesCommand implements CommandInterface
public string $language,
public string $provider,
) {}
public static function fromUserMediaPreferencesForm(FormInterface $form): self
{
return new static(
resolution: $form->get('resolution')->getData(),
codec: $form->get('codec')->getData(),
quality: $form->get('quality')->getData(),
language: $form->get('language')->getData(),
provider: $form->get('provider')->getData(),
);
}
}

View File

@@ -29,28 +29,41 @@ class PreferencesController extends AbstractController
private readonly Broadcaster $broadcaster,
) {}
#[Route('/user/preferences', 'app_user_preferences', methods: ['GET', 'POST'])]
public function mediaPreferences(Request $request, SaveUserMediaPreferencesHandler $saveUserMediaPreferencesHandler): Response
#[Route('/user/preferences', 'app_user_preferences', methods: ['GET'])]
public function mediaPreferences(): Response
{
$downloadPreferences = $this->getUser()->getDownloadPreferences();
$formData = (array) UserPreferencesFactory::createFromUser($this->getUser());
$form = $this->createForm(UserMediaPreferencesForm::class, $formData);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$saveUserMediaPreferencesHandler->handle(new SaveUserMediaPreferencesCommand(
resolution: (string) $form->get('resolution')->getData(),
codec: (string) $form->get('codec')->getData(),
quality: (string) $form->get('quality')->getData(),
language: (string) $form->get('language')->getData(),
provider: (string) $form->get('provider')->getData(),
));
$this->broadcaster->alert(
title: 'Success',
message: 'Your media preferences have been saved.'
);
}
return $this->render(
'user/preferences.html.twig',
[
'downloadPreferences' => $downloadPreferences,
'preferences_form' => $form,
]
);
}
#[Route('/user/preferences', 'app_user_preferences_submit', methods: ['POST'])]
public function mediaPreferencesSubmit(
Request $request,
SaveUserMediaPreferencesHandler $saveUserMediaPreferencesHandler
): Response
{
$downloadPreferences = $this->getUser()->getDownloadPreferences();
$formData = (array) UserPreferencesFactory::createFromUser($this->getUser());
$form = $this->createForm(UserMediaPreferencesForm::class, $formData);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$saveUserMediaPreferencesHandler->handle(
SaveUserMediaPreferencesCommand::fromUserMediaPreferencesForm($form)
);
$this->broadcaster->alert(
title: 'Success',
message: 'Your media preferences have been saved.'
);
}
return $this->render(

View File

@@ -11,11 +11,14 @@ use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class UserMediaPreferencesForm extends AbstractType
{
public function __construct(
private readonly PreferenceOptionRepository $preferenceOptionRepository,
private readonly UrlGeneratorInterface $urlGenerator,
) {}
public function buildForm(FormBuilderInterface $builder, array $options): void
@@ -30,6 +33,7 @@ class UserMediaPreferencesForm extends AbstractType
private function addChoiceField(FormBuilderInterface $builder, string $fieldName, array $choices): void
{
$question = [
'action' => $this->urlGenerator->generate('app_user_preferences_submit'),
'attr' => ['class' => 'w-64 text-input mb-4'],
'label_attr' => ['class' => 'w-64 text-white block font-semibold mb-2'],
'choices' => $this->addDefaultChoice($choices),