Skip to content

Commit c79d6da

Browse files
committed
WIP
1 parent 1a877a7 commit c79d6da

3 files changed

Lines changed: 165 additions & 0 deletions

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
/**
4+
* SPDX-License-Identifier: MIT
5+
* Copyright (c) 2017-2018 Tobias Reich
6+
* Copyright (c) 2018-2025 LycheeOrg.
7+
*/
8+
9+
namespace App\Http\Controllers\Admin;
10+
11+
use App\Actions\Statistics\Spaces;
12+
use App\Actions\User\Create;
13+
use App\Actions\User\Save;
14+
use App\Exceptions\UnauthorizedException;
15+
use App\Http\Requests\UserManagement\AddUserRequest;
16+
use App\Http\Requests\UserManagement\DeleteUserRequest;
17+
use App\Http\Requests\UserManagement\ManagmentListUsersRequest;
18+
use App\Http\Requests\UserManagement\SetUserSettingsRequest;
19+
use App\Http\Resources\Models\UserManagementResource;
20+
use App\Models\User;
21+
use Illuminate\Routing\Controller;
22+
use Illuminate\Support\Collection;
23+
use Illuminate\Support\Facades\Auth;
24+
25+
/**
26+
* Controller responsible for user management.
27+
*/
28+
class UserGroupsController extends Controller
29+
{
30+
/**
31+
* Get the list of users for management purposes.
32+
*
33+
* @param ManagmentListUsersRequest $request
34+
* @param Spaces $spaces
35+
*
36+
* @return Collection<array-key, UserManagementResource>
37+
*/
38+
public function list(ManagmentListUsersRequest $request, Spaces $spaces): Collection
39+
{
40+
/** @var Collection<int,User> $users */
41+
$users = User::select(['id', 'username', 'may_administrate', 'may_upload', 'may_edit_own_settings', 'quota_kb', 'description', 'note'])->orderBy('id', 'asc')->get();
42+
$spacesPerUser = $spaces->getFullSpacePerUser();
43+
/** @var Collection<int,array{0:User,1:array{id:int,username:string,size:int}}> $zipped */
44+
$zipped = $users->zip($spacesPerUser);
45+
46+
return $zipped->map(fn ($item) => new UserManagementResource($item[0], $item[1], $request->is_se()));
47+
}
48+
49+
/**
50+
* Save modification done to a user.
51+
* Note that an admin can change the password of a user at will.
52+
*
53+
* @param SetUserSettingsRequest $request
54+
* @param Save $save
55+
*
56+
* @return void
57+
*/
58+
public function save(SetUserSettingsRequest $request, Save $save): void
59+
{
60+
$save->do(
61+
user: $request->user2(),
62+
username: $request->username(),
63+
password: $request->password(),
64+
mayUpload: $request->mayUpload(),
65+
mayEditOwnSettings: $request->mayEditOwnSettings(),
66+
quota_kb: $request->quota_kb(),
67+
note: $request->note()
68+
);
69+
}
70+
71+
/**
72+
* Deletes a user.
73+
*
74+
* The albums and photos owned by the user are re-assigned to the
75+
* admin user.
76+
*
77+
* @param DeleteUserRequest $request
78+
*
79+
* @return void
80+
*/
81+
public function delete(DeleteUserRequest $request): void
82+
{
83+
if ($request->user2()->id === Auth::id()) {
84+
throw new UnauthorizedException('You are not allowed to delete yourself');
85+
}
86+
$request->user2()->delete();
87+
}
88+
89+
/**
90+
* Create a new user.
91+
*
92+
* @param AddUserRequest $request
93+
* @param Create $create
94+
*
95+
* @return UserManagementResource
96+
*/
97+
public function create(AddUserRequest $request, Create $create): UserManagementResource
98+
{
99+
$user = $create->do(
100+
username: $request->username(),
101+
password: $request->password(),
102+
mayUpload: $request->mayUpload(),
103+
mayEditOwnSettings: $request->mayEditOwnSettings(),
104+
quota_kb: $request->quota_kb(),
105+
note: $request->note()
106+
);
107+
108+
return new UserManagementResource($user, ['id' => $user->id, 'size' => 0], $request->is_se());
109+
}
110+
}

app/Policies/UserGroupPolicy.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/**
4+
* SPDX-License-Identifier: MIT
5+
* Copyright (c) 2017-2018 Tobias Reich
6+
* Copyright (c) 2018-2025 LycheeOrg.
7+
*/
8+
9+
namespace App\Policies;
10+
11+
use App\Models\User;
12+
use App\Models\UserGroup;
13+
14+
/**
15+
* This class has a DUAL purpose:.
16+
*
17+
* 1. Define the Rights of the current user over managing Users.
18+
* 2. Define the Rights of the current user with regard to what it can modify on its profile.
19+
*/
20+
class UserGroupPolicy extends BasePolicy
21+
{
22+
public const CAN_CREATE = 'canCreateOrEditOrDelete';
23+
public const CAN_EDIT = 'canCreateOrEditOrDelete';
24+
public const CAN_DELETE = 'canCreateOrEditOrDelete';
25+
public const CAN_ADD_OR_REMOVE_USER = 'canAddOrRemoveUser';
26+
public const CAN_LIST = 'canList';
27+
28+
public function canCreateOrEditOrDelete(User $user): bool
29+
{
30+
// Note, the administrator is already handled in the `before()` method and every one else is not allowed to create/delete users.
31+
return false;
32+
}
33+
34+
public function canList(User $user): bool
35+
{
36+
return $user->may_upload;
37+
}
38+
39+
/**
40+
* This defines if a user can add another user to the group.
41+
*
42+
* @param User $user
43+
* @param UserGroup $userGroup
44+
*
45+
* @return bool
46+
*/
47+
public function canAddOrRemoveUser(User $user, UserGroup $userGroup): bool
48+
{
49+
return false;
50+
}
51+
}

app/Providers/AuthServiceProvider.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
use App\Models\LiveMetrics;
1616
use App\Models\Photo;
1717
use App\Models\User;
18+
use App\Models\UserGroup;
1819
use App\Policies\AlbumPolicy;
1920
use App\Policies\MetricsPolicy;
2021
use App\Policies\PhotoPolicy;
2122
use App\Policies\SettingsPolicy;
23+
use App\Policies\UserGroupPolicy;
2224
use App\Policies\UserPolicy;
2325
use App\Services\Auth\SessionOrTokenGuard;
2426
use App\SmartAlbums\BaseSmartAlbum;
@@ -47,6 +49,8 @@ class AuthServiceProvider extends ServiceProvider
4749
Configs::class => SettingsPolicy::class,
4850

4951
LiveMetrics::class => MetricsPolicy::class,
52+
53+
UserGroup::class => UserGroupPolicy::class,
5054
];
5155

5256
/**

0 commit comments

Comments
 (0)