diff --git a/app/Api/V2/Controllers/UserGroup/UpdateController.php b/app/Api/V2/Controllers/UserGroup/UpdateController.php index afbcf1e9ee..04150f2af6 100644 --- a/app/Api/V2/Controllers/UserGroup/UpdateController.php +++ b/app/Api/V2/Controllers/UserGroup/UpdateController.php @@ -54,6 +54,12 @@ class UpdateController extends Controller ); } + public function useUserGroup(UserGroup $userGroup): JsonResponse { + // group validation is already in place, so can just update the user. + $this->repository->useUserGroup($userGroup); + return response()->json([], 422); + } + public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse { $all = $request->getAll(); diff --git a/app/Api/V2/Request/UserGroup/UpdateRequest.php b/app/Api/V2/Request/UserGroup/UpdateRequest.php index c0e0e50bb4..3b02c60937 100644 --- a/app/Api/V2/Request/UserGroup/UpdateRequest.php +++ b/app/Api/V2/Request/UserGroup/UpdateRequest.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V2\Request\UserGroup; use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\UserGroup; +use FireflyIII\Rules\IsDefaultUserGroupName; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Foundation\Http\FormRequest; @@ -53,7 +54,7 @@ class UpdateRequest extends FormRequest $userGroup = $this->route()->parameter('userGroup'); return [ - 'title' => sprintf('required|min:1|max:255|unique:user_groups,title,%d', $userGroup->id), + 'title' => ['required', 'min:1', 'max:255', sprintf('unique:user_groups,title,%d', $userGroup->id), new IsDefaultUserGroupName($userGroup)], ]; } } diff --git a/app/Http/Controllers/UserGroup/CreateController.php b/app/Http/Controllers/UserGroup/CreateController.php index 5b7caf5554..1e6f520e75 100644 --- a/app/Http/Controllers/UserGroup/CreateController.php +++ b/app/Http/Controllers/UserGroup/CreateController.php @@ -36,7 +36,7 @@ class CreateController extends Controller public function create() { $title = (string)trans('firefly.administrations_page_title'); - $subTitle = (string)trans('firefly.administrations_page_sub_title'); + $subTitle = (string)trans('firefly.administrations_page_create_sub_title'); $mainTitleIcon = 'fa-book'; app('log')->debug(sprintf('Now at %s', __METHOD__)); diff --git a/app/Http/Controllers/UserGroup/EditController.php b/app/Http/Controllers/UserGroup/EditController.php new file mode 100644 index 0000000000..536d331ea9 --- /dev/null +++ b/app/Http/Controllers/UserGroup/EditController.php @@ -0,0 +1,46 @@ + $userGroup->title]); + $mainTitleIcon = 'fa-book'; + app('log')->debug(sprintf('Now at %s', __METHOD__)); + + return view('administrations.edit')->with(compact('title', 'subTitle', 'mainTitleIcon')); + } +} diff --git a/app/Repositories/UserGroup/UserGroupRepository.php b/app/Repositories/UserGroup/UserGroupRepository.php index 1b09d7eb3c..e4ceaa386d 100644 --- a/app/Repositories/UserGroup/UserGroupRepository.php +++ b/app/Repositories/UserGroup/UserGroupRepository.php @@ -288,4 +288,10 @@ class UserGroupRepository implements UserGroupRepositoryInterface return $roles; } + + #[\Override] public function useUserGroup(UserGroup $userGroup): void + { + $this->user->user_group_id = $userGroup->id; + $this->user->save(); + } } diff --git a/app/Repositories/UserGroup/UserGroupRepositoryInterface.php b/app/Repositories/UserGroup/UserGroupRepositoryInterface.php index 2d2789804e..badfe55d2e 100644 --- a/app/Repositories/UserGroup/UserGroupRepositoryInterface.php +++ b/app/Repositories/UserGroup/UserGroupRepositoryInterface.php @@ -38,6 +38,8 @@ interface UserGroupRepositoryInterface public function get(): Collection; + public function useUserGroup(UserGroup $userGroup): void; + public function getAll(): Collection; public function setUser(null|Authenticatable|User $user): void; diff --git a/app/Rules/IsDefaultUserGroupName.php b/app/Rules/IsDefaultUserGroupName.php new file mode 100644 index 0000000000..743f2913c9 --- /dev/null +++ b/app/Rules/IsDefaultUserGroupName.php @@ -0,0 +1,63 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Rules; + +use FireflyIII\Models\TransactionType; +use FireflyIII\Models\UserGroup; +use FireflyIII\Repositories\User\UserRepositoryInterface; +use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface; +use FireflyIII\User; +use FireflyIII\Validation\AccountValidator; +use Illuminate\Contracts\Validation\ValidationRule; + +/** + * Class IsDefaultUserGroupName + */ +class IsDefaultUserGroupName implements ValidationRule +{ + private UserGroup $userGroup; + public function __construct(UserGroup $userGroup) { + $this->userGroup =$userGroup; + } + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function validate(string $attribute, mixed $value, \Closure $fail): void + { + app('log')->debug(sprintf('Now in %s(%s)', __METHOD__, $value)); + + // are you owner of this group and the name is the same? fail. + /** @var User $user */ + $user = auth()->user(); + /** @var UserRepositoryInterface $userRepos */ + $userRepos = app(UserRepositoryInterface::class); + + $roles = $userRepos->getRolesInGroup($user, $this->userGroup->id); + if($this->userGroup->title === $user->email && in_array('owner', $roles, true)) { + $fail('validation.administration_owner_rename')->translate(); + } + } +} diff --git a/vite.config.js b/vite.config.js index bff3b96427..ae7f81f502 100644 --- a/vite.config.js +++ b/vite.config.js @@ -53,6 +53,8 @@ export default defineConfig({ // administrations 'resources/assets/v2/pages/administrations/index.js', + 'resources/assets/v2/pages/administrations/create.js', + 'resources/assets/v2/pages/administrations/edit.js', // transactions 'resources/assets/v2/pages/transactions/create.js',