Completed
Push — master ( 0e5f68...33b81c )
by Richard
01:13
created

SuccessResponse::determineKeys()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
namespace RichToms\LaravelJsend\Responses;
4
5
use Illuminate\Support\Arr;
6
use Illuminate\Support\Str;
7
8
class SuccessResponse extends Response
9
{
10
    /**
11
     * @var string
12
     */
13
    protected $statusText = 'success';
14
15
    /**
16
     * @return array
17
     */
18
    protected function getResponseData()
19
    {
20
        // If the data given is an associative array, assume the developer knows what they are sending
21
        if (is_array($this->data) && Arr::isAssoc($this->data)) {
22
            return $this->data;
23
        }
24
25
        // If the data given is a sequential array, attempt to determine the keys to group the response by
26
        if (is_array($this->data)) {
27
            return $this->mergeKeys(
28
                $this->determineKeys($this->data),
29
                $this->data
30
            );
31
        }
32
33
        if (!is_object($this->data)) {
34
            return ['object' => $this->data];
35
        }
36
37
        // If the class name contains Resource
38
        if (stristr($className = class_basename($this->data), "Resource") !== false) {
39
            return [
40
                Str::plural(
41
                    $this->toSlug(explode("Resource", $className)[0]),
42
                    stristr($className, "Collection") !== false ? 0 : 1
43
                ) => $this->data->toArray()
44
            ];
45
        }
46
47
        // If the data is not an object and is not a Laravel Resource, return the class name and the value
48
        return [
49
            $this->toSlug($className) => $this->data
50
        ];
51
    }
52
53
    /**
54
     * @param  array  $keys
55
     * @param  array  $values
56
     * @return array
57
     */
58
    protected function mergeKeys($keys = [], $values = [])
59
    {
60
        // Group the values that come out with the slug that matches the key
61
        return array_combine($keys, array_map(function ($arr) {
62
            return array_values($arr);
63
        }, array_map(function ($key) use ($values) {
64
            return Arr::where($values, function ($value) use ($key) {
65
                return $this->determineSlug($value) === $key;
66
            });
67
        }, $keys)));
68
    }
69
70
    /**
71
     * @param  array  $values
72
     * @return array
73
     */
74
    protected function determineKeys($values)
75
    {
76
        return array_unique(array_map(function ($value) {
77
            return $this->determineSlug($value);
78
        }, $values));
79
    }
80
81
    /**
82
     * @param  mixed  $value
83
     * @return string
84
     */
85
    protected function determineSlug($value)
86
    {
87
        return $this->toSlug(Str::plural((function ($value) {
88
            if (is_object($value)) {
89
                return get_class($value);
90
            }
91
92
            return $value['type'] ?? "object";
93
        })($value)));
94
    }
95
96
    protected function toSlug($string)
97
    {
98
        return Str::snake($string);
99
    }
100
}
101