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

ModelDomainTraitGenerator::generate()   B

Complexity

Conditions 4
Paths 2

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 29
rs 8.5806
cc 4
eloc 17
nc 2
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 Propel\Generator\Model\ForeignKey;
9
use Propel\Generator\Model\Table;
10
11
class ModelDomainTraitGenerator extends ReadOnlyModelDomainTraitGenerator {
12
	
13
	public function generate(Table $model) {
14
		$trait = parent::generate($model);
15
		
16
		$this->generateCreate($trait, $model);
17
		$this->generateUpdate($trait, $model);
18
		$this->generateDelete($trait, $model);
19
		
20
		// generate relationship methods
21
		if (!$model->isReadOnly()) {
22
			$relationships = $this->modelService->getRelationships($model);
23
			
24
			// to-one relationships
25
			foreach ($relationships['one'] as $one) {
26
				$fk = $one['fk'];
27
				$this->generateToOneRelationshipSet($trait, $model, $fk->getForeignTable(), $fk);
28
			}
29
30
			// to-many relationships
31
			foreach ($relationships['many'] as $many) {
32
				$fk = $many['fk'];
33
				$cfk = $many['cfk'];
34
				$this->generateToManyRelationshipAdd($trait, $model, $fk->getForeignTable(), $cfk->getMiddleTable());
35
				$this->generateToManyRelationshipUpdate($trait, $model, $fk->getForeignTable(), $cfk->getMiddleTable());
36
				$this->generateToManyRelationshipRemove($trait, $model, $fk->getForeignTable(), $cfk->getMiddleTable());
37
			}
38
		}
39
40
		return $trait;
41
	}
42
	
43
	protected function generateCreate(PhpTrait $trait, Table $model) {
44
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\Created');
45
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotFound');
46
	
47
		$trait->setMethod(PhpMethod::create('create')
48
			->addParameter(PhpParameter::create('data'))
49
			->setBody($this->twig->render('create.twig', [
50
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
51
				'class' => $model->getPhpName()
52
			]))
53
			->setDescription('Creates a new ' . $model->getPhpName() . ' with the provided data')
54
			->setType('PayloadInterface')
55
		);
56
	}
57
	
58
	protected function generateUpdate(PhpTrait $trait, Table $model) {
59
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\Updated');
60
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotUpdated');
61
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotFound');
62
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotValid');
63
		
64
		$trait->setMethod(PhpMethod::create('update')
65
			->addParameter(PhpParameter::create('id'))
66
			->addParameter(PhpParameter::create('data'))
67
			->setBody($this->twig->render('update.twig', [
68
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
69
				'class' => $model->getPhpName()
70
			]))
71
			->setDescription('Updates a ' . $model->getPhpName() . ' with the given id' .
72
				'and the provided data')
73
			->setType('PayloadInterface')
74
		);
75
	}
76
	
77
	protected function generateDelete(PhpTrait $trait, Table $model) {
78
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\Deleted');
79
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotDeleted');
80
		$trait->addUseStatement('keeko\\framework\\domain\\payload\\NotFound');
81
		
82
		$trait->setMethod(PhpMethod::create('delete')
83
			->addParameter(PhpParameter::create('id'))
84
			->setBody($this->twig->render('delete.twig', [
85
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
86
				'class' => $model->getPhpName()
87
			]))
88
			->setDescription('Deletes a ' . $model->getPhpName() . ' with the given id')
89
			->setType('PayloadInterface')
90
		);
91
	}
92
	
93
	protected function generateToOneRelationshipSet(PhpTrait $trait, Table $model, Table $foreign, ForeignKey $fk) {
94
		$name = $fk->getPhpName();
95
		if (empty($name)) {
96
			$name = $foreign->getPhpName();
97
		}
98
		$localId = NameUtils::toCamelCase($fk->getLocalColumn()->getPhpName());
99
		$trait->setMethod(PhpMethod::create('set' . $name . 'Id')
100
			->setDescription(str_replace('{foreign}', $foreign->getPhpName(), 'Sets the {foreign} id'))
101
			->addParameter(PhpParameter::create('id'))
102
			->addParameter(PhpParameter::create($localId))
103
			->setBody($this->twig->render('to-one-set.twig', [
104
				'model' => NameUtils::toCamelCase($model->getOriginCommonName()),
105
				'class' => $model->getPhpName(),
106
				'fk_id' => $localId,
107
				'local' => $fk->getLocalColumn()->getPhpName()
108
			]))
109
			->setType('PayloadInterface')
110
		);
111
	}
112
	
113
	protected function generateToManyRelationshipAdd(PhpTrait $trait, Table $model, Table $foreign, Table $middle) {
1 ignored issue
show
Unused Code introduced by
The parameter $middle is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
114
		$trait->addUseStatement($foreign->getNamespace() . '\\' . $foreign->getPhpName() . 'Query');
115
		$trait->setMethod(PhpMethod::create('add' . $foreign->getPhpName())
116
			->setDescription('Adds ' . $foreign->getPhpName() . ' to ' . $model->getPhpName())
117
			->addParameter(PhpParameter::create('id'))
118
			->addParameter(PhpParameter::create('data'))
119
			->setBody($this->twig->render('to-many-add.twig', [
120
				'model' => $model->getCamelCaseName(),
121
				'class' => $model->getPhpName(),				
122
				'foreign_model' => $foreign->getCamelCaseName(),
123
				'foreign_class' => $foreign->getPhpName()
124
			]))
125
			->setType('PayloadInterface')
126
		);
127
	}
128
	
129
	protected function generateToManyRelationshipUpdate(PhpTrait $trait, Table $model, Table $foreign, Table $middle) {
130
		$trait->addUseStatement($middle->getNamespace() . '\\' . $middle->getPhpName() . 'Query');
131
		$trait->addUseStatement($foreign->getNamespace() . '\\' . $foreign->getPhpName() . 'Query');
132
		$trait->setMethod(PhpMethod::create('update' . $foreign->getPhpName())
133
			->setDescription('Updates ' . $foreign->getPhpName() . ' on ' . $model->getPhpName())
134
			->addParameter(PhpParameter::create('id'))
135
			->addParameter(PhpParameter::create('data'))
136
			->setBody($this->twig->render('to-many-update.twig', [
137
				'model' => $model->getCamelCaseName(),
138
				'class' => $model->getPhpName(),
139
				'foreign_model' => $foreign->getCamelCaseName(),
140
				'foreign_class' => $foreign->getPhpName(),
141
				'middle_class' => $middle->getPhpName()
142
			]))
143
			->setType('PayloadInterface')
144
		);
145
	}
146
	
147
	protected function generateToManyRelationshipRemove(PhpTrait $trait, Table $model, Table $foreign, Table $middle) {
1 ignored issue
show
Unused Code introduced by
The parameter $middle is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
148
		$trait->addUseStatement($foreign->getNamespace() . '\\' . $foreign->getPhpName() . 'Query');
149
		$trait->setMethod(PhpMethod::create('remove' . $foreign->getPhpName())
150
			->setDescription('Removes ' . $foreign->getPhpName() . ' from ' . $model->getPhpName())
151
			->addParameter(PhpParameter::create('id'))
152
			->addParameter(PhpParameter::create('data'))
153
			->setBody($this->twig->render('to-many-remove.twig', [
154
				'model' => $model->getCamelCaseName(),
155
				'class' => $model->getPhpName(),
156
				'foreign_model' => $foreign->getCamelCaseName(),
157
				'foreign_class' => $foreign->getPhpName()
158
			]))
159
			->setType('PayloadInterface')
160
		);
161
	}
162
}