ValidateAttributesObject   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 14
dl 0
loc 72
ccs 18
cts 18
cp 1
rs 10
c 1
b 0
f 0
wmc 8

3 Methods

Rating   Name   Duplication   Size   Complexity  
A isNotForbiddenMemberName() 0 6 2
A validateAttributesObject() 0 8 2
A fieldHasNoForbiddenMemberName() 0 13 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace VGirol\JsonApiStructure\Concern;
6
7
use VGirol\JsonApiStructure\Messages;
8
9
/**
10
 * Assertions relating to the attributes object
11
 */
12
trait ValidateAttributesObject
13
{
14
    /**
15
     * Asserts that a json fragment is a valid attributes object.
16
     *
17
     * It will do the following checks :
18
     * 1) asserts that attributes object is not an array of objects (@see mustNotBeArrayOfObjects).
19
     * 2) asserts that attributes object has no member with forbidden name (@see fieldHasNoForbiddenMemberName).
20
     * 3) asserts that each member name of the attributes object is valid (@see validateMemberName).
21
     *
22
     * @param array   $json
23
     * @param boolean $strict If true, unsafe characters are not allowed when checking members name.
24
     *
25
     * @return void
26
     * @throws \VGirol\JsonApiStructure\Exception\ValidationException
27
     */
28 81
    public function validateAttributesObject($json, bool $strict): void
29
    {
30 81
        $this->mustNotBeArrayOfObjects($json, Messages::ATTRIBUTES_OBJECT_MUST_BE_ARRAY, 403);
0 ignored issues
show
Bug introduced by
It seems like mustNotBeArrayOfObjects() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

30
        $this->/** @scrutinizer ignore-call */ 
31
               mustNotBeArrayOfObjects($json, Messages::ATTRIBUTES_OBJECT_MUST_BE_ARRAY, 403);
Loading history...
31
32 75
        $this->fieldHasNoForbiddenMemberName($json);
33
34 72
        foreach (\array_keys($json) as $key) {
35 72
            $this->validateMemberName($key, $strict);
0 ignored issues
show
Bug introduced by
It seems like validateMemberName() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

35
            $this->/** @scrutinizer ignore-call */ 
36
                   validateMemberName($key, $strict);
Loading history...
36
        }
37 63
    }
38
39
    /**
40
     * Asserts that a field object has no forbidden member name.
41
     *
42
     * Asserts that a field object (i.e., a resource object’s attributes or one of its relationships)
43
     * has no forbidden member name.
44
     *
45
     * It will do the following checks :
46
     * 1) asserts that each member name of the field is not a forbidden name (@see isNotForbiddenMemberName).
47
     * 2) if the field has nested objects, it will checks each all.
48
     *
49
     * @param mixed $field
50
     *
51
     * @return void
52
     * @throws \VGirol\JsonApiStructure\Exception\ValidationException
53
     */
54 84
    public function fieldHasNoForbiddenMemberName($field): void
55
    {
56 84
        if (!\is_array($field)) {
57 84
            return;
58
        }
59
60 84
        foreach ($field as $key => $value) {
61
            // For objects, $key is a string
62
            // For arrays of objects, $key is an integer
63 84
            if (\is_string($key)) {
64 84
                $this->isNotForbiddenMemberName($key);
65
            }
66 84
            $this->fieldHasNoForbiddenMemberName($value);
67
        }
68 75
    }
69
70
    /**
71
     * Asserts that a member name is not forbidden (like "relationships" or "links").
72
     *
73
     * @param string $name
74
     *
75
     * @return void
76
     * @throws \VGirol\JsonApiStructure\Exception\ValidationException
77
     */
78 96
    public function isNotForbiddenMemberName($name): void
79
    {
80 96
        $this->isValidArgument(1, 'string', $name);
0 ignored issues
show
Bug introduced by
It seems like isValidArgument() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

80
        $this->/** @scrutinizer ignore-call */ 
81
               isValidArgument(1, 'string', $name);
Loading history...
81
82 93
        if (\in_array($name, $this->getRule('MemberName.Forbidden'))) {
0 ignored issues
show
Bug introduced by
It seems like getRule() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

82
        if (\in_array($name, $this->/** @scrutinizer ignore-call */ getRule('MemberName.Forbidden'))) {
Loading history...
83 15
            $this->throw(Messages::MEMBER_NAME_NOT_ALLOWED, 403);
0 ignored issues
show
Bug introduced by
It seems like throw() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

83
            $this->/** @scrutinizer ignore-call */ 
84
                   throw(Messages::MEMBER_NAME_NOT_ALLOWED, 403);
Loading history...
84
        }
85 87
    }
86
}
87