Completed
Push — master ( 9c72bc...5cbbf2 )
by Francis
01:53
created

RefactorCI::inflate_value()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 3
nc 2
nop 2
dl 0
loc 5
rs 10
c 1
b 0
f 0
1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
4
class RefactorCI
5
{
6
7
  /**
8
   * [private description]
9
   * @var [type]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
10
   */
11
  private $ci;
12
  /**
13
   * [private description]
14
   * @var [type]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
15
   */
16
  private $primaryKey;
17
18
  function __construct($params=null)
19
  {
20
    $this->ci =& get_instance();
0 ignored issues
show
Bug introduced by
The function get_instance was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

20
    $this->ci =& /** @scrutinizer ignore-call */ get_instance();
Loading history...
21
    $this->ci->load->config("refactor", false, true);
22
    $this->ci->load->splint('francis94c/jsonp', '+JSONP', null, 'jsonp');
23
    require_once('RefactorPayload.php');
24
    $this->init($params == null ? [] : $params);
25
  }
26
  /**
27
   * [init description]
28
   * @date  2019-11-02
29
   * @param array      $params [description]
30
   */
31
  public function init(array $params):void
32
  {
33
    $this->primaryKey = $params['primary_key'] ?? 'id';
34
  }
35
  /**
36
   * [load description]
37
   * @date   2019-11-02
38
   * @return RefactorCI [description]
39
   */
40
  public function load($class):RefactorCI
41
  {
42
    include APPPATH.'libraries/refactor/'.$class.'.php';
0 ignored issues
show
Bug introduced by
The constant APPPATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
43
    return $this;
44
  }
45
  /**
46
   * [payload description]
47
   * @date   2019-11-02
48
   * @param  string     $class  [description]
49
   * @param  [type]     $object [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
50
   * @return [type]             [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
51
   */
52
  public function payload(string $class, $object)
53
  {
54
    return (new $class($object))->toArray();
55
  }
56
  /**
57
   * [array description]
58
   * @date   2019-11-02
59
   * @param  string     $class [description]
60
   * @param  array      $array [description]
61
   * @return array             [description]
62
   */
63
  public function array(string $class, array $array):array
64
  {
65
    $refactor = new $class();
66
    $buff;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $buff seems to be never defined.
Loading history...
67
    for ($x = 0; $x < count($array); $x++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
68
      $refactor->switchPayload($array[$x]);
69
      $buff = $refactor->toArray();
70
      if ($buff != null) $array[$x] = $buff;
71
    }
72
    return $array;
73
  }
74
  /**
75
   * [run description]
76
   * @param array|string  $object   [description]
77
   * @param string        $ruleName [description]
78
   */
79
  function run(array &$object, $ruleName):void
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
80
  {
81
    if ($object == null) return;
82
    // Reolve Rules.
83
    if (is_scalar($ruleName)) {
0 ignored issues
show
introduced by
The condition is_scalar($ruleName) is always true.
Loading history...
84
      $rule = $this->ci->config->item("refactor_$ruleName");
85
    } else {
86
      // Rule was probablt passed in as an array (associative) and we support
87
      // that.
88
      $rule = is_array($ruleName) ? $ruleName : null;
89
    }
90
91
    if ($rule == null) return; // No need to go further as rule doesn't exist.
92
    // Keep
93
    if (isset($rule['keep'])) {
94
      $keys = array_keys($object);
95
      for ($x = 0; $x < count($object); $x++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
96
        if (!in_array($keys[$X], $rule['keep'])) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $X seems to be never defined.
Loading history...
97
          unset($object[$keys[$x]]);
98
        }
99
      }
100
    }
101
    // Unset
102
    if (isset($rule['unset'])) {
103
      $this->unset_values($object, $rule);
104
    }
105
    // Replace
106
    if (isset($rule['replace'])) {
107
      $this->replace_fields($object, $rule);
108
    }
109
    // Bools
110
    if (isset($rule['bools'])) {
111
      foreach($rule['bools'] as $boolKey) {
112
        $object[$boolKey] = $object[$boolKey] == 1 || $object[$boolKey] == 'true';
113
      }
114
    }
115
    // Cast
116
    if (isset($rule['cast']))  {
117
      $this->cast_fields($object, $rule);
118
    }
119
    // Inflate
120
    if (isset($rule['inflate'])) {
121
      foreach($rule['inflate'] as $field => $data) {
122
        $ids = json_decode($object[$field], true);
123
        if (is_scalar($ids)) {
124
          // JSON Array wasn't supplied. Let's treat it as a scaler ID.
125
          $this->ci->db->where($this->primaryKey, $ids);
126
          $query = $this->ci->db->get($data['table']);
127
          if ($query->num_rows() == 0) {
128
            $object[$field] = json_encode (json_decode ("{}"));
129
            continue;
130
          }
131
          $object[$field] = $query->result_array()[0];
132
          if (isset($data['refactor'])) $this->run($object[$field], $data['refactor']);
133
          continue;
134
        }
135
        if (isset($data['path'])) {
136
          if ($ids == null) return;
137
          $object[$field] = $ids;
138
          $this->ci->jsonp->parse($object[$field]);
139
          if (is_array($object[$field])) {
140
            $refs = $this->ci->jsonp->get_reference($data['path']);
141
            for ($x = 0; $x < count($refs); $x++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
142
              $refs[$x] = $this->inflate_value($data['table'], $refs[$x]);
143
              // Recursion
144
              if (isset($data['refactor'])) $this->run($refs[$x], $data['refactor']);
145
            }
146
          } else {
147
            $this->ci->jsonp->set($data['path'], $this->inflate_value($data['table'], $ids));
148
            // Recursion
149
            if (isset($data['refactor'])) $this->run($this->ci->jsonp->get_reference($data['path']), $data['refactor']);
0 ignored issues
show
Bug introduced by
$this->ci->jsonp->get_reference($data['path']) cannot be passed to RefactorCI::run() as the parameter $object expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

149
            if (isset($data['refactor'])) $this->run(/** @scrutinizer ignore-type */ $this->ci->jsonp->get_reference($data['path']), $data['refactor']);
Loading history...
150
          }
151
          return;
152
        }
153
        $object[$field] = [];
154
        if ($ids == null) return;
155
        foreach($ids as $id) {
156
          $this->ci->db->where($this->primaryKey, $id);
157
          $query = $this->ci->db->get($data['table']);
158
          if ($query->num_rows() == 0) {
159
            continue;
160
          }
161
          $object[$field][] = $query->result_array()[0];
162
          // Recursion
163
          if (isset($data['refactor'])) $this->run($object[$field][count($object[$field]) - 1], $data['refactor']);
164
        }
165
      }
166
    }
167
  }
168
  private function inflate_value(string $table, $value)
169
  {
170
    $this->ci->db->where($this->primaryKey, $value);
171
    $query = $this->ci->db->get($table);
172
    return $query->num_rows() > 0 ? $query->result_array()[0] : null;
173
  }
174
  /**
175
   * [unset_values description]
176
   * @param array  $object Object to Refactor.
177
   * @param array  $rule   Rule data, containing keys to unset in  the given
178
   *                       associative array.
179
   */
180
  private function unset_values(array &$object, &$rule):void {
181
    foreach($rule['unset'] as $key) {
182
      unset($object[$key]);
183
    }
184
  }
185
  /**
186
   * [replace_fields description]
187
   * @param array  $object [description]
188
   * @param [type] $rule   [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
189
   */
190
  private function replace_fields(array &$object, &$rule):void
191
  {
192
    foreach ($rule['replace'] as $oldKey => $newKey) {
193
      $object[$newKey] = $object[$oldKey];
194
      unset($object[$oldKey]);
195
    }
196
  }
197
  /**
198
   * [cast_fields description]
199
   * @param array  $object [description]
200
   * @param [type] $rule   [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
201
   */
202
  private function cast_fields(array &$object, &$rule):void
203
  {
204
    foreach ($rule['cast'] as $key => $type) {
205
      switch ($type) {
206
        case 'int':
207
          $object[$key] = (int) $object[$key];
208
          break;
209
        case 'string':
210
          $object[$key] = (string) $object[$key];
211
          break;
212
      }
213
    }
214
  }
215
}
216
?>
0 ignored issues
show
Best Practice introduced by
It is not recommended to use PHP's closing tag ?> in files other than templates.

Using a closing tag in PHP files that only contain PHP code is not recommended as you might accidentally add whitespace after the closing tag which would then be output by PHP. This can cause severe problems, for example headers cannot be sent anymore.

A simple precaution is to leave off the closing tag as it is not required, and it also has no negative effects whatsoever.

Loading history...
217