Completed
Push — master ( b0e9fb...0c2496 )
by Tarmo
35s queued 13s
created

AttachUserGroupController   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 23
dl 0
loc 129
ccs 9
cts 9
cp 1
rs 10
c 0
b 0
f 0
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __invoke() 0 33 2
A __construct() 0 4 1
1
<?php
2
declare(strict_types = 1);
3
/**
4
 * /src/Controller/v1/User/AttachUserGroupController.php
5
 *
6
 * @author TLe, Tarmo Leppänen <[email protected]>
7
 */
8
9
namespace App\Controller\v1\User;
10
11
use App\Entity\User;
12
use App\Entity\UserGroup;
13
use App\Resource\UserGroupResource;
14
use App\Resource\UserResource;
15
use App\Security\RolesService;
16
use Nelmio\ApiDocBundle\Annotation\Model;
17
use OpenApi\Annotations as OA;
18
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
19
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
20
use Symfony\Component\HttpFoundation\JsonResponse;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpFoundation\Response;
23
use Symfony\Component\Routing\Annotation\Route;
24
use Symfony\Component\Serializer\SerializerInterface;
25
use Throwable;
26
27
/**
28
 * Class AttachUserGroupController
29
 *
30
 * @package App\Controller\v1\User
31
 * @author TLe, Tarmo Leppänen <[email protected]>
32
 */
33
class AttachUserGroupController
34
{
35 8
    public function __construct(
36
        private SerializerInterface $serializer,
37
        private UserResource $userResource,
38
    ) {
39 8
    }
40
41
    /**
42
     * Endpoint action to attach specified user group to specified user.
43
     *
44
     * @OA\Tag(name="User Management")
45
     * @OA\Parameter(
46
     *      name="Authorization",
47
     *      in="header",
48
     *      required=true,
49
     *      description="Authorization header",
50
     *      @OA\Schema(
51
     *          type="string",
52
     *          default="Bearer _your_jwt_here_",
53
     *      ),
54
     *  )
55
     * @OA\Parameter(
56
     *      name="userId",
57
     *      in="path",
58
     *      required=true,
59
     *      description="User GUID",
60
     *      @OA\Schema(
61
     *          type="string",
62
     *          default="User GUID",
63
     *      ),
64
     *  )
65
     * @OA\Parameter(
66
     *      name="userGroupId",
67
     *      in="path",
68
     *      required=true,
69
     *      description="User Group GUID",
70
     *      @OA\Schema(
71
     *          type="string",
72
     *          default="User Group GUID",
73
     *      ),
74
     *  )
75
     * @OA\Response(
76
     *      response=200,
77
     *      description="User groups (user already belongs to this group)",
78
     *      @OA\Schema(
79
     *          type="array",
80
     *          @OA\Items(
81
     *              ref=@Model(
82
     *                  type=\App\Entity\UserGroup::class,
83
     *                  groups={"UserGroup", "UserGroup.role"},
84
     *              ),
85
     *          ),
86
     *      ),
87
     *  )
88
     *  @OA\Response(
89
     *      response=201,
90
     *      description="User groups (user added to this group)",
91
     *      @OA\Schema(
92
     *          type="array",
93
     *          @OA\Items(
94
     *              ref=@Model(
95
     *                  type=\App\Entity\UserGroup::class,
96
     *                  groups={"UserGroup", "UserGroup.role"},
97
     *              ),
98
     *          ),
99
     *      ),
100
     *  )
101
     * @OA\Response(
102
     *      response=401,
103
     *      description="Unauthorized",
104
     *      @OA\Schema(
105
     *          type="object",
106
     *          example={
107
     *              "Token not found": "{code: 401, message: 'JWT Token not found'}",
108
     *              "Expired token": "{code: 401, message: 'Expired JWT Token'}",
109
     *          },
110
     *          @OA\Property(property="code", type="integer", description="Error code"),
111
     *          @OA\Property(property="message", type="string", description="Error description"),
112
     *      ),
113
     *  )
114
     * @OA\Response(
115
     *      response=403,
116
     *      description="Access denied",
117
     *      @OA\Schema(
118
     *          type="object",
119
     *          example={
120
     *              "Access denied": "{code: 403, message: 'Access denied'}",
121
     *          },
122
     *          @OA\Property(property="code", type="integer", description="Error code"),
123
     *          @OA\Property(property="message", type="string", description="Error description"),
124
     *      ),
125
     *  )
126
     *
127
     * @throws Throwable
128
     */
129 2
    #[Route(
130
        path: '/v1/user/{user}/group/{userGroup}',
131
        requirements: [
132
            'user' => '%app.uuid_v1_regex%',
133
            'userGroup' => '%app.uuid_v1_regex%',
134
        ],
135
        methods: [Request::METHOD_POST],
136
    )]
137
    #[IsGranted(RolesService::ROLE_ROOT)]
138
    #[ParamConverter(
139
        data: 'user',
140
        class: UserResource::class,
141
    )]
142
    #[ParamConverter(
143
        data: 'userGroup',
144
        class: UserGroupResource::class,
145
    )]
146
    public function __invoke(User $user, UserGroup $userGroup): JsonResponse
147
    {
148 2
        $status = $user->getUserGroups()->contains($userGroup) ? Response::HTTP_OK : Response::HTTP_CREATED;
149
150 2
        $this->userResource->save($user->addUserGroup($userGroup));
151
152 2
        $groups = [
153
            'groups' => [
154
                UserGroup::SET_USER_GROUP_BASIC,
155
            ],
156
        ];
157
158 2
        return new JsonResponse(
159 2
            $this->serializer->serialize($user->getUserGroups()->getValues(), 'json', $groups),
160
            $status,
161 2
            json: true
162
        );
163
    }
164
}
165