RESTController.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace WebserviceBundle\Controller;
  3. use ClientBundle\Form\ClientType;
  4. use FOS\RestBundle\Controller\Annotations\QueryParam;
  5. use FOS\RestBundle\Controller\Annotations\RouteResource;
  6. use FOS\RestBundle\Controller\Annotations\View;
  7. use FOS\RestBundle\Request\ParamFetcherInterface;
  8. use FOS\RestBundle\Util\Codes;
  9. use FOS\RestBundle\View\View as FOSView;
  10. use ReflectionClass;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  12. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  13. use Symfony\Component\Form\Form;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Voryx\RESTGeneratorBundle\Controller\VoryxController;
  17. abstract class RESTController extends VoryxController
  18. {
  19. /**
  20. * @return string Retorna el nombre de la Entity de trabajo.
  21. */
  22. abstract public function getRepository();
  23. /**
  24. * @return string Retorna el tipo de la clase.
  25. */
  26. // abstract public function getFormEntityType();
  27. /**
  28. * @return string Retorna el tipo de la clase.
  29. */
  30. public function getFormEntityType()
  31. {
  32. return get_class(new ClientType());
  33. }
  34. /**
  35. * Get all entities.
  36. *
  37. * @View(serializerEnableMaxDepthChecks=true)
  38. *
  39. * @param ParamFetcherInterface $paramFetcher
  40. * @param string $repository
  41. *
  42. * @return Response
  43. *
  44. * @QueryParam(name="offset", requirements="\d+", nullable=true, description="Offset from which to start listing notes.")
  45. * @QueryParam(name="limit", requirements="\d+", default="20", description="How many notes to return.")
  46. * @QueryParam(name="order_by", nullable=true, array=true, description="Order by fields. Must be an array ie. &order_by[name]=ASC&order_by[description]=DESC")
  47. * @QueryParam(name="filters", nullable=true, array=true, description="Filter by fields. Must be an array ie. &filters[id]=3")
  48. * &filters[qb-criteria] => Utilizará el matching con criteria donde los parámetros filters realizarán "field like %value%".
  49. */
  50. public function cgetAction(ParamFetcherInterface $paramFetcher)
  51. {
  52. $em = $this->getDoctrine()->getManager();
  53. $filters = !is_null($paramFetcher->get('filters')) ? $paramFetcher->get('filters') : array();
  54. if (isset($filters['tenancyId'])) {
  55. // tengo que buscar por tenencia.
  56. $tenancyService = $this->container->get('base_tenancy.tenancy_service');
  57. $tenancyService->setTenancy($filters['tenancyId']);
  58. unset($filters['tenancyId']);
  59. }
  60. if (isset($filters['qb-criteria'])) {
  61. try {
  62. unset($filters['qb-criteria']);
  63. $criteria = new \Doctrine\Common\Collections\Criteria();
  64. foreach ($filters as $field => $value) {
  65. $criteria->andWhere($criteria->expr()->contains("$field", "$value"));
  66. }
  67. if (!is_null($paramFetcher->get('offset'))) {
  68. $criteria->setFirstResult($paramFetcher->get('offset'));
  69. }
  70. if (!is_null($paramFetcher->get('limit'))) {
  71. $criteria->setMaxResults($paramFetcher->get('limit'));
  72. }
  73. if ($paramFetcher->get('order_by')) {
  74. $order_by = $paramFetcher->get('order_by');
  75. $orderBy = array();
  76. foreach ($order_by as $field => $order) {
  77. $orderBy[$field] = $order;
  78. }
  79. $criteria->orderBy($orderBy);
  80. }
  81. $repo = $em->getRepository($this->getRepository());
  82. $entities = $repo->matching($criteria)->toArray();
  83. if ($entities) {
  84. return $entities;
  85. }
  86. } catch (\Exception $e) {
  87. return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
  88. }
  89. } else {
  90. try {
  91. $offset = $paramFetcher->get('offset');
  92. $limit = $paramFetcher->get('limit');
  93. $order_by = $paramFetcher->get('order_by');
  94. $entities = $em->getRepository($this->getRepository())->findBy($filters, $order_by, $limit, $offset);
  95. if ($entities) {
  96. return $entities;
  97. }
  98. } catch (\Exception $e) {
  99. return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
  100. }
  101. }
  102. return array();
  103. }
  104. /**
  105. * @return object Retorna el nombre de la Entity de trabajo.
  106. */
  107. public function getObject()
  108. {
  109. $obj = $this->getDoctrine()->getManager()->getMetadataFactory()->getMetadataFor($this->getRepository())->getName();
  110. $rc = new ReflectionClass($obj);
  111. return $rc->newInstance();
  112. }
  113. /**
  114. * Create a Client entity.
  115. *
  116. * @View(statusCode=201, serializerEnableMaxDepthChecks=true)
  117. *
  118. * @param Request $request Contiene el request.
  119. *
  120. * @return FOSView|mixed Retorna el FOSView o la entidad.
  121. *
  122. */
  123. public function postAction(Request $request)
  124. {
  125. // file_put_contents("/tmp/t", "LLEGO\n",8);
  126. $entity = $this->getObject();
  127. $form = $this->createForm($this->getFormEntityType(), $entity, array("method" => $request->getMethod()));
  128. $this->removeExtraFields($request, $form);
  129. $form->handleRequest($request);
  130. if ($form->isSubmitted() && $form->isValid()) {
  131. $em = $this->getDoctrine()->getManager();
  132. $em->persist($entity);
  133. $em->flush();
  134. return $entity;
  135. }
  136. return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
  137. }
  138. /**
  139. * Update a Client entity.
  140. *
  141. * @View(serializerEnableMaxDepthChecks=true)
  142. *
  143. * @param Request $request Contiene el request.
  144. * @param mixed $entity Contiene la entidad
  145. *
  146. * @return FOSView|mixed Retorna el FOSView o la entidad.
  147. */
  148. public function putAction(Request $request, $entity = null)
  149. {
  150. try {
  151. $em = $this->getDoctrine()->getManager();
  152. $request->setMethod('PATCH'); //Treat all PUTs as PATCH
  153. $form = $this->createForm($this->getFormEntityType(), $entity, array("method" => $request->getMethod()));
  154. $this->removeExtraFields($request, $form);
  155. $form->handleRequest($request);
  156. if ($form->isValid()) {
  157. $em->flush();
  158. return $entity;
  159. }
  160. return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
  161. } catch (\Exception $e) {
  162. return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
  163. }
  164. }
  165. /**
  166. * Partial Update to a Client entity.
  167. *
  168. * @View(serializerEnableMaxDepthChecks=true)
  169. *
  170. * @param Request $request Contiene el request.
  171. * @param mixed $entity Contiene la entidad.
  172. *
  173. * @return Response Retorna un response.
  174. */
  175. public function patchAction(Request $request, $entity)
  176. {
  177. return $this->putAction($request, $entity);
  178. }
  179. /**
  180. * Delete a Client entity.
  181. *
  182. * @View(statusCode=204)
  183. *
  184. * @param Request $request Contiene el request.
  185. * @param mixed $entity Contiene la entidad a borrar.
  186. *
  187. * @return FOSView Retorna el FSOView.
  188. */
  189. public function deleteAction(Request $request, $entity)
  190. {
  191. try {
  192. $em = $this->getDoctrine()->getManager();
  193. $em->remove($entity);
  194. $em->flush();
  195. return null;
  196. } catch (\Exception $e) {
  197. return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
  198. }
  199. }
  200. /**
  201. * Get a Client entity
  202. *
  203. * @View(serializerEnableMaxDepthChecks=true)
  204. *
  205. * @param mixed $entity Contiene la entidad.
  206. *
  207. * @return Response
  208. *
  209. */
  210. public function getAction($entity)
  211. {
  212. return $entity;
  213. }
  214. }