1 <?php
2
3 /* --------------------------------------------------------------
4 ProductRepository.inc.php 2016-02-02
5 Gambio GmbH
6 http://www.gambio.de
7 Copyright (c) 2016 Gambio GmbH
8 Released under the GNU General Public License (Version 2)
9 [http://www.gnu.org/licenses/gpl-2.0.html]
10 --------------------------------------------------------------
11 */
12
13 /**
14 * Class ProductRepository
15 *
16 * @category System
17 * @package Product
18 * @subpackage Repositories
19 */
20 class ProductRepository implements ProductRepositoryInterface
21 {
22 /**
23 * @var ProductRepositoryReaderInterface
24 */
25 protected $reader;
26
27 /**
28 * @var ProductRepositoryWriterInterface
29 */
30 protected $writer;
31
32 /**
33 * @var ProductRepositoryDeleterInterface
34 */
35 protected $deleter;
36
37 /**
38 * @var ProductSettingsRepositoryInterface
39 */
40 protected $settingsRepo;
41
42 /**
43 * @var AddonValueServiceInterface
44 */
45 protected $addonValueService;
46
47 /**
48 * @var ProductImageContainerRepositoryInterface
49 */
50 protected $imageContainerRepo;
51
52
53 /**
54 * Initialize the product repository.
55 *
56 * @param ProductRepositoryReaderInterface $reader Instance to perform db read actions.
57 * @param ProductRepositoryWriterInterface $writer Instance to perform db write actions.
58 * @param ProductRepositoryDeleterInterface $deleter Instance to perform db delete actions.
59 * @param ProductSettingsRepositoryInterface $settingsRepo Repository instance to read/write/delete
60 * product settings.
61 * @param AddonValueServiceInterface $addonValueService Service to handle product addon values.
62 * @param ProductImageContainerRepositoryInterface $imageContainerRepo Image container of the product.
63 */
64 public function __construct(ProductRepositoryReaderInterface $reader,
65 ProductRepositoryWriterInterface $writer,
66 ProductRepositoryDeleterInterface $deleter,
67 ProductSettingsRepositoryInterface $settingsRepo,
68 AddonValueServiceInterface $addonValueService,
69 ProductImageContainerRepositoryInterface $imageContainerRepo)
70 {
71 $this->reader = $reader;
72 $this->writer = $writer;
73 $this->deleter = $deleter;
74 $this->settingsRepo = $settingsRepo;
75 $this->addonValueService = $addonValueService;
76 $this->imageContainerRepo = $imageContainerRepo;
77 }
78
79
80 /**
81 * Adds a new product in the database.
82 *
83 * @param ProductInterface $product Product entity which holds the values for the database columns.
84 *
85 * @throws InvalidArgumentException If the provided product is not valid.
86 *
87 * @return int Id of inserted product.
88 */
89 public function add(ProductInterface $product)
90 {
91 $productId = $this->writer->insert($product);
92 $productIdType = new IdType($productId);
93
94 $storedProduct = $this->reader->getById($productIdType);
95
96 $storedProduct->addAddonValues($product->getAddonValues());
97 $this->addonValueService->storeAddonValues($storedProduct);
98
99 $storedProduct->setSettings($product->getSettings());
100 $this->settingsRepo->store($productIdType, $storedProduct->getSettings());
101
102 $this->imageContainerRepo->store($productIdType, $product->getImageContainer());
103
104 return $productId;
105 }
106
107
108 /**
109 * Updates an existing product in the database.
110 *
111 * @param StoredProductInterface $product Product entity to update.
112 *
113 * @throws InvalidArgumentException If the provided product is not valid.
114 *
115 * @return ProductRepositoryInterface|$this Same instance for chained method calls.
116 */
117 public function store(StoredProductInterface $product)
118 {
119 $product->setLastModifiedDateTime(new DateTime());
120
121 $productSettings = $product->getSettings();
122 $productId = new IdType($product->getProductId());
123
124 $this->writer->update($product);
125 $this->addonValueService->storeAddonValues($product);
126 $this->settingsRepo->store($productId, $productSettings);
127 $this->imageContainerRepo->store($productId, $product->getImageContainer());
128
129 return $this;
130 }
131
132
133 /**
134 * Gets a stored product by the given id.
135 *
136 * @param IdType $productId Id of expected product entity.
137 *
138 * @return StoredProductInterface Product entity with the expected product id.
139 */
140 public function getProductById(IdType $productId)
141 {
142 $storedProduct = $this->reader->getById($productId);
143 $storedProduct->setSettings($this->settingsRepo->getProductSettingsById($productId));
144 $storedProduct->setImageContainer($this->imageContainerRepo->getByProductId($productId));
145 $this->addonValueService->loadAddonValues($storedProduct);
146
147 return $storedProduct;
148 }
149
150
151 /**
152 * Removes a product from the database by the given id.
153 *
154 * @param IdType $productId Id of expected product entity.
155 *
156 * @return ProductRepositoryInterface|$this Same instance for chained method calls.
157 */
158 public function deleteProductById(IdType $productId)
159 {
160 $storedProduct = $this->reader->getById($productId);
161
162 $this->addonValueService->deleteAddonValues($storedProduct);
163 $this->deleter->deleteById($productId);
164 $this->imageContainerRepo->deleteByProductId($productId);
165
166 return $this;
167 }
168 }