Skip to content

Commit

Permalink
locking mechanism improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
takeit committed Nov 18, 2014
1 parent e7c7d54 commit c28d98a
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 202 deletions.
22 changes: 8 additions & 14 deletions newscoop/library/Newscoop/Entity/Article.php
Original file line number Diff line number Diff line change
Expand Up @@ -1407,15 +1407,15 @@ public function setLockUser(User $lockUser = null)
/**
* Gets the value of lockTime.
*
* @return string
* @return DateTime
*/
public function getLockTime()
{
if (null === $this->lockTime) {
return null;
}

return $this->lockTime->format('Y-m-d H:i:s');
return $this->lockTime;
}

/**
Expand All @@ -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
);
}
}
5 changes: 5 additions & 0 deletions newscoop/library/Newscoop/Entity/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -1481,4 +1481,9 @@ public function hasClient(\Newscoop\GimmeBundle\Entity\Client $client)

return false;
}

public function getObject()
{
return clone $this;
}
}
83 changes: 53 additions & 30 deletions newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
serialized_name: attributes
virtual_properties:
getObject:
type: image_uri
serialized_name: image
groups: ["details", "list"]
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down

This file was deleted.

25 changes: 12 additions & 13 deletions spec/Newscoop/GimmeBundle/Controller/ArticlesControllerSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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);
}
}
Loading

0 comments on commit c28d98a

Please sign in to comment.