Passed
Push — main ( 1c458a...5a987a )
by Thierry
10:56 queued 05:26
created

PoolSessionsValidator::validateDates()   B

Complexity

Conditions 6
Paths 12

Size

Total Lines 36
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 6
eloc 20
c 2
b 0
f 0
nc 12
nop 2
dl 0
loc 36
rs 8.9777
1
<?php
2
3
namespace Siak\Tontine\Validation\Planning;
4
5
use Illuminate\Support\Facades\Validator;
6
use Illuminate\Validation\Validator as RealValidator;
7
use Siak\Tontine\Service\Planning\PoolService;
8
use Siak\Tontine\Validation\AbstractValidator;
9
use Siak\Tontine\Validation\ValidationException;
10
11
use function Jaxon\jaxon;
12
13
class PoolSessionsValidator extends AbstractValidator
14
{
15
    /**
16
     * @param PoolService $poolService
17
     */
18
    public function __construct(private PoolService $poolService)
19
    {}
20
21
    /**
22
     * @param RealValidator $validator
23
     * @param array $errors
24
     *
25
     * @return void
26
     */
27
    private function validateDates(RealValidator $validator, array $errors): void
28
    {
29
        $stash = jaxon()->di()->getStash();
30
        $guild = $stash->get('tenant.guild');
31
        $pool = $stash->get('planning.pool');
32
33
        $sessions = [
34
            'start_sid' => $pool->start,
35
            'end_sid' => $pool->end,
36
        ];
37
38
        $values = $validator->validated();
39
        $allSessionsFound = true;
40
        foreach($errors as $key => $message)
41
        {
42
            if(!isset($values[$key]))
43
            {
44
                continue;
45
            }
46
            $sessions[$key] = $this->poolService
47
                ->getGuildSession($guild, (int)$values[$key]);
48
            if(!$sessions[$key])
49
            {
50
                $allSessionsFound = false;
51
                $validator->errors()->add($key, $message);
52
            }
53
        }
54
        if(!$allSessionsFound)
55
        {
56
            return;
57
        }
58
59
        // Verify that the start session comes before the end session.
60
        if($sessions['end_sid']->day_date <= $sessions['start_sid']->day_date)
61
        {
62
            $validator->errors()->add('end_sid', trans('tontine.session.errors.dates.end'));
63
        }
64
    }
65
66
    /**
67
     * @param array $values
68
     *
69
     * @return array
70
     */
71
    public function validateItem(array $values): array
72
    {
73
        $rules = [
74
            'start_sid' => 'required_without:end_sid|integer|min:1',
75
            'end_sid' => 'required_without:start_sid|integer|min:1',
76
        ];
77
        $errors = [
78
            'start_sid' => trans('tontine.session.errors.start'),
79
            'end_sid' => trans('tontine.session.errors.end'),
80
        ];
81
        $validator = Validator::make($this->values($values), $rules, $errors);
82
        $validator->after(function($validator) use($errors) {
83
            // No more check if there's already an error.
84
            if($validator->errors()->count() === 0)
85
            {
86
                $this->validateDates($validator, $errors);
87
            }
88
        });
89
90
        if($validator->fails())
91
        {
92
            throw new ValidationException($validator);
93
        }
94
95
        return array_map(fn($sid) => (int)$sid, $validator->validated());
96
    }
97
}
98