ChannelEventCollection::getChannelAuthCallback()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
ccs 0
cts 2
cp 0
rs 10
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
namespace MallardDuck\DynamicEcho\Collections;
4
5
use Closure;
6
use Illuminate\Support\Collection;
7
use MallardDuck\DynamicEcho\Channels\AbstractChannelParameters;
8
use MallardDuck\DynamicEcho\Loader\LoadedEventDTO;
9
10
/**
11
 * @example This is an example shape of how this collection should store data.
12
 *
13
 * {
14
 *     channelIdentifier: "App.Models.User.{userId}",
15
 *     channelAuthCallback: someCallbackMethod,
16
 *     items: [
17
 *         "ToastEvent" => MallardDuck\DynamicEcho\Loader\LoadedEventDTO
18
 *     ]
19
 * }
20
 */
21
class ChannelEventCollection extends Collection
22
{
23
    /**
24
     * The items contained in the collection.
25
     *
26
     * @var LoadedEventDTO[]
27
     */
28
    protected $items = [];
29
30
    /**
31
     * The channel route identifier/formula.
32
     *
33
     * @var string
34
     * @example "App.Models.User.{userId}"
35
     */
36
    private string $channelAuthName;
37
38
    /**
39
     * An md5 of the $channelAuthName - used for setting JS context vars.
40
     * @var string|null
41
     */
42
    private $channelJsVarKey;
43
44
    private string $channelJsIdentifier;
45
46
    private AbstractChannelParameters $channelParameters;
47
48
    public static function new(
49
        string $channelIdentifier,
50
        AbstractChannelParameters $channelParameters
51
    ): self {
52
        $collection = new self();
53
        $collection
54
            ->setChannelIdentifier($channelIdentifier)
55
            ->setChannelParameters($channelParameters);
56
57
        return $collection;
58
    }
59
60
    /**
61
     * @param string $channelIdentifier
62
     *
63
     * @return $this
64
     */
65
    private function setChannelIdentifier(string $channelIdentifier): self
66
    {
67
        $this->channelAuthName = $channelIdentifier;
68
        $this->channelJsVarKey = md5($channelIdentifier);
69
        return $this;
70
    }
71
72
    /**
73
     * @param AbstractChannelParameters $channelParameters
74
     *
75
     * @return $this
76
     */
77
    private function setChannelParameters(AbstractChannelParameters $channelParameters): self
78
    {
79
        $this->channelParameters = $channelParameters;
80
81
        return $this;
82
    }
83
84
    /**
85
     * Get the channel identifier for this ChannelEventCollection.
86
     *
87
     * @return string
88
     */
89
    public function getChannelAuthName(): string
90
    {
91
        return $this->channelAuthName;
92
    }
93
94
    public function getChannelJsVarKey(): string
95
    {
96
        return $this->channelJsVarKey;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->channelJsVarKey could return the type null which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
97
    }
98
99
    /**
100
     * Get the channels authentication callback to verify user access.
101
     *
102
     * @return callable
103
     */
104
    public function getChannelAuthCallback(): callable
105
    {
106
        return $this->channelParameters->channelAuthCallback;
107
    }
108
109
    /**
110
     * Get the channels authentication callback to verify user access.
111
     *
112
     * @return null|array
113
     */
114
    public function getChannelAuthOptions(): ?array
115
    {
116
        if (0 !== count($this->channelParameters->channelAuthOptions)) {
117
            return $this->channelParameters->channelAuthOptions;
118
        }
119
        return null;
120
    }
121
122
    /**
123
     * @return callable|Closure|string
124
     */
125
    public function getChannelContextBindingCallback()
126
    {
127
        return $this->channelParameters->channelContextBindingCallback;
128
    }
129
130
    /**
131
     * Get the string that identifies the echo channel in Javascript.
132
     *
133
     * This will return a JS "Template literal" string.
134
     * It should allow for the specific user's channel's to be dynamically resolved.
135
     *
136
     * @return string
137
     * @example '`App.Models.User.${window.dynamicEchoOld.userID}`'
138
     */
139
    public function getChannelJsIdentifier(): string
140
    {
141
        return $this->channelParameters->channelJsIdentifier;
142
    }
143
}
144