From 55e58131567029050235e812c5aa16bb2a8a2243 Mon Sep 17 00:00:00 2001 From: Tofandel Date: Mon, 26 Feb 2024 19:27:00 +0100 Subject: [PATCH] Fix twill model extensibility [#2479] --- .../Profile.php | 2 +- src/AuthServiceProvider.php | 3 +-- src/Commands/ListBlocks.php | 2 +- src/Helpers/helpers.php | 2 ++ src/Http/Controllers/Admin/ModuleController.php | 3 +-- .../Controllers/Admin/ResetPasswordController.php | 7 +++---- src/Http/Controllers/Admin/UserController.php | 13 +++++-------- src/Http/Requests/Admin/UserRequest.php | 8 +++----- src/Models/Revision.php | 2 +- src/Models/Role.php | 2 +- src/Models/User.php | 4 ++-- src/Models/UserOauth.php | 3 +-- src/Repositories/UserRepository.php | 6 +++--- 13 files changed, 25 insertions(+), 32 deletions(-) diff --git a/docs/content/2_guides/manage_frontend_user_profiles_from_twill/Profile.php b/docs/content/2_guides/manage_frontend_user_profiles_from_twill/Profile.php index a5be66ec49..48d3432e13 100644 --- a/docs/content/2_guides/manage_frontend_user_profiles_from_twill/Profile.php +++ b/docs/content/2_guides/manage_frontend_user_profiles_from_twill/Profile.php @@ -15,6 +15,6 @@ class Profile extends Model public function user() { - return $this->belongsTo(User::class); + return $this->belongsTo(twillModel('user')); } } diff --git a/src/AuthServiceProvider.php b/src/AuthServiceProvider.php index 5d7974e073..9cc9d6585e 100644 --- a/src/AuthServiceProvider.php +++ b/src/AuthServiceProvider.php @@ -3,7 +3,6 @@ namespace A17\Twill; use A17\Twill\Facades\TwillPermissions; -use A17\Twill\Models\User; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; @@ -159,7 +158,7 @@ public function boot() $this->define('publish-user', function ($user) { return $this->authorize($user, function ($user) { - $editedUserObject = User::find(request('id')); + $editedUserObject = twillModel('user')::find(request('id')); return $this->userHasRole( $user, [TwillPermissions::roles()::ADMIN] diff --git a/src/Commands/ListBlocks.php b/src/Commands/ListBlocks.php index be1375507d..c732c0bd45 100644 --- a/src/Commands/ListBlocks.php +++ b/src/Commands/ListBlocks.php @@ -104,7 +104,7 @@ protected function getBlocks(): Collection // We do not render this. unset($data['rules'], $data['rulesForTranslatedFields']); - $data['block class'] = $block::class !== 'A17\Twill\Services\Blocks\Block' ? get_class($block) : 'default'; + $data['block class'] = $block::class !== Block::class ? get_class($block) : 'default'; $list[] = $data; } diff --git a/src/Helpers/helpers.php b/src/Helpers/helpers.php index fb1d2ef393..777f14255c 100644 --- a/src/Helpers/helpers.php +++ b/src/Helpers/helpers.php @@ -2,6 +2,7 @@ use A17\Twill\Facades\TwillBlocks; use A17\Twill\Facades\TwillCapsules; +use A17\Twill\Models\Model; use A17\Twill\Services\Blocks\Block; use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Arr; @@ -208,6 +209,7 @@ function fix_directory_separator($path) } if (! function_exists('twillModel')) { + /** @return class-string|Model It returns a class string but this is for the correct type hints */ function twillModel($model): string { return config("twill.models.$model") diff --git a/src/Http/Controllers/Admin/ModuleController.php b/src/Http/Controllers/Admin/ModuleController.php index 5d3ce3b449..08d06c728d 100644 --- a/src/Http/Controllers/Admin/ModuleController.php +++ b/src/Http/Controllers/Admin/ModuleController.php @@ -9,7 +9,6 @@ use A17\Twill\Models\Behaviors\HasSlug; use A17\Twill\Models\Contracts\TwillModelContract; use A17\Twill\Models\Contracts\TwillSchedulableModel; -use A17\Twill\Models\Group; use A17\Twill\Repositories\ModuleRepository; use A17\Twill\Services\Breadcrumbs\Breadcrumbs; use A17\Twill\Services\Forms\Fields\BaseFormField; @@ -2674,7 +2673,7 @@ protected function respondWithJson($message, $variant) protected function getGroupUserMapping() { if (config('twill.enabled.permissions-management')) { - return Group::with('users')->get() + return twillModel('group')::with('users')->get() ->mapWithKeys(function ($group) { return [$group->id => $group->users()->pluck('id')->toArray()]; })->toArray(); diff --git a/src/Http/Controllers/Admin/ResetPasswordController.php b/src/Http/Controllers/Admin/ResetPasswordController.php index 80737adb9d..b589dde0c1 100644 --- a/src/Http/Controllers/Admin/ResetPasswordController.php +++ b/src/Http/Controllers/Admin/ResetPasswordController.php @@ -2,7 +2,6 @@ namespace A17\Twill\Http\Controllers\Admin; -use A17\Twill\Models\User; use Illuminate\Config\Repository as Config; use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Http\Request; @@ -82,7 +81,7 @@ public function broker() protected function sendResetResponse(Request $request, $response) { - $user = User::where('email', $request->input('email'))->first(); + $user = twillModel('user')::where('email', $request->input('email'))->first(); if (!$user->isActivated()) { $user->registered_at = Carbon::now(); $user->save(); @@ -156,12 +155,12 @@ private function getUserFromToken($token) $clearToken = DB::table($this->config->get('auth.passwords.twill_users.table', 'twill_password_resets'))->where('token', $token)->first(); if ($clearToken) { - return User::where('email', $clearToken->email)->first(); + return twillModel('user')::where('email', $clearToken->email)->first(); } foreach (DB::table($this->config->get('auth.passwords.twill_users.table', 'twill_password_resets'))->get() as $passwordReset) { if (Hash::check($token, $passwordReset->token)) { - return User::where('email', $passwordReset->email)->first(); + return twillModel('user')::where('email', $passwordReset->email)->first(); } } diff --git a/src/Http/Controllers/Admin/UserController.php b/src/Http/Controllers/Admin/UserController.php index 1252111afd..7cf38c4a94 100755 --- a/src/Http/Controllers/Admin/UserController.php +++ b/src/Http/Controllers/Admin/UserController.php @@ -5,10 +5,7 @@ use A17\Twill\Enums\PermissionLevel; use A17\Twill\Facades\TwillPermissions; use A17\Twill\Models\Contracts\TwillModelContract; -use A17\Twill\Models\Group; use A17\Twill\Models\Permission; -use A17\Twill\Models\Role; -use A17\Twill\Models\User; use A17\Twill\Services\Listings\Columns\Image; use A17\Twill\Services\Listings\Columns\Text; use A17\Twill\Services\Listings\Filters\QuickFilter; @@ -99,7 +96,7 @@ public function __construct(Application $app, Request $request, AuthFactory $aut TwillPermissions::showUserSecondaryNavigation(); - $this->filters['role'] = User::getRoleColumnName(); + $this->filters['role'] = twillModel('user')::getRoleColumnName(); } public function getIndexTableColumns(): TableColumns @@ -137,7 +134,7 @@ public function getIndexTableColumns(): TableColumns ); $tableColumns->add( Text::make() - ->field(User::getRoleColumnName()) + ->field(twillModel('user')::getRoleColumnName()) ->title('Role') ->customRender(function (TwillModelContract $user) { if (TwillPermissions::enabled()) { @@ -325,7 +322,7 @@ public function resendRegistrationEmail($userId) private function getGroupPermissionMapping() { if (config('twill.enabled.permissions-management')) { - return Group::with('permissions')->get() + return twillModel('group')::with('permissions')->get() ->mapWithKeys(function ($group) { return [$group->id => $group->permissions]; })->toArray(); @@ -338,7 +335,7 @@ private function getGroups() { if (config('twill.enabled.permissions-management')) { // Forget first one because it's the "Everyone" group and we don't want to show it inside admin. - return Group::with('permissions')->pluck('name', 'id')->forget(1); + return twillModel('group')::with('permissions')->pluck('name', 'id')->forget(1); } return []; @@ -347,7 +344,7 @@ private function getGroups() private function getRoleList() { if (config('twill.enabled.permissions-management')) { - return Role::accessible()->published()->get()->map(function ($role) { + return twillModel('role')::accessible()->published()->get()->map(function ($role) { return ['value' => $role->id, 'label' => $role->name]; })->toArray(); } diff --git a/src/Http/Requests/Admin/UserRequest.php b/src/Http/Requests/Admin/UserRequest.php index 48ccc04190..1e342dd97d 100644 --- a/src/Http/Requests/Admin/UserRequest.php +++ b/src/Http/Requests/Admin/UserRequest.php @@ -2,8 +2,6 @@ namespace A17\Twill\Http\Requests\Admin; -use A17\Twill\Models\Role; -use A17\Twill\Models\User; use Illuminate\Support\Facades\Auth; use Illuminate\Validation\Rule; use PragmaRX\Google2FA\Google2FA; @@ -58,7 +56,7 @@ public function rules(): array } }, 'force-2fa-disable-challenge' => function ($attribute, $value, $fail) { - $user = User::findOrFail($this->route('user')); + $user = twillModel('user')::findOrFail($this->route('user')); if ($this->get('google_2fa_enabled') || ! $user->google_2fa_enabled) { return; } @@ -95,12 +93,12 @@ private function getRoleValidator($baseRule = []) { if (config('twill.enabled.permissions-management')) { // Users can't assign roles above their own - $accessibleRoleIds = Role::accessible()->pluck('id')->toArray(); + $accessibleRoleIds = twillModel('role')::accessible()->pluck('id')->toArray(); $baseRule[] = Rule::in($accessibleRoleIds); } else { $baseRule[] = 'not_in:SUPERADMIN'; } - return [User::getRoleColumnName() => $baseRule]; + return [twillModel('user')::getRoleColumnName() => $baseRule]; } } diff --git a/src/Models/Revision.php b/src/Models/Revision.php index 14a628de78..c934c6483c 100644 --- a/src/Models/Revision.php +++ b/src/Models/Revision.php @@ -29,7 +29,7 @@ public function __construct(array $attributes = []) public function user() { - return $this->belongsTo(User::class); + return $this->belongsTo(twillModel('user')); } public function getByUserAttribute() diff --git a/src/Models/Role.php b/src/Models/Role.php index a3fa1c715b..99ba91a36f 100644 --- a/src/Models/Role.php +++ b/src/Models/Role.php @@ -74,7 +74,7 @@ public function scopeOnlyTrashed($query): Builder public function users(): HasMany { - return $this->hasMany(User::class); + return $this->hasMany(twillModel('user')); } public function getCreatedAtAttribute($value): string diff --git a/src/Models/User.php b/src/Models/User.php index 186085b37b..8675668e93 100644 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -244,7 +244,7 @@ public function sendPasswordResetByAdminNotification($password) public function groups() { - return $this->belongsToMany(Group::class, 'group_twill_user', 'twill_user_id', 'group_id'); + return $this->belongsToMany(twillModel('group'), 'group_twill_user', 'twill_user_id', 'group_id'); } public function publishedGroups() @@ -254,7 +254,7 @@ public function publishedGroups() public function role() { - return $this->belongsTo(Role::class); + return $this->belongsTo(twillModel('role')); } public function allPermissions() diff --git a/src/Models/UserOauth.php b/src/Models/UserOauth.php index 73ccafe4d4..2778172918 100644 --- a/src/Models/UserOauth.php +++ b/src/Models/UserOauth.php @@ -2,7 +2,6 @@ namespace A17\Twill\Models; -use A17\Twill\Models\User; use Illuminate\Database\Eloquent\Model as BaseModel; class UserOauth extends BaseModel @@ -24,6 +23,6 @@ public function __construct(array $attributes = []) public function user() { - $this->belongsTo(User::class, 'user_id'); + $this->belongsTo(twillModel('user'), 'user_id'); } } diff --git a/src/Repositories/UserRepository.php b/src/Repositories/UserRepository.php index 8245e111a5..0f7148e37c 100644 --- a/src/Repositories/UserRepository.php +++ b/src/Repositories/UserRepository.php @@ -5,7 +5,6 @@ use A17\Twill\Facades\TwillPermissions; use A17\Twill\Models\Contracts\TwillModelContract; use A17\Twill\Models\User; -use A17\Twill\Models\Group; use A17\Twill\Repositories\Behaviors\HandleMedias; use A17\Twill\Repositories\Behaviors\HandleOauth; use A17\Twill\Repositories\Behaviors\HandleUserPermissions; @@ -79,10 +78,11 @@ public function getFormFieldsForBrowser( $browserFields = parent::getFormFieldsForBrowser($object, $relation, $routePrefix, $titleKey, $moduleName); if (TwillPermissions::enabled()) { + $everyoneGroup = twillModel('group')::getEveryoneGroup(); foreach ($browserFields as $index => $browserField) { if ( - $browserField['id'] === Group::getEveryoneGroup()->id && - $browserField['name'] === Group::getEveryoneGroup()->name + $browserField['id'] === $everyoneGroup->id && + $browserField['name'] === $everyoneGroup->name ) { $browserFields[$index]['edit'] = false; $browserFields[$index]['deletable'] = false;