Skip to content
This repository has been archived by the owner on Dec 26, 2022. It is now read-only.

Commit

Permalink
Implement user put- and delete-routes, parameter converter and error-…
Browse files Browse the repository at this point in the history
…/response-handling
  • Loading branch information
fabianlupa committed Aug 16, 2015
1 parent 36c6400 commit 749e48c
Show file tree
Hide file tree
Showing 6 changed files with 197 additions and 20 deletions.
31 changes: 15 additions & 16 deletions app/classes/Controller/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

use Doctrine\ORM\EntityManager;
use KCMS\Models\User;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
* Class UserController
Expand All @@ -30,35 +29,35 @@ public function __construct(EntityManager $entityManager)
*/
public function getAllUsers()
{
return $this->entityManager->getRepository(User::class)->findAll();
return $this->entityManager->getRepository('KCMS\Models\User')->findAll();
}

/**
* @return JsonResponse
* @param User $user
* @return User
*/
public function getAllUsersJson()
public function getUser(User $user)
{
return new JsonResponse($this->getAllUsers());
return $user;
}

/**
* @param $id
* @return null|User
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
* @param User $user
*/
public function getUser($id)
public function createUser(User $user)
{
return $this->entityManager->find(User::class, $id);
$user->setCreatedDate(new \DateTime());
$user->setEditedDate(new \DateTime());
$this->entityManager->persist($user);
$this->entityManager->flush();
}

/**
* @param $id
* @return JsonResponse
* @param User $user
*/
public function getUserJson($id)
public function deleteUser(User $user)
{
return new JsonResponse($found = $this->getUser($id), $found != null ? 200 : 404);
$this->entityManager->remove($user);
$this->entityManager->flush();
}
}
37 changes: 37 additions & 0 deletions app/classes/Converter/AbstractConverter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php
namespace KCMS\Converter;

use Doctrine\ORM\EntityManager;

/**
* Class AbstractConverter
* @package KCMS\Converter
*/
abstract class AbstractConverter
{
/**
* @var EntityManager
*/
protected $entityManager;

/**
* AbstractConverter constructor.
* @param EntityManager $entityManager
*/
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}

/**
* @param $id
* @return object
*/
abstract public function convertFromId($id);

/**
* @param $json
* @return object
*/
abstract public function convertFromJson($json);
}
27 changes: 27 additions & 0 deletions app/classes/Converter/ConverterAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
namespace KCMS\Converter;

/**
* Class ConverterAdapter
* @package KCMS\Converter
*/
class ConverterAdapter extends AbstractConverter
{
/**
* @param $id
* @return object
*/
public function convertFromId($id)
{
return null;
}

/**
* @param $json
* @return object
*/
public function convertFromJson($json)
{
return null;
}
}
51 changes: 51 additions & 0 deletions app/classes/Converter/UserConverter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php
namespace KCMS\Converter;

use KCMS\Models\User;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;

/**
* Class UserConverter
* @package KCMS\Converter
*/
class UserConverter extends AbstractConverter
{
/**
* @param $id
* @return User
* @throws ResourceNotFoundException
*/
public function convertFromId($id)
{
$foundUser = $this->entityManager->getRepository('KCMS\Models\User')->find($id);
if ($foundUser === null) {
throw new ResourceNotFoundException('User with id ' . $id . ' could not be found.', 404);
}

return $foundUser;
}

/**
* @param $json
* @return User
* @throws \InvalidArgumentException
*/
public function convertFromJson($json)
{
$decoded = json_decode($json, true);

$user = User::createUser(
$decoded['username'] ?: null,
$decoded['firstName'] ?: null,
$decoded['lastName'] ?: null,
$decoded['email'] ?: null,
$decoded['password'] ?: null
);

if ($user === null) {
throw new \InvalidArgumentException('User could not be created, invalid arguments.', 400);
} else {
return $user;
}
}
}
22 changes: 21 additions & 1 deletion app/classes/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,27 @@ public function __construct()
$this->groups = new ArrayCollection();
}

/**
* User-factory
* @param $username
* @param $firstName
* @param $lastName
* @param $email
* @param $password
* @return User
*/
public static function createUser($username, $firstName, $lastName, $email, $password)
{
$user = new User();
$user->username = $username;
$user->firstName = $firstName;
$user->lastName = $lastName;
$user->email = $email;
$user->password = $password;

return $user;
}

/**
* @return string
*/
Expand Down Expand Up @@ -295,7 +316,6 @@ public function jsonSerialize()
/**
* @throws ValidationException
* @return void
* @PrePersist @PreUpdate
*/
public function validate()
{
Expand Down
49 changes: 46 additions & 3 deletions app/public/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,65 @@
return \KCMS\Database\DbService::getEntityManager();
});

// Setup error handling
$app->error(function (\Exception $e, $code) {
// TODO: Do not output internal errors in production environment
// TODO: Error-logging
if ($e->getCode() !== 0) {
return new \Symfony\Component\HttpFoundation\Response(
$e->getCode() . ': ' . $e->getMessage(),
400, /* Ignored by silex */
array('X-Status-Code' => $e->getCode())
);
} else {
return new \Symfony\Component\HttpFoundation\Response($code . ': ' . $e->getMessage());
}
});

// Setup converter
$app['user.converter'] = $app->share(function () use ($app) {
return new \KCMS\Converter\UserConverter($app['entityManager']);
});

// Setup controllers

// Add user controller as a service
$app['users.controller'] = $app->share(function () use ($app) {
$app['user.controller'] = $app->share(function () use ($app) {
return new \KCMS\Controller\UserController($app['entityManager']);
});

// Define routes for user controller
/** @var \Silex\ControllerCollection $user */
$user = $app['controllers_factory'];
$user->get('/', 'users.controller:getAllUsersJson');
$user->get('/{id}', 'users.controller:getUserJson');
$user->get('/', 'user.controller:getAllUsers');
$user->get('/{user}', 'user.controller:getUser')->convert('user', 'user.converter:convertFromId');
$user->put('/{user}', 'user.controller:createUser')->convert('user', 'user.converter:convertFromJson');
$user->delete('/{user}', 'user.controller:deleteUser')->convert('user', 'user.converter:convertFromId');

// Mount user controller
$app->mount('/users', $user);


// Convert controller responses accordingly
$app->view(function ($controllerResult, \Symfony\Component\HttpFoundation\Request $request) {
switch ($request->getMethod()) {
case 'GET':
if ($controllerResult !== null) {
return new \Symfony\Component\HttpFoundation\JsonResponse($controllerResult);
} else {
return new \Symfony\Component\HttpFoundation\Response();
}
break;
case 'PUT':
return new \Symfony\Component\HttpFoundation\Response('', $status = 201);
break;
case 'DELETE':
return new \Symfony\Component\HttpFoundation\Response('', $status = 204);
break;
}

return new \Symfony\Component\HttpFoundation\Response();
});

// Start the application
$app->run();

0 comments on commit 749e48c

Please sign in to comment.