/** * @Route("/{uuid}/{category}/{key}", requirements={"uuid" = "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"}) * @Method({"POST"}) */ public function postAction(Request $request, $uuid, $category, $key) { $response = new TextPlainResponse('Huh?', 503); $doctrine = $this->getDoctrine(); $em = $doctrine->getManager(); $conn = $em->getConnection(); $recordRepository = $doctrine->getRepository('VirtualPersistBundle:Record'); $user = $doctrine->getRepository('VirtualPersistBundle:User')->findOneByUuid($uuid); if ($user) { $record = $recordRepository->findOneByUserCategoryKey($user, $category, $key); if ($record) { try { $conn->beginTransaction(); $record->setData($request->request->get('data', '')); $record->setTimestamp(new \DateTime('now')); $em->persist($record); $em->flush(); $conn->commit(); } catch (\Exception $e) { $conn->rollback(); $em->close(); throw $e; } } else { // no record // Glean the data to post. $data = $request->request->get('data', ''); $record = new Record(); $record->setOwner($user); $record->setCategory($category); $record->setKey($key); $record->setData($data); $record->setTimestamp(new \DateTime('now')); // Isolate writing the new record in a transaction. $conn->beginTransaction(); try { $em->persist($record); $em->flush(); $conn->commit(); } catch (\Exception $e) { $conn->rollback(); $em->close(); throw $e; } } $response = new TextPlainResponse('Item added.', 200); } else { // no such user $response = new TextPlainResponse('No such item.', 404); } return $this->addDebugInfo($response); }