Skip to content

Commit e99add8

Browse files
committed
squash
1 parent 2fa3d6c commit e99add8

50 files changed

Lines changed: 1904 additions & 9 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/copilot-instructions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ Any new php file should contain the license header and has a single blank line a
22
The variable name should be in snake_case.
33
In Requests, if a user is provided by the query it is placed in the $this->user2.
44
In Requests, $this->user is reserved for the user making the request.
5+
The Resource classes should use Laravel Data instead of JsonResource.
56
We do not use blade view, we use Vue3 instead.
67
Use Typescript in composition API for Vue3. Use PrimeVue for UI components.
78
Do not use await async calls in Vue3, use .then() instead.

app/Constants/AccessPermissionConstants.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class AccessPermissionConstants
1717
// Id names
1818
public const BASE_ALBUM_ID = 'base_album_id';
1919
public const USER_ID = 'user_id';
20+
public const USER_GROUP_ID = 'user_group_id';
2021

2122
// Attributes name
2223
public const IS_LINK_REQUIRED = 'is_link_required';
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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\Contracts\Http\Requests;
10+
11+
interface HasName
12+
{
13+
public function name(): string;
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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\Contracts\Http\Requests;
10+
11+
use App\Enum\UserGroupRole;
12+
13+
interface HasRole
14+
{
15+
public function role(): UserGroupRole;
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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\Contracts\Http\Requests;
10+
11+
use App\Models\UserGroup;
12+
13+
interface HasUserGroup
14+
{
15+
public function user_group(): UserGroup;
16+
}

app/Contracts/Http/Requests/RequestAttribute.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class RequestAttribute
1515
public const USER_ID_ATTRIBUTE = 'user_id';
1616
public const USER_IDS_ATTRIBUTE = 'user_ids';
1717

18+
public const GROUP_ID = 'group_id';
19+
public const NAME_ATTRIBUTE = 'name';
20+
public const ROLE_ATTRIBUTE = 'role';
21+
1822
public const EMAIL_ATTRIBUTE = 'email';
1923
public const ALIAS_ATTRIBUTE = 'alias';
2024
public const PROVIDER_ATTRIBUTE = 'provider';

app/Enum/UserGroupRole.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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\Enum;
10+
11+
/**
12+
* Enum representing the roles a user can have in a user group.
13+
*/
14+
enum UserGroupRole: string
15+
{
16+
case MEMBER = 'member';
17+
case ADMIN = 'admin';
18+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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\Http\Requests\UserGroup\CreateUserGroupRequest;
12+
use App\Http\Requests\UserGroup\DeleteUserGroupRequest;
13+
use App\Http\Requests\UserGroup\ListUserGroupRequest;
14+
use App\Http\Requests\UserGroup\UpdateUserGroupRequest;
15+
use App\Http\Resources\Collections\UserGroupDataResource;
16+
use App\Http\Resources\Models\UserGroupResource;
17+
use App\Models\UserGroup;
18+
use Illuminate\Routing\Controller;
19+
use Illuminate\Validation\ValidationException;
20+
21+
/**
22+
* Controller responsible for user management.
23+
*/
24+
class UserGroupsController extends Controller
25+
{
26+
/**
27+
* @return UserGroupDataResource
28+
*/
29+
public function list(ListUserGroupRequest $request): UserGroupDataResource
30+
{
31+
return new UserGroupDataResource(UserGroup::with('users')->get());
32+
}
33+
34+
public function create(CreateUserGroupRequest $request): UserGroupResource
35+
{
36+
$this->validateUniqueGroupName($request->name());
37+
38+
$user_group = UserGroup::create([
39+
'name' => $request->name(),
40+
'description' => $request->description(),
41+
]);
42+
43+
return new UserGroupResource($user_group);
44+
}
45+
46+
public function update(UpdateUserGroupRequest $request): UserGroupResource
47+
{
48+
$this->validateUniqueGroupName($request->name(), $request->user_group()->id);
49+
50+
$request->user_group()->update([
51+
'name' => $request->name(),
52+
'description' => $request->description(),
53+
]);
54+
55+
return new UserGroupResource($request->user_group());
56+
}
57+
58+
public function delete(DeleteUserGroupRequest $request): void
59+
{
60+
$request->user_group()->delete();
61+
}
62+
63+
private function validateUniqueGroupName(string $name, ?int $exclude_id = null): void
64+
{
65+
$query = UserGroup::where('name', $name)
66+
->when($exclude_id !== null, fn ($q) => $q->where('id', '!=', $exclude_id));
67+
68+
if ($query->exists()) {
69+
throw ValidationException::withMessages(['name' => 'A group with this name already exists.']);
70+
}
71+
}
72+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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\Http\Requests\UserGroup\GetUserGroupRequest;
12+
use App\Http\Requests\UserGroup\ManageUserGroupRequest;
13+
use App\Http\Resources\Models\UserGroupResource;
14+
use Illuminate\Routing\Controller;
15+
16+
/**
17+
* Controller responsible for managing users within groups.
18+
*/
19+
class UserGroupsManagementController extends Controller
20+
{
21+
public function get(GetUserGroupRequest $request): UserGroupResource
22+
{
23+
return new UserGroupResource($request->user_group());
24+
}
25+
26+
public function addUser(ManageUserGroupRequest $request): UserGroupResource
27+
{
28+
$request->user_group()->users()->attach($request->user2()->id, ['role' => $request->role()->value]);
29+
30+
return new UserGroupResource($request->user_group());
31+
}
32+
33+
public function removeUser(ManageUserGroupRequest $request): UserGroupResource
34+
{
35+
$request->user_group()->users()->detach($request->user2()->id);
36+
37+
return new UserGroupResource($request->user_group());
38+
}
39+
40+
public function updateUserRole(ManageUserGroupRequest $request): UserGroupResource
41+
{
42+
$request->user_group()->users()->updateExistingPivot($request->user2()->id, ['role' => $request->role()->value]);
43+
$request->user_group()->load('users');
44+
45+
return new UserGroupResource($request->user_group());
46+
}
47+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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\Requests\Traits;
10+
11+
trait HasNameTrait
12+
{
13+
protected string $name;
14+
15+
/**
16+
* @return string
17+
*/
18+
public function name(): string
19+
{
20+
return $this->name;
21+
}
22+
}

0 commit comments

Comments
 (0)