Passed
Push — master ( 5bd0b7...fe2b7e )
by Jean-Christophe
10:05 queued 48s
created

JsonApiResponseFormatter::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 2
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
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 6
	public function __construct($baseRoute = "") {
25 6
		$this->baseRoute = $baseRoute;
26 6
	}
27
28
	/**
29
	 *
30
	 * {@inheritdoc}
31
	 * @see \Ubiquity\controllers\rest\ResponseFormatter::cleanRestObject()
32
	 */
33 5
	public function cleanRestObject($o, &$classname = null) {
34 5
		$pk = OrmUtils::getFirstKeyValue ( $o );
35 5
		$classname = get_class ( $o );
36 5
		$frontClassname = $this->getFrontClassname ( $classname );
37 5
		$r = [ 'id' => $pk,'type' => $frontClassname ];
38 5
		$r ['attributes'] = $o->_rest;
39 5
		$fieldsInRelations = OrmUtils::getRelationInfos ( $classname );
40
41 5
		$this->addSelfLink ( $r, $pk, $frontClassname );
42 5
		$o = $o->_rest;
43 5
		foreach ( $o as $k => $v ) {
44 5
			if (isset ( $fieldsInRelations [$k] )) {
45 5
				$member = $fieldsInRelations [$k] ['member'] ?? $k;
46 5
				if (isset ( $v->_rest )) {
47 4
					$r ['included'] [$k] = $this->cleanRestObject ( $v );
48 5
				} elseif (\is_array ( $v )) {
49 5
					foreach ( $v as $index => $value ) {
50 5
						if (isset ( $value->_rest ))
51 5
							$v [$index] = $this->cleanRestObject ( $value );
52
					}
53 5
					$r ['included'] [$k] = $v;
54
				} else {
55 5
					if (isset ( $v )) {
56 5
						$rFrontClassname = $this->getFrontClassname ( $fieldsInRelations [$k] ['className'] );
57 5
						$r ['relationships'] [$member] ['data'] = [ 'id' => $v,'type' => $rFrontClassname ];
58 5
						$this->addRelationshipsLink ( $r, $pk, $v, $frontClassname, $rFrontClassname, $member );
59
					}
60
				}
61
62 5
				unset ( $r ['attributes'] [$member] );
63 5
				unset ( $r ['attributes'] [$k] );
64
			}
65
		}
66 5
		unset ( $r ['attributes'] ['id'] );
67 5
		unset ( $r ['attributes'] ['_rest'] );
68 5
		return $r;
69
	}
70
71 5
	protected function addSelfLink(&$r, $pk, $frontClassname) {
72 5
		$r ['links'] ['self'] = $this->getLink ( $this->selfLink, [ "baseRoute" => $this->baseRoute,'id' => $pk,'classname' => $frontClassname ] );
73 5
	}
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 5
	protected function addRelationshipsLink(&$r, $pk, $pkMember, $frontClassname, $rFrontClassname, $member) {
91 5
		$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 5
	}
93
94 5
	private function getLink($pattern, $params = []) {
95 5
		$r = $pattern;
96 5
		foreach ( $params as $k => $v ) {
97 5
			$r = str_replace ( '%' . $k . '%', $v, $r );
98
		}
99 5
		return $r;
100
	}
101
102 5
	private function getFrontClassname($classname) {
103 5
		return lcfirst ( ClassUtils::getClassSimpleName ( $classname ) );
104
	}
105
106
	/**
107
	 *
108
	 * {@inheritdoc}
109
	 * @see \Ubiquity\controllers\rest\ResponseFormatter::get()
110
	 */
111 3
	public function get($objects, $pages = null) {
112 3
		$objects = $this->getDatas ( $objects, $classname );
113 3
		$r = [ 'data' => $objects ];
114 3
		if (isset ( $pages ) && sizeof ( $objects ) > 0) {
115
			$this->addPageLinks ( $r, $this->getFrontClassname ( $classname ), $pages );
116
		}
117 3
		return $this->format ( $r );
118
	}
119
}
120
121