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

PackageDomainTrait::get()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 12
rs 9.4285
cc 3
eloc 8
nc 3
nop 1
1
<?php
2
namespace keeko\core\domain\base;
3
4
use keeko\core\model\Package;
5
use keeko\core\model\PackageQuery;
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\PackageEvent;
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 PackageDomainTrait {
23
24
	/**
25
	 */
26
	protected $pool;
27
28
	/**
29
	 * Creates a new Package with the provided data
30
	 * 
31
	 * @param mixed $data
32
	 * @return PayloadInterface
33
	 */
34
	public function create($data) {
35
		// hydrate
36
		$serializer = Package::getSerializer();
37
		$package = $serializer->hydrate(new Package(), $data);
38
39
		// dispatch
40
		$event = new PackageEvent($package);
41
		$dispatcher = $this->getServiceContainer()->getDispatcher();
42
		$dispatcher->dispatch(PackageEvent::PRE_CREATE, $event);
43
		$dispatcher->dispatch(PackageEvent::PRE_SAVE, $event);
44
		$package->save();
45
		$dispatcher->dispatch(PackageEvent::POST_CREATE, $event);
46
		$dispatcher->dispatch(PackageEvent::POST_SAVE, $event);
47
		return new Created(['model' => $package]);
48
	}
49
50
	/**
51
	 * Deletes a Package with the given id
52
	 * 
53
	 * @param mixed $id
54
	 * @return PayloadInterface
55
	 */
56
	public function delete($id) {
57
		// find
58
		$package = $this->get($id);
59
60
		if ($package === null) {
61
			return new NotFound(['message' => 'Package not found.']);
62
		}
63
64
		// delete
65
		$event = new PackageEvent($package);
66
		$dispatcher = $this->getServiceContainer()->getDispatcher();
67
		$dispatcher->dispatch(PackageEvent::PRE_DELETE, $event);
68
		$package->delete();
69
70
		if ($package->isDeleted()) {
71
			$dispatcher->dispatch(PackageEvent::POST_DELETE, $event);
72
			return new Deleted(['model' => $package]);
73
		}
74
75
		return new NotDeleted(['message' => 'Could not delete Package']);
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 = PackageQuery::create();
91
92
		// sorting
93
		$sort = $params->getSort(Package::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
		$package = $query->paginate($page, $size);
107
108
		// run response
109
		return new Found(['model' => $package]);
110
	}
111
112
	/**
113
	 * Returns one Package with the given id
114
	 * 
115
	 * @param mixed $id
116
	 * @return PayloadInterface
117
	 */
118
	public function read($id) {
119
		// read
120
		$package = $this->get($id);
121
122
		// check existence
123
		if ($package === null) {
124
			return new NotFound(['message' => 'Package not found.']);
125
		}
126
127
		return new Found(['model' => $package]);
128
	}
129
130
	/**
131
	 * Updates a Package with the given idand the provided data
132
	 * 
133
	 * @param mixed $id
134
	 * @param mixed $data
135
	 * @return PayloadInterface
136
	 */
137
	public function update($id, $data) {
138
		// find
139
		$package = $this->get($id);
140
141
		if ($package === null) {
142
			return new NotFound(['message' => 'Package not found.']);
143
		}
144
145
		// hydrate
146
		$serializer = Package::getSerializer();
147
		$package = $serializer->hydrate($package, $data);
148
149
		// dispatch
150
		$event = new PackageEvent($package);
151
		$dispatcher = $this->getServiceContainer()->getDispatcher();
152
		$dispatcher->dispatch(PackageEvent::PRE_UPDATE, $event);
153
		$dispatcher->dispatch(PackageEvent::PRE_SAVE, $event);
154
		$rows = $package->save();
155
		$dispatcher->dispatch(PackageEvent::POST_UPDATE, $event);
156
		$dispatcher->dispatch(PackageEvent::POST_SAVE, $event);
157
158
		$payload = ['model' => $package];
159
160
		if ($rows === 0) {
161
			return new NotUpdated($payload);
162
		}
163
164
		return new Updated($payload);
165
	}
166
167
	/**
168
	 * Implement this functionality at keeko\core\domain\PackageDomain
169
	 * 
170
	 * @param PackageQuery $query
171
	 * @param mixed $filter
172
	 * @return void
173
	 */
174
	abstract protected function applyFilter(PackageQuery $query, $filter);
175
176
	/**
177
	 * Returns one Package with the given id from cache
178
	 * 
179
	 * @param mixed $id
180
	 * @return Package|null
181
	 */
182
	protected function get($id) {
183
		if ($this->pool === null) {
184
			$this->pool = new Map();
185
		} else if ($this->pool->has($id)) {
186
			return $this->pool->get($id);
187
		}
188
189
		$package = PackageQuery::create()->findOneById($id);
190
		$this->pool->set($id, $package);
191
192
		return $package;
193
	}
194
195
	/**
196
	 * Returns the service container
197
	 * 
198
	 * @return ServiceContainer
199
	 */
200
	abstract protected function getServiceContainer();
201
}
202