Completed
Push — master ( abae3b...04c3fa )
by Thomas
05:59
created

ExtensionDomainTrait::getServiceContainer()

Size

Total Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 1
nc 1
1
<?php
2
namespace keeko\core\domain\base;
3
4
use keeko\core\model\Extension;
5
use keeko\core\model\ExtensionQuery;
6
use keeko\framework\service\ServiceContainer;
7
use keeko\framework\domain\payload\PayloadInterface;
8
use phootwork\collection\Map;
9
use keeko\framework\domain\payload\Found;
10
use keeko\framework\domain\payload\NotFound;
11
use keeko\framework\utils\Parameters;
12
use keeko\framework\utils\NameUtils;
13
use keeko\core\event\ExtensionEvent;
14
use keeko\framework\domain\payload\Created;
15
use keeko\framework\domain\payload\Updated;
16
use keeko\framework\domain\payload\NotUpdated;
17
use keeko\framework\domain\payload\Deleted;
18
use keeko\framework\domain\payload\NotDeleted;
19
20
/**
21
 */
22
trait ExtensionDomainTrait {
23
24
	/**
25
	 */
26
	protected $pool;
27
28
	/**
29
	 * Creates a new Extension with the provided data
30
	 * 
31
	 * @param mixed $data
32
	 * @return PayloadInterface
33
	 */
34
	public function create($data) {
35
		// hydrate
36
		$serializer = Extension::getSerializer();
37
		$extension = $serializer->hydrate(new Extension(), $data);
38
39
		// dispatch
40
		$event = new ExtensionEvent($extension);
41
		$dispatcher = $this->getServiceContainer()->getDispatcher();
42
		$dispatcher->dispatch(ExtensionEvent::PRE_CREATE, $event);
43
		$dispatcher->dispatch(ExtensionEvent::PRE_SAVE, $event);
44
		$extension->save();
45
		$dispatcher->dispatch(ExtensionEvent::POST_CREATE, $event);
46
		$dispatcher->dispatch(ExtensionEvent::POST_SAVE, $event);
47
		return new Created(['model' => $extension]);
48
	}
49
50
	/**
51
	 * Deletes a Extension with the given id
52
	 * 
53
	 * @param mixed $id
54
	 * @return PayloadInterface
55
	 */
56
	public function delete($id) {
57
		// find
58
		$extension = $this->get($id);
59
60
		if ($extension === null) {
61
			return new NotFound(['message' => 'Extension not found.']);
62
		}
63
64
		// delete
65
		$event = new ExtensionEvent($extension);
66
		$dispatcher = $this->getServiceContainer()->getDispatcher();
67
		$dispatcher->dispatch(ExtensionEvent::PRE_DELETE, $event);
68
		$extension->delete();
69
70
		if ($extension->isDeleted()) {
71
			$dispatcher->dispatch(ExtensionEvent::POST_DELETE, $event);
72
			return new Deleted(['model' => $extension]);
73
		}
74
75
		return new NotDeleted(['message' => 'Could not delete Extension']);
76
	}
77
78
	/**
79
	 * Returns a paginated result
80
	 * 
81
	 * @param Parameters $params
82
	 * @return PayloadInterface
83
	 */
84
	public function paginate(Parameters $params) {
85
		$sysPrefs = $this->getServiceContainer()->getPreferenceLoader()->getSystemPreferences();
86
		$defaultSize = $sysPrefs->getPaginationSize();
87
		$page = $params->getPage('number');
88
		$size = $params->getPage('size', $defaultSize);
89
90
		$query = ExtensionQuery::create();
91
92
		// sorting
93
		$sort = $params->getSort(Extension::getSerializer()->getSortFields());
94
		foreach ($sort as $field => $order) {
95
			$method = 'orderBy' . NameUtils::toStudlyCase($field);
96
			$query->$method($order);
97
		}
98
99
		// filtering
100
		$filter = $params->getFilter();
101
		if (!empty($filter)) {
102
			$this->applyFilter($query, $filter);
103
		}
104
105
		// paginate
106
		$extension = $query->paginate($page, $size);
107
108
		// run response
109
		return new Found(['model' => $extension]);
110
	}
111
112
	/**
113
	 * Returns one Extension with the given id
114
	 * 
115
	 * @param mixed $id
116
	 * @return PayloadInterface
117
	 */
118
	public function read($id) {
119
		// read
120
		$extension = $this->get($id);
121
122
		// check existence
123
		if ($extension === null) {
124
			return new NotFound(['message' => 'Extension not found.']);
125
		}
126
127
		return new Found(['model' => $extension]);
128
	}
129
130
	/**
131
	 * Sets the Package id
132
	 * 
133
	 * @param mixed $id
134
	 * @param mixed $packageId
135
	 * @return PayloadInterface
136
	 */
137
	public function setPackageId($id, $packageId) {
138
		// find
139
		$extension = $this->get($id);
140
141
		if ($extension === null) {
142
			return new NotFound(['message' => 'Extension not found.']);
143
		}
144
145
		// update
146
		if ($extension->getPackageId() !== $packageId) {
147
			$extension->setPackageId($packageId);
148
149
			$event = new ExtensionEvent($extension);
150
			$dispatcher = $this->getServiceContainer()->getDispatcher();
151
			$dispatcher->dispatch(ExtensionEvent::PRE_PACKAGE_UPDATE, $event);
152
			$dispatcher->dispatch(ExtensionEvent::PRE_SAVE, $event);
153
			$extension->save();
154
			$dispatcher->dispatch(ExtensionEvent::POST_PACKAGE_UPDATE, $event);
155
			$dispatcher->dispatch(ExtensionEvent::POST_SAVE, $event);
156
			
157
			return Updated(['model' => $extension]);
158
		}
159
160
		return NotUpdated(['model' => $extension]);
161
	}
162
163
	/**
164
	 * Updates a Extension with the given idand the provided data
165
	 * 
166
	 * @param mixed $id
167
	 * @param mixed $data
168
	 * @return PayloadInterface
169
	 */
170
	public function update($id, $data) {
171
		// find
172
		$extension = $this->get($id);
173
174
		if ($extension === null) {
175
			return new NotFound(['message' => 'Extension not found.']);
176
		}
177
178
		// hydrate
179
		$serializer = Extension::getSerializer();
180
		$extension = $serializer->hydrate($extension, $data);
181
182
		// dispatch
183
		$event = new ExtensionEvent($extension);
184
		$dispatcher = $this->getServiceContainer()->getDispatcher();
185
		$dispatcher->dispatch(ExtensionEvent::PRE_UPDATE, $event);
186
		$dispatcher->dispatch(ExtensionEvent::PRE_SAVE, $event);
187
		$rows = $extension->save();
188
		$dispatcher->dispatch(ExtensionEvent::POST_UPDATE, $event);
189
		$dispatcher->dispatch(ExtensionEvent::POST_SAVE, $event);
190
191
		$payload = ['model' => $extension];
192
193
		if ($rows === 0) {
194
			return new NotUpdated($payload);
195
		}
196
197
		return new Updated($payload);
198
	}
199
200
	/**
201
	 * Implement this functionality at keeko\core\domain\ExtensionDomain
202
	 * 
203
	 * @param ExtensionQuery $query
204
	 * @param mixed $filter
205
	 * @return void
206
	 */
207
	abstract protected function applyFilter(ExtensionQuery $query, $filter);
208
209
	/**
210
	 * Returns one Extension with the given id from cache
211
	 * 
212
	 * @param mixed $id
213
	 * @return Extension|null
214
	 */
215
	protected function get($id) {
216
		if ($this->pool === null) {
217
			$this->pool = new Map();
218
		} else if ($this->pool->has($id)) {
219
			return $this->pool->get($id);
220
		}
221
222
		$extension = ExtensionQuery::create()->findOneById($id);
223
		$this->pool->set($id, $extension);
224
225
		return $extension;
226
	}
227
228
	/**
229
	 * Returns the service container
230
	 * 
231
	 * @return ServiceContainer
232
	 */
233
	abstract protected function getServiceContainer();
234
}
235