Completed
Push — master ( 9fef8e...159932 )
by Thomas
04:59
created

ReadOnlyDomainTraitGenerator::generateGet()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 1
eloc 10
nc 1
nop 2
1
<?php
2
namespace keeko\tools\generator\domain;
3
4
use Propel\Generator\Model\Table;
5
use gossi\codegen\model\PhpTrait;
6
use gossi\codegen\model\PhpMethod;
7
use gossi\codegen\model\PhpParameter;
8
use keeko\framework\utils\NameUtils;
9
10
class ReadOnlyDomainTraitGenerator extends AbstractDomainGenerator {
11
	
12
	public function generate(Table $model) {
13
		$trait = $this->generateTrait($model);
14
		
15
		$this->generateGet($trait, $model);
16
		$this->generateRead($trait, $model);
17
		$this->generatePaginate($trait, $model);
18
		
19
		return $trait;
20
	}
21
	
22
	protected function generateTrait(Table $model) {
23
		$trait = PhpTrait::create()
24
			->setNamespace(str_replace('model', 'domain\\base', $model->getNamespace()))
25
			->setName($model->getPhpName() . 'DomainTrait')
26
			->addUseStatement($model->getNamespace() . '\\' . $model->getPhpName())
27
			->addUseStatement($model->getNamespace() . '\\' . $model->getPhpName() . 'Query')
28
			->addUseStatement('keeko\\framework\\service\\ServiceContainer')
29
			->setMethod(PhpMethod::create('getServiceContainer')
30
				->setVisibility(PhpMethod::VISIBILITY_PROTECTED)
31
				->setAbstract(true)
32
				->setType('ServiceContainer')
33
				->setDescription('Returns the service container')
34
			)
35
		;
36
		$trait->addUseStatement('keeko\framework\domain\payload\PayloadInterface');
37
		$trait->addUseStatement($model->getNamespace() . '\\' . $model->getPhpName());
38
39
		return $trait;
40
	}
41
	
42
	protected function generateGet(PhpTrait $trait, Table $model) {
43
		$trait->addUseStatement('phootwork\collection\Map');
44
		$trait->setMethod(PhpMethod::create('get')
45
			->addParameter(PhpParameter::create('id'))
46
			->setBody($this->twig->render('get.twig', [
47
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
48
				'class' => $model->getPhpName()
49
			]))
50
			->setVisibility(PhpMethod::VISIBILITY_PROTECTED)
51
			->setDescription('Returns one ' . $model->getPhpName() . ' with the given id from cache')
52
			->setType($model->getPhpName() . '|null')
53
		);
54
	}
55
	
56
	protected function generateRead(PhpTrait $trait, Table $model) {
57
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\Found');
58
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotFound');
59
		
60
		$trait->setMethod(PhpMethod::create('read')
61
			->addParameter(PhpParameter::create('id'))
62
			->setBody($this->twig->render('read.twig', [
63
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
64
				'class' => $model->getPhpName()
65
			]))
66
			->setDescription('Returns one ' . $model->getPhpName() . ' with the given id')
67
			->setType('PayloadInterface')
68
		);
69
	}
70
	
71
	protected function generatePaginate(PhpTrait $trait, Table $model) {
72
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\Found');
73
		$trait->addUseStatement('Tobscure\\JsonApi\\Parameters');
74
		$trait->addUseStatement('keeko\\framework\\utils\\NameUtils');
75
		
76
		$trait->setMethod(PhpMethod::create('paginate')
77
			->addParameter(PhpParameter::create('params')
78
				->setType('Parameters')
79
			)
80
			->setBody($this->twig->render('paginate.twig', [
81
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
82
				'class' => $model->getPhpName()
83
			]))
84
			->setDescription('Returns a paginated result')
85
			->setType('PayloadInterface')
86
		);
87
		
88
		$trait->setMethod(PhpMethod::create('applyFilter')
89
			->addParameter(PhpParameter::create('query')
90
				->setType($model->getPhpName() . 'Query')
91
			)
92
			->addParameter(PhpParameter::create('filter'))
93
			->setVisibility(PhpMethod::VISIBILITY_PROTECTED)
94
			->setAbstract(true)
95
			->setDescription('Implement this functionality at ' . $this->getClassName($model))
96
		);
97
	}
98
	
99
	protected function getClassName(Table $model) {
100
		return str_replace('model', 'domain', $model->getNamespace()) .
101
			'\\' . $model->getPhpName() . 'Domain';
102
	}
103
}
104