gamesshop/src/php/Routing/Api/DataTables/SharedUsersEndpoint.php
2024-10-31 15:34:57 +01:00

63 lines
No EOL
2 KiB
PHP

<?php
namespace GamesShop\Routing\Api\DataTables;
use Doctrine\ORM\EntityManager;
use GamesShop\Entities\Account\User;
use GamesShop\Entities\GamesList;
use GamesShop\Login\LoginHandler;
use GamesShop\Login\UserPermission;
use Laminas\Diactoros\Response\JsonResponse;
use League\Route\Http\Exception\BadRequestException;
use League\Route\Http\Exception\ForbiddenException;
use League\Route\Http\Exception\UnauthorizedException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
final class SharedUsersEndpoint
{
public function __construct(
private readonly LoginHandler $loginHandler,
private readonly EntityManager $entityManager,
) { }
/**
* @throws UnauthorizedException
* @throws ForbiddenException
*/
public function __invoke(ServerRequestInterface $request): ResponseInterface
{
if (!$this->loginHandler->isLoggedIn()) {
throw new UnauthorizedException();
}
$user = $this->loginHandler->getCurrentUser();
if (!$user->getPermission()->hasLevel(UserPermission::PROVIDER)) {
throw new ForbiddenException();
}
$body = $request->getQueryParams();
if (!array_key_exists('listid', $body)) {
throw new BadRequestException();
}
$list = $this->entityManager->getRepository(GamesList::class)->findOneBy([ 'owner' => $user, 'id' => $body['listid'] ]);
$claimer = $list->getClaimer();
return new JsonResponse(
[ 'data' => $claimer
->filter(fn ($claimerUser) => $claimerUser !== $user)
->map(
function (User $user) {
return [
'id' => $user->getId(),
'name' => $user->getName(),
'icon' => $user->getProfilePictureUrl()
];
}
)->toArray()
]
);
}
}