commit 90b316951207ab1e6635f8d790ab41cde0ecf432
parent a1e1f8c3ce03ed9bfbcea50e3dc9a2751d9a1cd3
Author: Felicitus <felicitus@felicitus.org>
Date: Mon, 14 Sep 2015 17:58:48 +0200
Refactored controller methods into ADR actions
Diffstat:
6 files changed, 291 insertions(+), 119 deletions(-)
diff --git a/src/PartKeepr/PartBundle/Action/AddStockAction.php b/src/PartKeepr/PartBundle/Action/AddStockAction.php
@@ -0,0 +1,83 @@
+<?php
+namespace PartKeepr\PartBundle\Action;
+
+use Dunglas\ApiBundle\Action\ActionUtilTrait;
+use Dunglas\ApiBundle\Exception\RuntimeException;
+use Dunglas\ApiBundle\Model\DataProviderInterface;
+use PartKeepr\CategoryBundle\Exception\RootNodeNotFoundException;
+use PartKeepr\PartBundle\Entity\Part;
+use PartKeepr\Stock\StockEntry;
+use Symfony\Bridge\Doctrine\ManagerRegistry;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
+
+/**
+ * Adds stock to a given part
+ */
+class AddStockAction
+{
+ use ActionUtilTrait;
+
+ /**
+ * @var DataProviderInterface
+ */
+ private $dataProvider;
+
+ /**
+ * @var ManagerRegistry
+ */
+ private $registry;
+
+ /**
+ * @var TokenStorage
+ */
+ private $tokenStorage;
+
+ public function __construct(
+ DataProviderInterface $dataProvider,
+ TokenStorage $tokenStorage,
+ ManagerRegistry $registry
+ ) {
+ $this->dataProvider = $dataProvider;
+ $this->tokenStorage = $tokenStorage;
+ $this->registry = $registry;
+ }
+
+ /**
+ * Retrieves a collection of resources.
+ *
+ * @param Request $request
+ *
+ * @return array|\Dunglas\ApiBundle\Model\PaginatorInterface|\Traversable
+ *
+ * @throws RuntimeException|RootNodeNotFoundException
+ */
+ public function __invoke(Request $request, $id)
+ {
+ list($resourceType) = $this->extractAttributes($request);
+
+ $part = $this->getItem($this->dataProvider, $resourceType, $id);
+
+ /**
+ * @var $part Part
+ */
+ $quantity = $request->request->get("quantity");
+ $user = $this->tokenStorage->getToken()->getUser();
+
+ $stock = new StockEntry(intval($quantity), $user);
+
+ if ($request->request->has("price") && $request->request->get("price") !== null) {
+ $stock->setPrice(floatval($request->request->get("price")));
+ }
+
+ if ($request->request->has("comment") && $request->request->get("comment") !== null) {
+ $stock->setComment($request->request->get("comment"));
+ }
+
+ $part->addStockEntry($stock);
+ $this->registry->getManager()->persist($stock);
+ $this->registry->getManager()->flush();
+
+ return $part;
+ }
+}
diff --git a/src/PartKeepr/PartBundle/Action/RemoveStockAction.php b/src/PartKeepr/PartBundle/Action/RemoveStockAction.php
@@ -0,0 +1,74 @@
+<?php
+namespace PartKeepr\PartBundle\Action;
+
+use Dunglas\ApiBundle\Action\ActionUtilTrait;
+use Dunglas\ApiBundle\Exception\RuntimeException;
+use Dunglas\ApiBundle\Model\DataProviderInterface;
+use PartKeepr\CategoryBundle\Exception\RootNodeNotFoundException;
+use PartKeepr\PartBundle\Entity\Part;
+use PartKeepr\Stock\StockEntry;
+use Symfony\Bridge\Doctrine\ManagerRegistry;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
+
+/**
+ * Removes stock for a given part
+ */
+class RemoveStockAction
+{
+ use ActionUtilTrait;
+
+ /**
+ * @var DataProviderInterface
+ */
+ private $dataProvider;
+
+ /**
+ * @var ManagerRegistry
+ */
+ private $registry;
+
+ /**
+ * @var TokenStorage
+ */
+ private $tokenStorage;
+
+ public function __construct(
+ DataProviderInterface $dataProvider,
+ TokenStorage $tokenStorage,
+ ManagerRegistry $registry
+ ) {
+ $this->dataProvider = $dataProvider;
+ $this->tokenStorage = $tokenStorage;
+ $this->registry = $registry;
+ }
+ /**
+ * Retrieves a collection of resources.
+ *
+ * @param Request $request
+ *
+ * @return array|\Dunglas\ApiBundle\Model\PaginatorInterface|\Traversable
+ *
+ * @throws RuntimeException|RootNodeNotFoundException
+ */
+ public function __invoke(Request $request, $id)
+ {
+ list($resourceType) = $this->extractAttributes($request);
+
+ $part = $this->getItem($this->dataProvider, $resourceType, $id);
+
+ /**
+ * @var $part Part
+ */
+ $quantity = $request->request->get("quantity");
+ $user = $this->tokenStorage->getToken()->getUser();
+
+ $stock = new StockEntry(0 - intval($quantity), $user);
+ $part->addStockEntry($stock);
+
+ $this->registry->getManager()->persist($stock);
+ $this->registry->getManager()->flush();
+
+ return $part;
+ }
+}
diff --git a/src/PartKeepr/PartBundle/Action/SetStockAction.php b/src/PartKeepr/PartBundle/Action/SetStockAction.php
@@ -0,0 +1,85 @@
+<?php
+namespace PartKeepr\PartBundle\Action;
+
+use Dunglas\ApiBundle\Action\ActionUtilTrait;
+use Dunglas\ApiBundle\Exception\RuntimeException;
+use Dunglas\ApiBundle\Model\DataProviderInterface;
+use PartKeepr\CategoryBundle\Exception\RootNodeNotFoundException;
+use PartKeepr\PartBundle\Entity\Part;
+use PartKeepr\Stock\StockEntry;
+use Symfony\Bridge\Doctrine\ManagerRegistry;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
+
+/**
+ * Sets the stock for a given part
+ */
+class SetStockAction
+{
+ use ActionUtilTrait;
+
+ /**
+ * @var DataProviderInterface
+ */
+ private $dataProvider;
+
+ /**
+ * @var ManagerRegistry
+ */
+ private $registry;
+
+ /**
+ * @var TokenStorage
+ */
+ private $tokenStorage;
+
+ public function __construct(
+ DataProviderInterface $dataProvider,
+ TokenStorage $tokenStorage,
+ ManagerRegistry $registry
+ ) {
+ $this->dataProvider = $dataProvider;
+ $this->tokenStorage = $tokenStorage;
+ $this->registry = $registry;
+ }
+ /**
+ * Retrieves a collection of resources.
+ *
+ * @param Request $request
+ *
+ * @return array|\Dunglas\ApiBundle\Model\PaginatorInterface|\Traversable
+ *
+ * @throws RuntimeException|RootNodeNotFoundException
+ */
+ public function __invoke(Request $request, $id)
+ {
+ list($resourceType) = $this->extractAttributes($request);
+
+ $part = $this->getItem($this->dataProvider, $resourceType, $id);
+
+ /**
+ * @var $part Part
+ */
+ $quantity = $request->request->get("quantity");
+ $user = $this->tokenStorage->getToken()->getUser();
+
+
+ $oldQuantity = $part->getStockLevel();
+ $correctionQuantity = $quantity - $oldQuantity;
+
+ if ($correctionQuantity != 0) {
+
+ $stock = new StockEntry($correctionQuantity, $user);
+
+ if ($request->request->has("comment") && $request->request->get("comment") !== null) {
+ $stock->setComment($request->request->get("comment"));
+ }
+
+ $part->addStockEntry($stock);
+ $this->registry->getManager()->persist($stock);
+ $this->registry->getManager()->flush();
+ }
+
+ return $part;
+ }
+}
diff --git a/src/PartKeepr/PartBundle/Controller/PartController.php b/src/PartKeepr/PartBundle/Controller/PartController.php
@@ -1,119 +0,0 @@
-<?php
-namespace PartKeepr\PartBundle\Controller;
-
-use Dunglas\ApiBundle\JsonLd\Response;
-use FOS\RestBundle\Controller\Annotations\RequestParam;
-use Nelmio\ApiDocBundle\Tests\Fixtures\Controller\ResourceController;
-use PartKeepr\PartBundle\Entity\Part;
-use PartKeepr\Stock\StockEntry;
-use Symfony\Component\HttpFoundation\Request;
-
-class PartController extends ResourceController
-{
- /**
- * Removes stock from a part
- *
- * @RequestParam(name="quantity",description="The quantity to be removed")
- * @param Request $request The request object
- * @param int $id The id of the part to operate on
- *
- * @return Response
- */
- public function removeStockAction(Request $request, $id)
- {
- $resource = $this->getResource($request);
- $part = $this->findOrThrowNotFound($resource, $id);
-
- /**
- * @var $part Part
- */
- $quantity = $request->request->get("quantity");
- $user = $this->get('security.token_storage')->getToken()->getUser();
-
- $stock = new StockEntry(0 - intval($quantity), $user);
- $part->addStockEntry($stock);
- $this->getDoctrine()->getManager()->persist($stock);
- $this->get("doctrine")->getManager()->flush();
-
-
- return $this->getSuccessResponse($resource, $part);
- }
-
- /**
- * Adds stock to a part
- *
- * @RequestParam(name="quantity",description="The quantity to be added")
- * @RequestParam(name="price",description="The price for the addition",default=null,strict=false)
- * @RequestParam(name="comment",description="The comment",default=null,strict=false)
- * @param Request $request The request object
- * @param int $id The id of the part to operate on
- *
- * @return Response
- */
- public function addStockAction(Request $request, $id)
- {
- $resource = $this->getResource($request);
- $part = $this->findOrThrowNotFound($resource, $id);
-
- /**
- * @var $part Part
- */
- $quantity = $request->request->get("quantity");
- $user = $this->get('security.token_storage')->getToken()->getUser();
-
- $stock = new StockEntry(intval($quantity), $user);
-
- if ($request->request->has("price") && $request->request->get("price") !== null) {
- $stock->setPrice(floatval($request->request->get("price")));
- }
-
- if ($request->request->has("comment") && $request->request->get("comment") !== null) {
- $stock->setComment($request->request->get("comment"));
- }
-
- $part->addStockEntry($stock);
- $this->getDoctrine()->getManager()->persist($stock);
- $this->get("doctrine")->getManager()->flush();
-
- return $this->getSuccessResponse($resource, $part);
- }
-
- /**
- * Sets the stock level for a part
- *
- * @RequestParam(name="quantity",description="The quantity to be added")
- * @RequestParam(name="comment",description="The comment",default=null,strict=false)
- * @param Request $request The request object
- * @param int $id The id of the part to operate on
- * @return Response
- */
- public function setStockAction(Request $request, $id)
- {
- $resource = $this->getResource($request);
- $part = $this->findOrThrowNotFound($resource, $id);
-
- /**
- * @var $part Part
- */
- $quantity = $request->request->get("quantity");
- $user = $this->get('security.token_storage')->getToken()->getUser();
-
- $oldQuantity = $part->getStockLevel();
- $correctionQuantity = $quantity - $oldQuantity;
-
- if ($correctionQuantity != 0) {
-
- $stock = new StockEntry($correctionQuantity, $user);
-
- if ($request->request->has("comment") && $request->request->get("comment") !== null) {
- $stock->setComment($request->request->get("comment"));
- }
-
- $part->addStockEntry($stock);
- $this->getDoctrine()->getManager()->persist($stock);
- $this->get("doctrine")->getManager()->flush();
- }
-
- return $this->getSuccessResponse($resource, $part);
- }
-}
diff --git a/src/PartKeepr/PartBundle/DependencyInjection/PartKeeprPartExtension.php b/src/PartKeepr/PartBundle/DependencyInjection/PartKeeprPartExtension.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace PartKeepr\PartBundle\DependencyInjection;
+
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+
+/**
+ * This is the class that loads and manages your bundle configuration
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
+ */
+class PartKeeprPartExtension extends Extension
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+ $loader->load('actions.xml');
+ }
+}
diff --git a/src/PartKeepr/PartBundle/Resources/config/actions.xml b/src/PartKeepr/PartBundle/Resources/config/actions.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+ <services>
+ <service id="partkeepr.part.add_stock" class="PartKeepr\PartBundle\Action\AddStockAction">
+ <argument type="service" id="api.data_provider"/>
+ <argument type="service" id="security.token_storage" />
+ <argument type="service" id="doctrine"/>
+ </service>
+ <service id="partkeepr.part.remove_stock" class="PartKeepr\PartBundle\Action\RemoveStockAction">
+ <argument type="service" id="api.data_provider"/>
+ <argument type="service" id="security.token_storage" />
+ <argument type="service" id="doctrine"/>
+ </service>
+ <service id="partkeepr.part.set_stock" class="PartKeepr\PartBundle\Action\SetStockAction">
+ <argument type="service" id="api.data_provider"/>
+ <argument type="service" id="security.token_storage" />
+ <argument type="service" id="doctrine"/>
+ </service>
+ </services>
+</container>