1+ <?php
2+
3+ namespace Lomkit \Rest \Rules ;
4+
5+ use Closure ;
6+ use Illuminate \Contracts \Validation \DataAwareRule ;
7+ use Illuminate \Contracts \Validation \Rule ;
8+ use Illuminate \Contracts \Validation \ValidatorAwareRule ;
9+ use Illuminate \Support \Arr ;
10+ use Illuminate \Support \Facades \Validator ;
11+ use Lomkit \Rest \Concerns \Makeable ;
12+ use Lomkit \Rest \Http \Requests \RestRequest ;
13+ use Lomkit \Rest \Http \Requests \SearchRequest ;
14+ use Lomkit \Rest \Http \Resource ;
15+
16+ class AggregateField implements Rule, DataAwareRule, ValidatorAwareRule
17+ {
18+
19+ use Makeable;
20+
21+ /**
22+ * The data under validation.
23+ *
24+ * @var array
25+ */
26+ protected $ data ;
27+
28+ /**
29+ * The error message after validation, if any.
30+ *
31+ * @var array
32+ */
33+ protected $ messages = [];
34+
35+ /**
36+ * The resource related to.
37+ *
38+ * @var Resource
39+ */
40+ protected $ resource = null ;
41+
42+ /**
43+ * The validator performing the validation.
44+ *
45+ * @var \Illuminate\Validation\Validator
46+ */
47+ protected $ validator ;
48+
49+ /**
50+ *
51+ *
52+ * @param $resource
53+ * @return $this
54+ */
55+ public function resource ($ resource )
56+ {
57+ $ this ->resource = $ resource ;
58+
59+ return $ this ;
60+ }
61+
62+ public function passes ($ attribute , $ value )
63+ {
64+ $ validator = Validator::make (
65+ $ this ->data ,
66+ $ this ->buildValidationRules ($ attribute , $ value )
67+ );
68+
69+ if ($ validator ->fails ()) {
70+ return $ this ->fail ($ validator ->messages ()->all ());
71+ }
72+
73+ return true ;
74+ }
75+
76+ /**
77+ * Build the array of underlying validation rules based on the current state.
78+ *
79+ * @return array
80+ */
81+ protected function buildValidationRules ($ attribute , $ value )
82+ {
83+ $ relationResource = $ this ->resource ->relationResource ($ value ['relation ' ]);
84+
85+ if (is_null ($ relationResource )) {
86+ return [];
87+ }
88+
89+ return [
90+ $ attribute .'.field ' => \Illuminate \Validation \Rule::in (
91+ $ relationResource ->exposedFields (app ()->make (RestRequest::class))
92+ )
93+ ];
94+ }
95+
96+ /**
97+ * Get the validation error message.
98+ *
99+ * @return array
100+ */
101+ public function message ()
102+ {
103+ return $ this ->messages ;
104+ }
105+
106+ /**
107+ * Adds the given failures, and return false.
108+ *
109+ * @param array|string $messages
110+ * @return bool
111+ */
112+ protected function fail ($ messages )
113+ {
114+ $ messages = collect (Arr::wrap ($ messages ))->map (function ($ message ) {
115+ return $ this ->validator ->getTranslator ()->get ($ message );
116+ })->all ();
117+
118+ $ this ->messages = array_merge ($ this ->messages , $ messages );
119+
120+ return false ;
121+ }
122+
123+ /**
124+ * Set the current validator.
125+ *
126+ * @param \Illuminate\Contracts\Validation\Validator $validator
127+ * @return $this
128+ */
129+ public function setValidator ($ validator )
130+ {
131+ $ this ->validator = $ validator ;
132+
133+ return $ this ;
134+ }
135+
136+ /**
137+ * Set the current data under validation.
138+ *
139+ * @param array $data
140+ * @return $this
141+ */
142+ public function setData ($ data )
143+ {
144+ $ this ->data = $ data ;
145+
146+ return $ this ;
147+ }
148+ }
0 commit comments