Completed
Push — master ( f1c264...f58245 )
by Thomas
04:22
created

ReadOnlyModelDomainTraitGenerator::generateTrait()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

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