From 8fb65e9de792589b7ebb678b0cf2e0f225b1d68b Mon Sep 17 00:00:00 2001 From: Matthew Kilgore Date: Mon, 30 Nov 2020 18:03:25 -0500 Subject: [PATCH] Use Repositories instead of models --- .../IdWithTransliteratedSlugDriver.php | 13 ++++++++++++- src/Http/HttpServiceProvider.php | 8 +++----- src/User/UserRepository.php | 17 +++++++++++++++++ src/User/UsernameSlugDriver.php | 13 ++++++++++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/Discussion/IdWithTransliteratedSlugDriver.php b/src/Discussion/IdWithTransliteratedSlugDriver.php index ecb4fe7bb..b9d1e039d 100644 --- a/src/Discussion/IdWithTransliteratedSlugDriver.php +++ b/src/Discussion/IdWithTransliteratedSlugDriver.php @@ -15,6 +15,17 @@ use Flarum\User\User; class IdWithTransliteratedSlugDriver implements SlugDriverInterface { + + /** + * @var $discussions DiscussionRepository + */ + protected $discussions; + + public function __construct(DiscussionRepository $discussions) + { + $this->discussions = $discussions; + } + public function toSlug(AbstractModel $instance): string { return $instance->id.(trim($instance->slug) ? '-'.$instance->slug : ''); @@ -27,6 +38,6 @@ class IdWithTransliteratedSlugDriver implements SlugDriverInterface $slug = $slug_array[0]; } - return Discussion::where('id', $slug)->whereVisibleTo($actor)->firstOrFail(); + return $this->discussions->findOrFail($slug, $actor); } } diff --git a/src/Http/HttpServiceProvider.php b/src/Http/HttpServiceProvider.php index 2e0c1ccdb..b9c37a1f9 100644 --- a/src/Http/HttpServiceProvider.php +++ b/src/Http/HttpServiceProvider.php @@ -51,11 +51,9 @@ class HttpServiceProvider extends AbstractServiceProvider foreach ($this->app->make('flarum.http.slugDrivers') as $resourceClass => $resourceDrivers) { $driverKey = $settings->get("slug_driver_$resourceClass", 'default'); - if (array_key_exists($driverKey, $resourceDrivers)) { - $driverClass = $resourceDrivers[$driverKey]; - } else { - $driverClass = $resourceDrivers['default']; - } + + $driverClass = array_key_exists($driverKey, $resourceDrivers) ? $resourceDrivers[$driverKey] : $resourceDrivers['default']; + $compiledDrivers[$resourceClass] = $this->app->make($driverClass); } diff --git a/src/User/UserRepository.php b/src/User/UserRepository.php index b37542a70..390636403 100644 --- a/src/User/UserRepository.php +++ b/src/User/UserRepository.php @@ -40,6 +40,23 @@ class UserRepository return $this->scopeVisibleTo($query, $actor)->firstOrFail(); } + /** + * Find a user by username, optionally making sure it is visible to a certain + * user, or throw an exception. + * + * @param int $id + * @param User $actor + * @return User + * + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + */ + public function findOrFailByUsername($username, User $actor = null) + { + $query = User::where('id', $username); + + return $this->scopeVisibleTo($query, $actor)->firstOrFail(); + } + /** * Find a user by an identification (username or email). * diff --git a/src/User/UsernameSlugDriver.php b/src/User/UsernameSlugDriver.php index 14f1cc83f..65077017e 100644 --- a/src/User/UsernameSlugDriver.php +++ b/src/User/UsernameSlugDriver.php @@ -14,6 +14,17 @@ use Flarum\Http\SlugDriverInterface; class UsernameSlugDriver implements SlugDriverInterface { + + /** + * @var $users UserRepository + */ + protected $users; + + public function __construct(UserRepository $users) + { + $this->users = $users; + } + public function toSlug(AbstractModel $instance): string { return $instance->username; @@ -21,6 +32,6 @@ class UsernameSlugDriver implements SlugDriverInterface public function fromSlug(string $slug, User $actor): AbstractModel { - return User::where('username', $slug)->whereVisibleTo($actor)->firstOrFail(); + return $this->users->findOrFailByUsername($slug, $actor); } }