diff --git a/newscoop/library/Newscoop/Entity/Article.php b/newscoop/library/Newscoop/Entity/Article.php index 27a04f5dd7..c96c5c8899 100755 --- a/newscoop/library/Newscoop/Entity/Article.php +++ b/newscoop/library/Newscoop/Entity/Article.php @@ -1407,7 +1407,7 @@ public function setLockUser(User $lockUser = null) /** * Gets the value of lockTime. * - * @return string + * @return DateTime */ public function getLockTime() { @@ -1415,7 +1415,7 @@ public function getLockTime() return null; } - return $this->lockTime->format('Y-m-d H:i:s'); + return $this->lockTime; } /** @@ -1439,20 +1439,14 @@ public function setLockTime(DateTime $lockTime = null) */ public function getLockTimeDiffrence() { - $time1 = strtotime($this->getLockTime()); - $diffSeconds = abs($time1 - time()); - $days = floor($diffSeconds / 86400); - $diffSeconds -= ($days * 86400); - $hours = floor($diffSeconds / 3600); - $diffSeconds -= $hours * 3600; - $minutes = floor($diffSeconds / 60); - $diffSeconds -= $minutes * 60; + $time1 = $this->getLockTime(); + $sinceStart = $time1->diff(new DateTime()); return array( - 'days' => $days, - 'hours' => $hours, - 'minutes' => $minutes, - 'seconds' => $diffSeconds + 'days' => $sinceStart->d, + 'hours' => $sinceStart->h, + 'minutes' => $sinceStart->i, + 'seconds' => $sinceStart->s ); } } diff --git a/newscoop/library/Newscoop/Entity/User.php b/newscoop/library/Newscoop/Entity/User.php index 2bc16c1954..6323491877 100755 --- a/newscoop/library/Newscoop/Entity/User.php +++ b/newscoop/library/Newscoop/Entity/User.php @@ -1481,4 +1481,9 @@ public function hasClient(\Newscoop\GimmeBundle\Entity\Client $client) return false; } + + public function getObject() + { + return clone $this; + } } diff --git a/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php b/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php index e304206b6e..2893268ab0 100644 --- a/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php +++ b/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php @@ -657,30 +657,65 @@ public function changeArticleStatus(Request $request, $number, $language, $statu } /** - * Lock or unlock article + * Lock article * * @ApiDoc( * statusCodes={ - * 200="Returned when Article lock status changed successfully", + * 200="Returned when article has been locked successfully", * 403="Returned when trying to set the same status" * }, * parameters={ * {"name"="number", "dataType"="integer", "required"=true, "description"="Article number"}, - * {"name"="language", "dataType"="string", "required"=true, "description"="Language code"}, - * {"name"="status", "dataType"="string", "required"=true, "description"="Article lock status: true or false"} + * {"name"="language", "dataType"="string", "required"=true, "description"="Language code"} * } * ) * - * @Route("/articles/{number}/{language}/lock/{status}.{_format}", defaults={"_format"="json", "language"="en"}, options={"expose"=true}, name="newscoop_gimme_articles_changearticlelockstatus") - * @Method("PATCH") + * @Route("/articles/{number}/{language}/lock.{_format}", defaults={"_format"="json", "language"="en"}, options={"expose"=true}, name="newscoop_gimme_articles_changearticlelockstatus") + * @Method("POST") */ - public function patchArticleLockStatus(Request $request, $number, $language, $status) + public function postLockArticle(Request $request, $number, $language) { - $statuses = array("false", "true"); - if (!in_array($status, $statuses)) { - throw new InvalidParametersException('The provided status is not valid, available: true or false'); + $em = $this->container->get('em'); + $article = $em->getRepository('Newscoop\Entity\Article') + ->getArticle($number, $language) + ->getOneOrNullResult(); + + if (!$article) { + throw new NewscoopException('Article does not exist'); } + $response = new Response(); + $response->setStatusCode(403); + if (!$article->isLocked()) { + $article->setLockUser($this->getUser()); + $article->setLockTime(new \DateTime()); + $response->setStatusCode(200); + } + + $em->flush(); + + return $response; + } + + /** + * Unlock article + * + * @ApiDoc( + * statusCodes={ + * 200="Returned when article has been unlocked successfully", + * 403="Returned when trying to set the same status" + * }, + * parameters={ + * {"name"="number", "dataType"="integer", "required"=true, "description"="Article number"}, + * {"name"="language", "dataType"="string", "required"=true, "description"="Language code"} + * } + * ) + * + * @Route("/articles/{number}/{language}/lock.{_format}", defaults={"_format"="json", "language"="en"}, options={"expose"=true}, name="newscoop_gimme_articles_changearticleunlockstatus") + * @Method("DELETE") + */ + public function deleteUnlockArticle(Request $request, $number, $language) + { $em = $this->container->get('em'); $article = $em->getRepository('Newscoop\Entity\Article') ->getArticle($number, $language) @@ -690,28 +725,16 @@ public function patchArticleLockStatus(Request $request, $number, $language, $st throw new NewscoopException('Article does not exist'); } - try { - $response = new Response(); - $response->setStatusCode(403); - if ($status === 'true') { - if (!$article->isLocked()) { - $article->setLockUser($this->getUser()); - $article->setLockTime(new \DateTime()); - $response->setStatusCode(200); - } - } else { - if ($article->isLocked()) { - $article->setLockUser(); - $article->setLockTime(); - $response->setStatusCode(200); - } - } - - $em->flush(); - } catch (\Exception $e) { - throw new NewscoopException('Setting lock status failed!'); + $response = new Response(); + $response->setStatusCode(403); + if ($article->isLocked()) { + $article->setLockUser(); + $article->setLockTime(); + $response->setStatusCode(200); } + $em->flush(); + return $response; } diff --git a/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/Article.yml b/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/Article.yml index 2ff61f2947..d0ce0d8e71 100755 --- a/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/Article.yml +++ b/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/Article.yml @@ -178,7 +178,6 @@ Newscoop\Entity\Article: lockUser: expose: true read_only: true - type: user groups: ["list", "details"] serialized_name: lockUser since_version: 1.1 diff --git a/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/User.yml b/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/User.yml index 25af0ecdf8..3b4c1677e3 100644 --- a/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/User.yml +++ b/newscoop/src/Newscoop/GimmeBundle/Resources/config/serializer/newscoop/User.yml @@ -31,16 +31,15 @@ Newscoop\Entity\User: type: string groups: ["list", "details"] serialized_name: lastName - image: - expose: true - read_only: true - type: string - groups: ["list", "details"] - serialized_name: image attributes: expose: true read_only: true type: array groups: ["list", "details"] access_type: public_method - serialized_name: attributes \ No newline at end of file + serialized_name: attributes + virtual_properties: + getObject: + type: image_uri + serialized_name: image + groups: ["details", "list"] \ No newline at end of file diff --git a/newscoop/src/Newscoop/GimmeBundle/Resources/config/services.yml b/newscoop/src/Newscoop/GimmeBundle/Resources/config/services.yml index 69adac711b..2d04c8ebb6 100644 --- a/newscoop/src/Newscoop/GimmeBundle/Resources/config/services.yml +++ b/newscoop/src/Newscoop/GimmeBundle/Resources/config/services.yml @@ -110,11 +110,6 @@ services: arguments: ["@article.link"] tags: - { name: jms_serializer.handler, type: article_url, direction: serialization, format:json, method:getArticleUrl } - newscoop.gimme.serializer.user_handler: - class: Newscoop\GimmeBundle\Serializer\Article\UserHandler - arguments: ["@image", "@newscoop_newscoop.publication_service", %image%] - tags: - - { name: jms_serializer.handler, type: user, direction: serialization, format:json, method:serializeToJson } newscoop.gimme.oauth_event_listener: class: Newscoop\GimmeBundle\EventListener\OAuthEventListener arguments: ["@em"] diff --git a/newscoop/src/Newscoop/GimmeBundle/Serializer/Article/UserHandler.php b/newscoop/src/Newscoop/GimmeBundle/Serializer/Article/UserHandler.php deleted file mode 100644 index 354275d1b5..0000000000 --- a/newscoop/src/Newscoop/GimmeBundle/Serializer/Article/UserHandler.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2014 Sourcefabric z.ú. - * @license http://www.gnu.org/licenses/gpl-3.0.txt - */ - -namespace Newscoop\GimmeBundle\Serializer\Article; - -use JMS\Serializer\JsonSerializationVisitor; -use Newscoop\Image\ImageService; -use Newscoop\Services\PublicationService; - -/** - * Create simple user array from Newscoop\Entity\User object. - */ -class UserHandler -{ - /** - * Image Service - * @var ImageService - */ - protected $imagesService; - - /** - * Publicatio Service - * @var PublicatioService - */ - protected $publicationService; - - /** - * Images config - * @var array - */ - protected $imageConfig; - - /** - * Construct - * - * @param ImageService $imagesService Image service - * @param PublicationService $publicationService Publication service - * @param array $imageConfig Images config - */ - public function __construct(ImageService $imagesService, PublicationService $publicationService, $imageConfig) - { - $this->imagesService = $imagesService; - $this->publicationService = $publicationService; - $this->imageConfig = $imageConfig; - } - - /** - * Serialize object to JSON - * - * @param JsonSerializationVisitor $visitor JsonSerializationVisitor object - * @param Newscoop\Entity\User $user User object - * @param array $type Serialized object type - * - * @return array Simple array with data of user - */ - public function serializeToJson(JsonSerializationVisitor $visitor, $user, $type) - { - if (!$user) { - return null; - } - - return array( - 'id' => $user->getId(), - 'realname' => $user->getRealName(), - 'username' => $user->getUsername(), - 'image' => $this->publicationService->getPublicationAlias()->getName() . '/' . $this->imageConfig['cache_url'] . '/' . $this->imagesService->getSrc('images/' . $user->getImage(), 120, 120), - 'email' => $user->getEmail(), - ); - } -} diff --git a/spec/Newscoop/GimmeBundle/Controller/ArticlesControllerSpec.php b/spec/Newscoop/GimmeBundle/Controller/ArticlesControllerSpec.php index b3ab22f352..4c5f411e2c 100644 --- a/spec/Newscoop/GimmeBundle/Controller/ArticlesControllerSpec.php +++ b/spec/Newscoop/GimmeBundle/Controller/ArticlesControllerSpec.php @@ -50,9 +50,8 @@ public function it_is_initializable() $this->shouldImplement('FOS\RestBundle\Controller\FOSRestController'); } - public function its_patchArticleLockStatus_should_lock_article($request, $article, $query, $number, $language, $user, $token, $security) + public function its_postLockArticle_should_lock_article($request, $article, $query, $number, $language, $user, $token, $security) { - $status = "true"; $query->getOneOrNullResult()->willReturn($article); $article->isLocked()->willReturn(false); $user = new User('jhon.doe@example.com'); @@ -61,37 +60,37 @@ public function its_patchArticleLockStatus_should_lock_article($request, $articl $token->getUser()->willReturn($user); $article->setLockUser($user)->willReturn(null); $article->setLockTime(new \DateTime())->willReturn(null); - $response = $this->patchArticleLockStatus($request, $number, $language, $status); + $response = $this->postLockArticle($request, $number, $language); $response->shouldBeAnInstanceOf('Symfony\Component\HttpFoundation\Response'); $response->getStatusCode()->shouldReturn(200); } - public function its_patchArticleLockStatus_should_unlock_article($request, $article, $query, $number, $language) + public function its_deleteUnlockArticle_should_unlock_article($request, $article, $query, $number, $language) { - $status = "false"; $article->isLocked()->willReturn(true); $article->setLockUser()->willReturn(null); $article->setLockTime()->willReturn(null); $query->getOneOrNullResult()->willReturn($article); - $response = $this->patchArticleLockStatus($request, $number, $language, $status); + $response = $this->deleteUnlockArticle($request, $number, $language); $response->shouldBeAnInstanceOf('Symfony\Component\HttpFoundation\Response'); $response->getStatusCode()->shouldReturn(200); } - public function its_patchArticleLockStatus_should_return_status_code_403_when_setting_the_same_status($request, $article, $query, $number, $language) + public function its_postLockArticle_should_return_status_code_403_when_setting_the_same_status($request, $article, $query, $number, $language) { - $status = "true"; $article->isLocked()->willReturn(true); $query->getOneOrNullResult()->willReturn($article); - $response = $this->patchArticleLockStatus($request, $number, $language, $status); + $response = $this->postLockArticle($request, $number, $language); $response->shouldBeAnInstanceOf('Symfony\Component\HttpFoundation\Response'); $response->getStatusCode()->shouldReturn(403); } - public function its_patchArticleLockStatus_should_throw_InvalidParametersException_when_wrong_parameters($request, $article, $query, $number, $language) + public function its_deleteUnlockArticle_should_return_status_code_403_when_setting_the_same_status($request, $article, $query, $number, $language) { - $this - ->shouldThrow('Newscoop\Exception\InvalidParametersException') - ->during('patchArticleLockStatus', array($request, $number, $language, 32)); + $article->isLocked()->willReturn(false); + $query->getOneOrNullResult()->willReturn($article); + $response = $this->deleteUnlockArticle($request, $number, $language); + $response->shouldBeAnInstanceOf('Symfony\Component\HttpFoundation\Response'); + $response->getStatusCode()->shouldReturn(403); } } diff --git a/spec/Newscoop/GimmeBundle/Serializer/Article/UserHandlerSpec.php b/spec/Newscoop/GimmeBundle/Serializer/Article/UserHandlerSpec.php deleted file mode 100644 index 5e4f767400..0000000000 --- a/spec/Newscoop/GimmeBundle/Serializer/Article/UserHandlerSpec.php +++ /dev/null @@ -1,57 +0,0 @@ - 'images/cache'); - $type = array( - 'name' => "user", - 'params' => array() - ); - - $this->beConstructedWith($imagesService, $publicationService, $config); - } - - public function it_is_initializable() - { - $this->shouldHaveType('Newscoop\GimmeBundle\Serializer\Article\UserHandler'); - } - - public function it_should_return_a_simple_user_array(JsonSerializationVisitor $visitor, User $user, $publicationService, Aliases $alias, $imagesService, $type) - { - $alias->getId()->willReturn(1); - $alias->getName()->willReturn("newscoop.net"); - $publicationService->getPublicationAlias()->willReturn($alias); - $user->getId()->willReturn(1); - $user->getRealName()->willReturn("Jhon Doe"); - $user->getUsername()->willReturn("doe"); - $user->getEmail()->willReturn("doe@example.com"); - $user->getImage()->willReturn("e7b816f7d39bb6cbd151089baeeb542d9856bf21.jpg"); - - $image = 'images/e7b816f7d39bb6cbd151089baeeb542d9856bf21.jpg'; - $imagesService->getSrc($image, 120, 120)->willReturn('120x120/fit/' . rawurlencode(str_replace('/', '|', $image))); - - $this->serializeToJson($visitor, $user, $type)->shouldReturn(array( - 'id' => 1, - 'realname' => "Jhon Doe", - 'username' => "doe", - 'image' => "newscoop.net/images/cache/120x120/fit/images%7Ce7b816f7d39bb6cbd151089baeeb542d9856bf21.jpg", - 'email' => 'doe@example.com', - )); - } - - public function it_should_return_null_when_no_user(JsonSerializationVisitor $visitor, $type) - { - $this->serializeToJson($visitor, null, $type)->shouldReturn(null); - } -}