<?php
namespace CodersLab\Lms\UserInterface\Rest\Controller;
use CodersLab\Lms\Modules\Courses\Application\Query\ProductFilter;
use CodersLab\Lms\Modules\Courses\Application\Query\ProductQuery;
use CodersLab\Lms\Modules\IdentityAccess\Application\Command\SendGithubTeamInvitation;
use CodersLab\Lms\Modules\IdentityAccess\Application\Query\UserQuery;
use CodersLab\Lms\SharedKernel\Application\Command\UpdateShowWelcomePage;
use CodersLab\Lms\SharedKernel\Application\Filter;
use CodersLab\Lms\SharedKernel\Application\Response\LmsApiResponse;
use CodersLab\Lms\SharedKernel\Application\SecurityContext;
use CodersLab\Lms\SharedKernel\Domain\Bus\CommandBus;
use Nelmio\ApiDocBundle\Annotation\Model;
use OpenApi\Annotations as OA;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @OA\Tag(name="User")
*/
final class UsersController
{
public function __construct(
private SecurityContext $securityContext,
private ProductQuery $productQuery,
private CommandBus $commandBus,
private UserQuery $userQuery
) {
}
/**
* @Route("/users/me", name="user_me", methods={"GET"})
* @OA\Response(
* response=200,
* description="Logged User",
* @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\IdentityAccess\Application\Query\Model\User"))
* )
*/
public function currentUser(): LmsApiResponse
{
$userId = $this->securityContext->getLoggedUser()->id();
$user = $this->userQuery->getById($userId);
if ($this->userQuery->hasCourseWithRepositories($userId) && $user->getGithub() === null) {
$user->showGithubWarning();
}
return new LmsApiResponse($user);
}
/**
* @Route("/user/direct-access/list", name="user_direct_access_list", methods={"GET"})
* @OA\Response(
* response=200,
* description="User menu",
* @OA\JsonContent(type="array", @OA\Items(ref=@Model(type="CodersLab\Lms\Modules\Courses\Application\Query\Model\Product")))
* )
*/
public function menu(): LmsApiResponse
{
$productFilter = new ProductFilter(new Filter());
$productFilter->getFilter()->disablePagination();
$productFilter->forUser($this->securityContext->getLoggedUser()->id());
$this->productQuery->find($productFilter);
return new LmsApiResponse($this->productQuery->find($productFilter));
}
/**
* @Route("/user/{id}/welcome-page", name="update_show_welcome_page", methods={"PUT"})
* @OA\Parameter(name="id", in="path", @OA\Schema(type="string"), required=true)
* @OA\RequestBody(
* @OA\MediaType(
* mediaType="application/x-www-form-urlencoded",
* @OA\Schema(
* required={"show"},
* @OA\Property(property="show", type="boolean")
* )
* )
* )
* @OA\Response(
* response=200,
* description="User menu",
* @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\IdentityAccess\Application\Query\Model\Menu"))
* )
*/
public function updateShowWelcomePage(string $id, Request $request): Response
{
$this->commandBus->dispatch(new UpdateShowWelcomePage($id, $request->request->getBoolean('show')));
return new Response();
}
/**
* @Route("/student/{githubLogin}/instance/{instanceId}", name="user_invite", methods={"PUT"})
* @OA\Response(
* response=200,
* description="Command executed"
* )
*/
public function inviteStudentToOrganisation(string $githubLogin, string $instanceId): Response
{
$user = $this->userQuery->getByGithubLogin($githubLogin);
$this->commandBus->dispatch(new SendGithubTeamInvitation($user->getGithubId(), $instanceId));
return new Response();
}
}