Passed
Push — master ( 7d615b...d4db62 )
by Jean-Christophe
09:33
created

JsonApiResponseFormatter::addSelfLink()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 2
ccs 0
cts 2
cp 0
rs 10
cc 1
nc 1
nop 3
crap 2
1
<?php
2
3
namespace Ubiquity\controllers\rest\api\jsonapi;
4
5
use Ubiquity\controllers\rest\ResponseFormatter;
6
use Ubiquity\orm\OrmUtils;
7
use Ubiquity\cache\ClassUtils;
8
9
/**
10
 * JsonAPI Formatter.
11
 * Ubiquity\controllers\rest\api\jsonapi$JsonApiResponseFormatter
12
 * This class is part of Ubiquity
13
 *
14
 * @author jcheron <[email protected]>
15
 * @version 1.0.0
16
 * @since Ubiquity 2.0.11
17
 */
18
class JsonApiResponseFormatter extends ResponseFormatter {
19
	private $selfLink = "%baseRoute%/%classname%/%id%/";
20
	private $relationLink = "%baseRoute%/%classname%/%id%/%member%/";
21
	private $pageLink = "%baseRoute%/%classname%/?page[number]=%pageNumber%&page[size]=%pageSize%";
22
	private $baseRoute;
23
24
	public function __construct($baseRoute = "") {
25
		$this->baseRoute = $baseRoute;
26
	}
27
28
	/**
29
	 *
30
	 * {@inheritdoc}
31
	 * @see \Ubiquity\controllers\rest\ResponseFormatter::cleanRestObject()
32
	 */
33
	public function cleanRestObject($o, &$classname = null) {
34
		$pk = OrmUtils::getFirstKeyValue ( $o );
35
		$classname = get_class ( $o );
36
		$frontClassname = $this->getFrontClassname ( $classname );
37
		$r = [ 'id' => $pk,'type' => $frontClassname ];
38
		$r ['attributes'] = $o->_rest;
39
		$fieldsInRelations = OrmUtils::getRelationInfos ( $classname );
40
41
		$this->addSelfLink ( $r, $pk, $frontClassname );
42
		$o = $o->_rest;
43
		foreach ( $o as $k => $v ) {
44
			if (isset ( $fieldsInRelations [$k] )) {
45
				$member = $fieldsInRelations [$k] ['member'] ?? $k;
46
				if (isset ( $v->_rest )) {
47
					$r ['included'] [$k] = $this->cleanRestObject ( $v );
48
				} elseif (\is_array ( $v )) {
49
					foreach ( $v as $index => $value ) {
50
						if (isset ( $value->_rest ))
51
							$v [$index] = $this->cleanRestObject ( $value );
52
					}
53
					$r ['included'] [$k] = $v;
54
				} else {
55
					if (isset ( $v )) {
56
						$rFrontClassname = $this->getFrontClassname ( $fieldsInRelations [$k] ['className'] );
57
						$r ['relationships'] [$member] ['data'] = [ 'id' => $v,'type' => $rFrontClassname ];
58
						$this->addRelationshipsLink ( $r, $pk, $v, $frontClassname, $rFrontClassname, $member );
59
					}
60
				}
61
62
				unset ( $r ['attributes'] [$member] );
63
				unset ( $r ['attributes'] [$k] );
64
			}
65
		}
66
		unset ( $r ['attributes'] ['id'] );
67
		unset ( $r ['attributes'] ['_rest'] );
68
		return $r;
69
	}
70
71
	protected function addSelfLink(&$r, $pk, $frontClassname) {
72
		$r ['links'] ['self'] = $this->getLink ( $this->selfLink, [ "baseRoute" => $this->baseRoute,'id' => $pk,'classname' => $frontClassname ] );
73
	}
74
75
	/**
76
	 * Adds page links
77
	 *
78
	 * @param array $r
79
	 * @param string $classname
80
	 * @param array $pages
81
	 */
82
	protected function addPageLinks(&$r, $classname, $pages) {
83
		$pageSize = $pages ['pageSize'];
84
		unset ( $pages ['pageSize'] );
85
		foreach ( $pages as $page => $number ) {
86
			$r ['links'] [$page] = $this->getLink ( $this->pageLink, [ "baseRoute" => $this->baseRoute,'classname' => $classname,'pageNumber' => $number,'pageSize' => $pageSize ] );
87
		}
88
	}
89
90
	protected function addRelationshipsLink(&$r, $pk, $pkMember, $frontClassname, $rFrontClassname, $member) {
91
		$r ['relationships'] [$member] ['links'] = [ $this->getLink ( $this->relationLink, [ "baseRoute" => $this->baseRoute,'id' => $pk,'member' => $member,'classname' => $frontClassname ] ),$this->getLink ( $this->selfLink, [ "baseRoute" => $this->baseRoute,'id' => $pkMember,'classname' => $rFrontClassname ] ) ];
92
	}
93
94
	private function getLink($pattern, $params = []) {
95
		$r = $pattern;
96
		foreach ( $params as $k => $v ) {
97
			$r = str_replace ( '%' . $k . '%', $v, $r );
98
		}
99
		return $r;
100
	}
101
102
	private function getFrontClassname($classname) {
103
		return lcfirst ( ClassUtils::getClassSimpleName ( $classname ) );
104
	}
105
106
	/**
107
	 *
108
	 * {@inheritdoc}
109
	 * @see \Ubiquity\controllers\rest\ResponseFormatter::get()
110
	 */
111
	public function get($objects, $pages = null) {
112
		$objects = $this->getDatas ( $objects, $classname );
113
		$r = [ 'data' => $objects ];
114
		if (isset ( $pages ) && sizeof ( $objects ) > 0) {
115
			$this->addPageLinks ( $r, $this->getFrontClassname ( $classname ), $pages );
116
		}
117
		return $this->format ( $r );
118
	}
119
}
120
121