react-logo/backend/src/Controller/UserController.php

120 lines
3.4 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\User;
use App\Http\DataResponse;
use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class UserController extends Controller
{
/**
* @Route("/api/v1/me", name="api_v1_users_me", methods={"GET"})
* @IsGranted("ROLE_USER")
*/
public function showCurrentUser()
{
/** @var User */
$user = $this->getUser();
return new DataResponse([
'username' => $user->getUsername(),
'roles' => $user->getRoles(),
'projects' => $user->getProjects()->map(function($project) {
return [
'id' => $project->getId(),
'name' => $project->getName(),
];
})->toArray(),
'requests' => $user->getRequests()->map(function($request) {
return [
'id' => $request->getId(),
'title' => $request->getTitle(),
];
})->toArray(),
]);
}
/**
* @Route("/api/v1/users", name="api_v1_list_users", methods={"GET"})
* @IsGranted("ROLE_DEVELOPER")
*/
public function listUsers()
{
/** @var array */
$users = $this->getDoctrine()
->getRepository(User::class)
->findAll()
;
$results = [];
foreach($users as $u) {
$results[] = [
'id' => $u->getId(),
'username' => $u->getUsername(),
];
}
return new DataResponse([
'users' => $results,
]);
}
/**
* @Route("/api/v1/users/{userId}", name="api_v1_get_user", methods={"GET"}, requirements={"userId"="\d+"})
* @IsGranted("ROLE_DEVELOPER")
*/
public function showUser($userId)
{
/** @var User */
$user = $this->getDoctrine()
->getRepository(User::class)
->find($userId)
;
return new DataResponse([
'user' => [
'id' => $user->getId(),
'username' => $user->getUsername(),
]
]);
}
/**
* @Route("/api/v1/users", name="api_v1_create_user", methods={"POST"})
* @IsGranted("ROLE_DEVELOPER")
*/
public function createUser(Request $request, UserPasswordEncoderInterface $passwordEncoder)
{
$content = $request->getContent();
$projectData = json_decode($content, true);
$newUser = new User();
if (!isset($projectData['username'])) {
return new ErrorResponse(0, "You must provide a username");
}
$newUser->setUsername($projectData['username']);
if (!isset($projectData['password'])) {
return new ErrorResponse(1, "You must provide a password");
}
$newUser->setPassword($passwordEncoder->encodePassword(
$newUser,
$projectData['password']
));
$manager = $this->getDoctrine()->getManager();
$manager->persist($newUser);
$manager->flush();
return new DataResponse([
'user' => $newUser->toArray(),
]);
}
}