diff --git a/src/User/Action/Command/SaveUserDownloadPreferencesCommand.php b/src/User/Action/Command/SaveUserDownloadPreferencesCommand.php new file mode 100644 index 0000000..2764f29 --- /dev/null +++ b/src/User/Action/Command/SaveUserDownloadPreferencesCommand.php @@ -0,0 +1,13 @@ + */ +class SaveUserDownloadPreferencesCommand implements CommandInterface +{ + public function __construct( + public string $movie_folder, + ) {} +} \ No newline at end of file diff --git a/src/User/Action/Handler/SaveUserDownloadPreferencesHandler.php b/src/User/Action/Handler/SaveUserDownloadPreferencesHandler.php new file mode 100644 index 0000000..7f7d446 --- /dev/null +++ b/src/User/Action/Handler/SaveUserDownloadPreferencesHandler.php @@ -0,0 +1,52 @@ + */ +class SaveUserDownloadPreferencesHandler implements HandlerInterface +{ + public function __construct( + private readonly EntityManagerInterface $entityManager, + private readonly PreferencesRepository $preferenceRepository, + private readonly Security $token, + ) {} + + public function handle(C $command): R + { + /** @var User $user */ + $user = $this->token->getUser(); + + foreach ($command as $preference => $value) { + if ($user->hasUserPreference($preference)) { + $user->updateUserPreference($preference, $value); + $this->entityManager->flush(); + continue; + } + + $preference = $this->preferenceRepository->find($preference); + + $user->addUserPreference( + (new UserPreference()) + ->setUser($user) + ->setPreference($preference) + ->setPreferenceValue($value) + ); + } + + $this->entityManager->flush(); + + return new SaveUserDownloadPreferencesResult($user->getDownloadPreferences()); + } +} diff --git a/src/User/Action/Input/SaveUserDownloadPreferencesInput.php b/src/User/Action/Input/SaveUserDownloadPreferencesInput.php new file mode 100644 index 0000000..de62efb --- /dev/null +++ b/src/User/Action/Input/SaveUserDownloadPreferencesInput.php @@ -0,0 +1,28 @@ + */ +class SaveUserDownloadPreferencesInput implements InputInterface +{ + public function __construct( + #[SourceSecurity] + public mixed $userId, + + #[SourceRequest('movie_folder', nullify: true)] + public bool $movieFolder, + ) {} + + public function toCommand(): C + { + return new SaveUserDownloadPreferencesCommand( + $this->movieFolder, + ); + } +} diff --git a/src/User/Action/Result/SaveUserDownloadPreferencesResult.php b/src/User/Action/Result/SaveUserDownloadPreferencesResult.php new file mode 100644 index 0000000..6da6178 --- /dev/null +++ b/src/User/Action/Result/SaveUserDownloadPreferencesResult.php @@ -0,0 +1,14 @@ +saveUserMediaPreferencesHandler->handle($input->toCommand())->userPreferences; - $userPreferences = Map::from($userPreferences)->rekey(fn($preference) => $preference->getPreference()->getId()); + $this->saveUserMediaPreferencesHandler->handle($input->toCommand()); + $mediaPreferences = $this->getUser()->getMediaPreferences(); + $downloadPreferences = $this->getUser()->getDownloadPreferences(); $languages = CountryLanguages::$languages; sort($languages); @@ -75,7 +79,8 @@ class PreferencesController extends AbstractController 'preferences' => $this->preferencesRepository->findEnabled(), 'languages' => $languages, 'providers' => ProviderList::$providers, - 'userPreferences' => $userPreferences->toArray(), + 'mediaPreferences' => $mediaPreferences, + 'downloadPreferences' => $downloadPreferences, ] ); } @@ -83,11 +88,11 @@ class PreferencesController extends AbstractController #[Route('/user/preferences/download', 'app_save_download_preferences', methods: ['POST'])] public function saveDownloadPreferences( Request $request, - SaveUserMediaPreferencesInput $input, + SaveUserDownloadPreferencesInput $input, ): Response { - $userPreferences = $this->saveUserMediaPreferencesHandler->handle($input->toCommand())->userPreferences; - $userPreferences = Map::from($userPreferences)->rekey(fn($preference) => $preference->getPreference()->getId()); + $downloadPreferences = $this->saveUserDownloadPreferencesHandler->handle($input->toCommand())->downloadPreferences; + $mediaPreferences = $this->getUser()->getMediaPreferences(); $languages = CountryLanguages::$languages; sort($languages); @@ -97,7 +102,7 @@ class PreferencesController extends AbstractController $this->renderView('broadcast/Alert.stream.html.twig', [ 'alert_id' => uniqid(), 'title' => 'Success', - 'message' => 'Your media preferences have been saved.', + 'message' => 'Your download preferences have been saved.', ]) )); @@ -107,7 +112,8 @@ class PreferencesController extends AbstractController 'preferences' => $this->preferencesRepository->findEnabled(), 'languages' => $languages, 'providers' => ProviderList::$providers, - 'userPreferences' => $userPreferences->toArray(), + 'mediaPreferences' => $mediaPreferences, + 'downloadPreferences' => $downloadPreferences, ] ); } diff --git a/templates/user/preferences.html.twig b/templates/user/preferences.html.twig index 5d7d229..4d9a164 100644 --- a/templates/user/preferences.html.twig +++ b/templates/user/preferences.html.twig @@ -69,11 +69,13 @@

Change how your downloads are stored.

-
-
- + +
+ +
+