Skip to content

Commit

Permalink
Add explicit transaction handling for versioned requests because of e…
Browse files Browse the repository at this point in the history
…xception
  • Loading branch information
Robin Kählert committed Dec 26, 2018
1 parent fdbd82f commit 5b2bc6f
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 3 deletions.
8 changes: 8 additions & 0 deletions src/Controller/JobController.php
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ public function createJob(Request $request) {
* @Route("/api/job/{id}", name="updateJob", methods="POST")
*/
public function updateJob($id, Request $request) {
$this->entityManager->getConnection()->beginTransaction();
try {
$requestData = json_decode($request->getContent(), true);
$job = $this->entityManager->getRepository(Job::class)->find($id, \Doctrine\DBAL\LockMode::OPTIMISTIC, $requestData['version']);
Expand All @@ -208,12 +209,15 @@ public function updateJob($id, Request $request) {

$this->setJobData($job, $requestData);
$this->entityManager->flush();
$this->entityManager->getConnection()->commit();
return new Response(
$this->serializer->serialize($job, 'json', ['groups' => ['api']]), Response::HTTP_OK, ['Content-type' => 'application/json']
);
} catch (\Doctrine\ORM\OptimisticLockException $ole) {
$this->entityManager->getConnection()->rollBack();
return $this->json(array('code' => 423, 'message' => $ole->getMessage()), 423);
} catch (\Exception $ex) {
$this->entityManager->getConnection()->rollBack();
return $this->json(array('code' => 500, 'message' => $ex->getMessage()), 500);
}
}
Expand All @@ -223,17 +227,21 @@ public function updateJob($id, Request $request) {
* @Security("has_role('ROLE_ADMIN')")
*/
public function setInvoiceNumber($id, Request $request) {
$this->entityManager->getConnection()->beginTransaction();
try {
$requestData = json_decode($request->getContent(), true);
$job = $this->entityManager->getRepository(Job::class)->find($id, \Doctrine\DBAL\LockMode::OPTIMISTIC, $requestData['job']['version']);
$job->setInvoiceNumber($requestData["invoiceNumber"]);
$this->entityManager->flush();
$this->entityManager->getConnection()->commit();
return new Response(
$this->serializer->serialize($job, 'json', ['groups' => ['api']]), Response::HTTP_OK, ['Content-type' => 'application/json']
);
} catch (\Doctrine\ORM\OptimisticLockException $ole) {
$this->entityManager->getConnection()->rollBack();
return $this->json(array('code' => 423, 'message' => $ole->getMessage()), 423);
} catch (\Exception $ex) {
$this->entityManager->getConnection()->rollBack();
return $this->json(array('code' => 500, 'message' => $ex->getMessage()), 500);
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/Controller/TaskController.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public function createTaskForLoggedInUser(Request $request) {
* @Route("/api/task/{taskId}", name="changeTaskForLoggedInUser", methods="POST")
*/
public function changeTaskForLoggedInUser($taskId, Request $request) {
$this->entityManager->getConnection()->beginTransaction();
try {
$requestData = json_decode($request->getContent(), true);
$task = $this->entityManager->getRepository(Task::class)->find($taskId, \Doctrine\DBAL\LockMode::OPTIMISTIC, $requestData['version']);
Expand All @@ -72,15 +73,18 @@ public function changeTaskForLoggedInUser($taskId, Request $request) {
$task->setDate(new \DateTime($requestData['date']));
$task->setArranger($this->entityManager->getRepository(User::class)->findOneByUsername($this->getUser()->getUsername()));
$this->entityManager->flush();
$this->entityManager->getConnection()->commit();
return new Response(
$this->serializer->serialize($task, 'json', ['groups' => ['api']]), Response::HTTP_OK, ['Content-type' => 'application/json']
);
} else {
return $this->json(array('code' => 403, 'message' => 'Not allowed to change task from another user'), 403);
}
} catch(\Doctrine\ORM\OptimisticLockException $ole) {
$this->entityManager->getConnection()->rollBack();
return $this->json(array('code' => 423, 'message' => $ole->getMessage()), 423);
} catch (\Exception $ex) {
$this->entityManager->getConnection()->rollBack();
return $this->json(array('code' => 500, 'message' => $ex->getMessage()), 500);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Entity/Job.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Job
{
/**
* @ORM\Id()
* @ORM\Column(type="string", length=16)
* @ORM\Column(type="string", length=11)
* @Groups({"api"})
*/
private $id;
Expand Down
4 changes: 2 additions & 2 deletions src/Service/JobService.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public function __construct(EntityManagerInterface $em) {
}

private function getId($year, $month, $counter) {
return sprintf("%d-%'.02d-%'.04d", $year, $month, $counter);
return sprintf("%d-%'.02d-%'.03d", $year, $month, $counter);
}

public function generateJobId() {
Expand All @@ -28,7 +28,7 @@ public function generateJobId() {
$latestJobMonth = intval(explode('-', $latestJob->getId())[1]);
$latestJobNumber = intval(explode('-', $latestJob->getId())[2]);

if ($latestJobNumber == 9999) {
if ($latestJobNumber == 999) {
throw new \Exception('Keine Jobnummern mehr übrig für den laufenden Monat');
}

Expand Down

0 comments on commit 5b2bc6f

Please sign in to comment.