fix: refactors getting user's media preferences

This commit is contained in:
2025-05-19 16:16:54 -05:00
parent bd4ce76177
commit 3c965aa1ec
3 changed files with 26 additions and 41 deletions

View File

@@ -31,16 +31,7 @@ class PreferencesController extends AbstractController
#[Route('/user/preferences', 'app_user_preferences', methods: ['GET'])] #[Route('/user/preferences', 'app_user_preferences', methods: ['GET'])]
public function mediaPreferences(): Response public function mediaPreferences(): Response
{ {
$enabledPreferences = $this->preferencesRepository->findEnabled(); $mediaPreferences = $this->getUser()->getMediaPreferences();
if ($this->getUser()->getUserPreferences()->count() !== count($enabledPreferences)) {
$this->setUserPreferences($this->getUser(), $enabledPreferences);
}
$userPreferences = $this->getUser()->getUserPreferences()->toArray();
$userPreferences = Map::from($userPreferences)
->rekey(fn($preference) => $preference->getPreference()->getId());
$languages = CountryLanguages::$languages; $languages = CountryLanguages::$languages;
sort($languages); sort($languages);
@@ -50,7 +41,7 @@ class PreferencesController extends AbstractController
'preferences' => $this->preferencesRepository->findEnabled(), 'preferences' => $this->preferencesRepository->findEnabled(),
'languages' => $languages, 'languages' => $languages,
'providers' => ProviderList::$providers, 'providers' => ProviderList::$providers,
'userPreferences' => $userPreferences->toArray(), 'mediaPreferences' => $mediaPreferences,
] ]
); );
} }
@@ -86,18 +77,4 @@ class PreferencesController extends AbstractController
] ]
); );
} }
private function setUserPreferences(User $user, array $preferences): void
{
foreach ($preferences as $preference) {
if (false === $user->hasUserPreference($preference->getId())) {
$user->addUserPreference((new UserPreference())
->setUser($user)
->setPreference($preference)
->setPreferenceValue(null)
);
}
}
$this->preferencesRepository->getEntityManager()->flush();
}
} }

View File

@@ -204,7 +204,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this; return $this;
} }
public function getUserPreferenceValues() public function getUserPreferenceValues(string $type = 'all'): array
{ {
return Map::from($this->userPreferences) return Map::from($this->userPreferences)
->rekey(fn(UserPreference $userPreference) => $userPreference->getPreference()->getId()) ->rekey(fn(UserPreference $userPreference) => $userPreference->getPreference()->getId())
@@ -213,7 +213,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $userPreference->getPreferenceValue(); return $userPreference->getPreferenceValue();
} }
foreach ($userPreference->getPreference()->getPreferenceOptions() as $preferenceOption) { foreach ($userPreference->getPreference()->getPreferenceOptions() as $preferenceOption) {
// dd((int) $userPreference->getPreferenceValue(), $preferenceOption->getId(), $preferenceOption->getValue());
if ($preferenceOption->getId() === (int) $userPreference->getPreferenceValue()) { if ($preferenceOption->getId() === (int) $userPreference->getPreferenceValue()) {
return $preferenceOption->getValue(); return $preferenceOption->getValue();
} }
@@ -273,6 +272,15 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this->downloads; return $this->downloads;
} }
public function getMediaPreferences()
{
return Map::from($this->userPreferences)
->rekey(fn(UserPreference $userPreference) => $userPreference->getPreference()->getId())
->filter(fn(UserPreference $userPreference) => $userPreference->getPreference()->getType() === 'media')
->toArray()
;
}
/** /**
* @return Collection<int, Download> * @return Collection<int, Download>
*/ */

View File

@@ -8,58 +8,58 @@
<p class="text-gray-50 mb-2">Define a set of filters to apply to your media download option results.</p> <p class="text-gray-50 mb-2">Define a set of filters to apply to your media download option results.</p>
<form id="media_preferences" class="flex flex-col max-w-64" name="media_preferences" method="post" action="{{ path('app_save_media_preferences') }}"> <form id="media_preferences" class="flex flex-col max-w-64" name="media_preferences" method="post" action="{{ path('app_save_media_preferences') }}">
<label class="text-gray-50" for="resolution">Resolution</label> <label class="text-gray-50" for="resolution">Resolution</label>
<select class="p-1.5 rounded-md mb-2" name="resolution" id="resolution" value="{{ userPreferences['resolution'].getPreferenceValue() }}"> <select class="p-1.5 rounded-md mb-2" name="resolution" id="resolution" value="{{ mediaPreferences['resolution'].getPreferenceValue() }}">
<option class="text-gray-800" <option class="text-gray-800"
value="" value=""
{{ userPreferences['resolution'].getPreferenceValue() is null ? "selected" }} {{ mediaPreferences['resolution'] is null ? "selected" }}
>n/a</option> >n/a</option>
{% for pref in userPreferences['resolution'].getPreference().getPreferenceOptions() %} {% for pref in mediaPreferences['resolution'].getPreference().getPreferenceOptions() %}
<option class="text-gray-800" <option class="text-gray-800"
value="{{ pref.id }}" value="{{ pref.id }}"
{{ pref.id == userPreferences['resolution'].getPreferenceValue() ? "selected" }} {{ pref.id == mediaPreferences['resolution'].getPreferenceValue() ? "selected" }}
>{{ pref.name }}</option> >{{ pref.name }}</option>
{% endfor %} {% endfor %}
</select> </select>
<label class="text-gray-50" for="codec">Codec</label> <label class="text-gray-50" for="codec">Codec</label>
<select class="p-1.5 rounded-md mb-2" name="codec" id="codec" value="{{ userPreferences['codec'].getPreferenceValue() }}"> <select class="p-1.5 rounded-md mb-2" name="codec" id="codec" value="{{ mediaPreferences['codec'].getPreferenceValue() }}">
<option class="text-gray-800" <option class="text-gray-800"
value="" value=""
{{ userPreferences['codec'].getPreferenceValue() is null ? "selected" }} {{ mediaPreferences['codec'].getPreferenceValue() is null ? "selected" }}
>n/a</option> >n/a</option>
{% for pref in userPreferences['codec'].getPreference().getPreferenceOptions() %} {% for pref in mediaPreferences['codec'].getPreference().getPreferenceOptions() %}
<option class="text-gray-800" <option class="text-gray-800"
value="{{ pref.id }}" value="{{ pref.id }}"
{{ pref.id == userPreferences['codec'].getPreferenceValue() ? "selected" }} {{ pref.id == mediaPreferences['codec'].getPreferenceValue() ? "selected" }}
>{{ pref.name }}</option> >{{ pref.name }}</option>
{% endfor %} {% endfor %}
</select> </select>
<label class="text-gray-50" for="provider">Provider</label> <label class="text-gray-50" for="provider">Provider</label>
<select class="p-1.5 rounded-md mb-2" name="provider" id="provider" value="{{ userPreferences['provider'].getPreferenceValue() }}"> <select class="p-1.5 rounded-md mb-2" name="provider" id="provider" value="{{ mediaPreferences['provider'].getPreferenceValue() }}">
<option class="text-gray-800" <option class="text-gray-800"
value="" value=""
{{ "" == userPreferences['provider'].getPreferenceValue() ? "selected" }} {{ "" == mediaPreferences['provider'].getPreferenceValue() ? "selected" }}
>n/a</option> >n/a</option>
{% for provider in providers %} {% for provider in providers %}
<option class="text-gray-800" <option class="text-gray-800"
value="{{ provider }}" value="{{ provider }}"
{{ provider == userPreferences['provider'].getPreferenceValue() ? "selected" }} {{ provider == mediaPreferences['provider'].getPreferenceValue() ? "selected" }}
>{{ provider }}</option> >{{ provider }}</option>
{% endfor %} {% endfor %}
</select> </select>
<label class="text-gray-50" for="language">Language</label> <label class="text-gray-50" for="language">Language</label>
<select class="p-1.5 rounded-md mb-2" name="language" id="language" value="{{ userPreferences['language'].getPreferenceValue() }}"> <select class="p-1.5 rounded-md mb-2" name="language" id="language" value="{{ mediaPreferences['language'].getPreferenceValue() }}">
<option class="text-gray-800" <option class="text-gray-800"
value="" value=""
{{ userPreferences['language'].getPreferenceValue() is null ? "selected" }} {{ mediaPreferences['language'].getPreferenceValue() is null ? "selected" }}
>n/a</option> >n/a</option>
{% for language in languages %} {% for language in languages %}
<option class="text-gray-800" <option class="text-gray-800"
value="{{ language }}" value="{{ language }}"
{{ language == userPreferences['language'].getPreferenceValue() ? "selected" }} {{ language == mediaPreferences['language'].getPreferenceValue() ? "selected" }}
>{{ language }}</option> >{{ language }}</option>
{% endfor %} {% endfor %}
</select> </select>