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

UserGroupsController::__invoke()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 1
dl 0
loc 23
ccs 5
cts 5
cp 1
crap 1
rs 9.7666
c 0
b 0
f 0
1
<?php
2
declare(strict_types = 1);
3
/**
4
 * /src/Controller/v1/User/UserGroupsController.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\UserResource;
14
use Nelmio\ApiDocBundle\Annotation\Model;
15
use OpenApi\Annotations as OA;
16
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
17
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
18
use Symfony\Component\HttpFoundation\JsonResponse;
19
use Symfony\Component\HttpFoundation\Request;
20
use Symfony\Component\Routing\Annotation\Route;
21
use Symfony\Component\Serializer\SerializerInterface;
22
23
/**
24
 * Class UserGroupsController
25
 *
26
 * @package App\Controller\v1\User
27
 * @author TLe, Tarmo Leppänen <[email protected]>
28
 */
29
class UserGroupsController
30
{
31 18
    public function __construct(
32
        private SerializerInterface $serializer,
33
    ) {
34 18
    }
35
36
    /**
37
     * Endpoint action to fetch specified user user groups.
38
     *
39
     * @OA\Tag(name="User Management")
40
     * @OA\Parameter(
41
     *      name="Authorization",
42
     *      in="header",
43
     *      required=true,
44
     *      description="Authorization header",
45
     *      @OA\Schema(
46
     *          type="string",
47
     *          default="Bearer _your_jwt_here_",
48
     *      ),
49
     *  )
50
     * @OA\Response(
51
     *      response=200,
52
     *      description="User groups",
53
     *      @OA\Schema(
54
     *          type="array",
55
     *          @OA\Items(
56
     *              ref=@Model(
57
     *                  type=\App\Entity\UserGroup::class,
58
     *                  groups={"UserGroup", "UserGroup.role"},
59
     *              ),
60
     *          ),
61
     *      ),
62
     *  )
63
     * @OA\Response(
64
     *      response=401,
65
     *      description="Unauthorized",
66
     *      @OA\Schema(
67
     *          type="object",
68
     *          example={
69
     *              "Token not found": "{code: 401, message: 'JWT Token not found'}",
70
     *              "Expired token": "{code: 401, message: 'Expired JWT Token'}",
71
     *          },
72
     *          @OA\Property(property="code", type="integer", description="Error code"),
73
     *          @OA\Property(property="message", type="string", description="Error description"),
74
     *      ),
75
     *  )
76
     *  @OA\Response(
77
     *      response=403,
78
     *      description="Access denied",
79
     *      @OA\Schema(
80
     *          type="object",
81
     *          example={
82
     *              "Access denied": "{code: 403, message: 'Access denied'}",
83
     *          },
84
     *          @OA\Property(property="code", type="integer", description="Error code"),
85
     *          @OA\Property(property="message", type="string", description="Error description"),
86
     *      ),
87
     *  )
88
     */
89 12
    #[Route(
90
        path: '/v1/user/{requestUser}/groups',
91
        requirements: [
92
            'requestUser' => '%app.uuid_v1_regex%',
93
        ],
94
        methods: [Request::METHOD_GET],
95
    )]
96
    #[Security('is_granted("IS_USER_HIMSELF", requestUser) or is_granted("ROLE_ROOT")')]
97
    #[ParamConverter(
98
        data: 'requestUser',
99
        class: UserResource::class,
100
    )]
101
    public function __invoke(User $requestUser): JsonResponse
102
    {
103 12
        $groups = [
104
            'groups' => [
105
                UserGroup::SET_USER_GROUP_BASIC,
106
            ],
107
        ];
108
109 12
        return new JsonResponse(
110 12
            $this->serializer->serialize($requestUser->getUserGroups()->getValues(), 'json', $groups),
111 12
            json: true
112
        );
113
    }
114
}
115