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

AttachUserController   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

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

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A __invoke() 0 33 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\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\Routing\Annotation\Route;
23
use Symfony\Component\Serializer\SerializerInterface;
24
use Throwable;
25
26
/**
27
 * Class AttachUserController
28
 *
29
 * @package App\Controller\v1\UserGroup
30
 * @author TLe, Tarmo Leppänen <[email protected]>
31
 */
32
class AttachUserController
33
{
34 8
    public function __construct(
35
        private UserGroupResource $userGroupResource,
36
        private SerializerInterface $serializer,
37
    ) {
38 8
    }
39
40
    /**
41
     * Endpoint action to attach specified user to specified user group.
42
     *
43
     * @OA\Tag(name="UserGroup Management")
44
     * @OA\Parameter(
45
     *      name="Authorization",
46
     *      in="header",
47
     *      required=true,
48
     *      description="Authorization header",
49
     *      @OA\Schema(
50
     *          type="string",
51
     *          default="Bearer _your_jwt_here_",
52
     *      )
53
     *  )
54
     * @OA\Parameter(
55
     *      name="userGroupId",
56
     *      in="path",
57
     *      required=true,
58
     *      description="User Group GUID",
59
     *      @OA\Schema(
60
     *          type="string",
61
     *          default="User Group GUID",
62
     *      )
63
     *  )
64
     * @OA\Parameter(
65
     *      name="userId",
66
     *      in="path",
67
     *      required=true,
68
     *      description="User GUID",
69
     *      @OA\Schema(
70
     *          type="string",
71
     *          default="User GUID",
72
     *      )
73
     *  )
74
     * @OA\Response(
75
     *      response=200,
76
     *      description="List of user group users - specified user already exists on this group",
77
     *      @OA\Schema(
78
     *          type="array",
79
     *          @OA\Items(
80
     *              ref=@Model(
81
     *                  type=\App\Entity\User::class,
82
     *                  groups={"User"},
83
     *              ),
84
     *          ),
85
     *      ),
86
     *  )
87
     * @OA\Response(
88
     *      response=201,
89
     *      description="List of user group users - specified user has been attached to this group",
90
     *      @OA\Schema(
91
     *          type="array",
92
     *          @OA\Items(
93
     *              ref=@Model(
94
     *                  type=\App\Entity\User::class,
95
     *                  groups={"User"},
96
     *              ),
97
     *          ),
98
     *      ),
99
     *  )
100
     * @OA\Response(
101
     *      response=401,
102
     *      description="Invalid token",
103
     *      @OA\Schema(
104
     *          example={
105
     *              "Token not found": "{code: 401, message: 'JWT Token not found'}",
106
     *              "Expired token": "{code: 401, message: 'Expired JWT Token'}",
107
     *          },
108
     *      ),
109
     *  )
110
     * @OA\Response(
111
     *      response=403,
112
     *      description="Access denied",
113
     *  )
114
     *
115
     * @throws Throwable
116
     */
117 2
    #[Route(
118
        path: '/v1/user_group/{userGroup}/user/{user}',
119
        requirements: [
120
            'userGroup' => '%app.uuid_v1_regex%',
121
            'user' => '%app.uuid_v1_regex%',
122
        ],
123
        methods: [Request::METHOD_POST],
124
    )]
125
    #[IsGranted(RolesService::ROLE_ROOT)]
126
    #[ParamConverter(
127
        data: 'userGroup',
128
        class: UserGroupResource::class,
129
    )]
130
    #[ParamConverter(
131
        data: 'user',
132
        class: UserResource::class,
133
    )]
134
    public function __invoke(UserGroup $userGroup, User $user): JsonResponse
135
    {
136 2
        $status = $userGroup->getUsers()->contains($user) ? 200 : 201;
137
138 2
        $this->userGroupResource->save($userGroup->addUser($user));
139
140 2
        $groups = [
141
            'groups' => [
142
                User::SET_USER_BASIC,
143
            ],
144
        ];
145
146 2
        return new JsonResponse(
147 2
            $this->serializer->serialize($userGroup->getUsers()->getValues(), 'json', $groups),
148
            $status,
149 2
            json: true,
150
        );
151
    }
152
}
153