AttachUserController   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 101
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 64
dl 0
loc 101
ccs 15
cts 15
cp 1
rs 10
c 0
b 0
f 0
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
B __invoke() 0 86 2
1
<?php
2
declare(strict_types = 1);
3
/**
4
 * /src/Controller/v1/UserGroup/AttachUserController.php
5
 *
6
 * @author TLe, Tarmo Leppänen <[email protected]>
7
 */
8
9
namespace App\Controller\v1\UserGroup;
10
11
use App\Entity\User;
12
use App\Entity\UserGroup;
13
use App\Enum\Role;
14
use App\Resource\UserGroupResource;
15
use App\Resource\UserResource;
16
use Nelmio\ApiDocBundle\Annotation\Model;
17
use OpenApi\Attributes as OA;
18
use OpenApi\Attributes\JsonContent;
19
use OpenApi\Attributes\Property;
20
use Symfony\Component\HttpFoundation\JsonResponse;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpKernel\Attribute\AsController;
23
use Symfony\Component\Routing\Annotation\Route;
24
use Symfony\Component\Routing\Requirement\Requirement;
25
use Symfony\Component\Security\Http\Attribute\IsGranted;
26
use Symfony\Component\Serializer\SerializerInterface;
27
use Throwable;
28
29
/**
30
 * Class AttachUserController
31
 *
32
 * @package App\Controller\v1\UserGroup
33
 * @author TLe, Tarmo Leppänen <[email protected]>
34
 */
35
#[AsController]
36
class AttachUserController
37
{
38 6
    public function __construct(
39
        private readonly UserResource $userResource,
40
        private readonly UserGroupResource $userGroupResource,
41
        private readonly SerializerInterface $serializer,
42
    ) {
43 6
    }
44
45
    /**
46
     * Endpoint action to attach specified user to specified user group.
47
     *
48
     * @throws Throwable
49
     */
50 3
    #[Route(
51
        path: '/v1/user_group/{userGroup}/user/{user}',
52
        requirements: [
53
            'userGroup' => Requirement::UUID_V1,
54
            'user' => Requirement::UUID_V1,
55
        ],
56
        methods: [Request::METHOD_POST],
57
    )]
58
    #[IsGranted(Role::ROOT->value)]
59
    #[OA\Tag(name: 'UserGroup Management')]
60
    #[OA\Parameter(
61
        name: 'Authorization',
62
        description: 'Authorization header',
63
        in: 'header',
64
        required: true,
65
        example: 'Bearer {token}',
66
        allowReserved: true,
67
    )]
68
    #[OA\Parameter(name: 'userGroup', description: 'User Group GUID', in: 'path', required: true)]
69
    #[OA\Parameter(name: 'user', description: 'User GUID', in: 'path', required: true)]
70
    #[OA\Response(
71
        response: 200,
72
        description: 'List of user group users - specified user already exists on this group',
73
        content: new JsonContent(
74
            type: 'array',
75
            items: new OA\Items(
76
                ref: new Model(type: User::class, groups: ['User']),
77
            ),
78
        ),
79
    )]
80
    #[OA\Response(
81
        response: 201,
82
        description: 'List of user group users - specified user has been attached to this group',
83
        content: new JsonContent(
84
            type: 'array',
85
            items: new OA\Items(
86
                ref: new Model(type: User::class, groups: ['User']),
87
            ),
88
        ),
89
    )]
90
    #[OA\Response(
91
        response: 401,
92
        description: 'Invalid token',
93
        content: new JsonContent(
94
            properties: [
95
                new Property(property: 'code', type: 'integer'),
96
                new Property(property: 'message', type: 'string'),
97
            ],
98
            type: 'object',
99
            example: [
100
                'Token not found' => "{code: 401, message: 'JWT Token not found'}",
101
                'Expired token' => "{code: 401, message: 'Expired JWT Token'}",
102
            ],
103
        ),
104
    )]
105
    #[OA\Response(
106
        response: 403,
107
        description: 'Access denied',
108
        content: new JsonContent(
109
            properties: [
110
                new Property(property: 'code', type: 'integer'),
111
                new Property(property: 'message', type: 'string'),
112
            ],
113
            type: 'object',
114
            example: [
115
                'Access denied' => "{code: 403, message: 'Access denied'}",
116
            ],
117
        ),
118
    )]
119
    public function __invoke(UserGroup $userGroup, User $user): JsonResponse
120
    {
121 3
        $status = $userGroup->getUsers()->contains($user) ? 200 : 201;
122
123 3
        $this->userGroupResource->save($userGroup->addUser($user), false);
124 3
        $this->userResource->save($user, true, true);
125
126 3
        $groups = [
127 3
            'groups' => [
128 3
                User::SET_USER_BASIC,
129 3
            ],
130 3
        ];
131
132 3
        return new JsonResponse(
133 3
            $this->serializer->serialize($userGroup->getUsers()->getValues(), 'json', $groups),
134 3
            $status,
135 3
            json: true,
136 3
        );
137
    }
138
}
139