<?php
namespace App\Controller\UserGroup;
use App\Entity\Member;
use App\Entity\UserGroup;
use App\Service\UserGroups\GroupMemberService;
use App\Service\UserGroups\GroupService;
use App\StructSerializer\Main\StructGroup;
use App\StructSerializer\Main\StructOptions;
use App\StructSerializer\Main\StructSerializer;
use Nelmio\ApiDocBundle\Annotation\Model;
use Swagger\Annotations as SWG;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api/public/group")
*/
class PublicGroupController extends AbstractController
{
protected GroupService $service;
protected GroupMemberService $groupMemberService;
protected StructSerializer $structSerializer;
public function __construct(GroupService $service, GroupMemberService $groupMemberService,
StructSerializer $structSerializer)
{
$this->service = $service;
$this->structSerializer = $structSerializer;
$this->groupMemberService = $groupMemberService;
}
/**
* @SWG\Get(tags={"Groups"},
*
* @SWG\Response(response=200, description="Details for a group",
*
* @SWG\Schema(ref=@Model(type=App\Entity\UserGroup::class, groups={"grouplist", "groupdetails"}))),
*
* @SWG\Parameter(name="group", in="path", type="integer", description="ID of the group entity")
* )
*
* @Route("/{group}", methods={ "GET"}, requirements={"group": "\d+"})
*/
public function group(UserGroup $group): JsonResponse
{
$options = StructOptions::create(StructGroup::SHORT);
return new JsonResponse($this->structSerializer->toArray($options, $group));
}
/**
* @SWG\Get(tags={"Groups"},
*
* @SWG\Response(response=200, description="Details for a group by its url slug",
*
* @SWG\Schema(ref=@Model(type=App\Entity\UserGroup::class, groups={"grouplist", "groupdetails"}))),
*
* @SWG\Parameter(name="slug", in="path", type="string", required=true, description="Slug of the group entity")
* )
*
* @Route("/{slug}", methods={"GET"})
*/
public function slug(string $slug): JsonResponse
{
if (!$group = $this->service->findBySlug($slug)) {
throw $this->createNotFoundException();
}
$options = StructOptions::create(StructGroup::SHORT);
return new JsonResponse($this->structSerializer->toArray($options, $group));
}
/**
* @SWG\Get(tags={"Groups"},
*
* @SWG\Response(response=200, description="Paginated list of public group entities",
*
* @SWG\Schema(ref=@Model(type=App\Entity\UserGroup::class, groups={"grouplist"}))),
*
* @SWG\Parameter(name="category", in="path", type="integer", required=true, description="Group category, zero for all entities"),
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=20, description="Number of items per page for pagination")
* )
*
* @Route("/index/public/{category}/{page}", methods={"GET"}, requirements={"page": "\d+", "category": "\d+"})
*/
public function publicindex(Request $request, int $category, int $page = 1): JsonResponse
{
$limit = $request->query->getInt('limit', 20);
$paginator = $this->service->getPublicGroupIndex($category, $page, $limit);
$options = StructOptions::create(StructGroup::SHORT);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Groups"},
*
* @SWG\Response(response=200, description="Paginated list of top-rated group entities",
*
* @SWG\Schema(ref=@Model(type=App\Entity\UserGroup::class, groups={"grouplist"}))),
*
* @SWG\Parameter(name="category", in="path", type="integer", required=true, description="Group category, zero for all entities"),
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=20, description="Number of items per page for pagination")
* )
*
* @Route("/index/top/{category}/{page}", methods={"GET"}, requirements={"page": "\d+", "category": "\d+"})
*/
public function topindex(Request $request, int $category, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 20);
$paginator = $this->service->getTopRatedGroupIndex($category, $page, $limit);
$options = StructOptions::create(StructGroup::SHORT);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Groups"},
*
* @SWG\Response(response=200, description="Paginated list of invite-only group entities",
*
* @SWG\Schema(ref=@Model(type=App\Entity\UserGroup::class, groups={"grouplist"}))),
*
* @SWG\Parameter(name="category", in="path", type="integer", required=true, description="Group category, zero for all entities"),
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=20, description="Number of items per page for pagination")
* )
*
* @Route("/index/inviteonly/{category}/{page}", methods={"GET"}, requirements={"page": "\d+", "category": "\d+"})
*/
public function inviteonlyindex(Request $request, int $category, int $page = 1): JsonResponse
{
$limit = $request->query->getInt('limit', 20);
$paginator = $this->service->getInviteOnlyGroupIndex($category, $page, $limit);
$options = StructOptions::create(StructGroup::SHORT);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"Groups"},
*
* @SWG\Response(response=200, description="List of public group membership entities for given member",
*
* @SWG\Schema(ref=@Model(type=App\Entity\UserGroupMember::class, groups={"membergrouplist", "groupdetails"}))),
*
* @SWG\Parameter(name="member", in="path", type="integer", required=true, description="Get group memberships of a given member")
* )
*
* @Route("/member/{member}", methods={"GET"}, requirements={"member": "\d+"})
*/
public function publicGroups(Member $member): JsonResponse
{
$paginator = $this->groupMemberService->getGroupMembershipsForMember($member, null, 1, 99);
$options = StructOptions::create(StructGroup::SHORT);
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
}