Passed
Push — master ( a1de92...1a465b )
by Robbie
03:52
created

src/GraphQL/AddElementToAreaMutation.php (1 issue)

Severity
1
<?php
2
3
namespace DNADesign\Elemental\GraphQL;
4
5
use DNADesign\Elemental\Models\BaseElement;
6
use DNADesign\Elemental\Models\ElementalArea;
7
use DNADesign\Elemental\Services\ReorderElements;
8
use GraphQL\Type\Definition\ResolveInfo;
9
use GraphQL\Type\Definition\Type;
10
use InvalidArgumentException;
11
use SilverStripe\Core\Injector\Injector;
12
use SilverStripe\GraphQL\MutationCreator;
13
use SilverStripe\GraphQL\OperationResolver;
14
use SilverStripe\GraphQL\Scaffolding\StaticSchema;
15
16
class AddElementToAreaMutation extends MutationCreator implements OperationResolver
17
{
18
    public function attributes()
19
    {
20
        return [
21
            'name' => 'addElementToArea',
22
            'description' => 'Adds an Element to an ElementalArea, optionally after another Element'
23
        ];
24
    }
25
26
    public function type()
27
    {
28
        return $this->manager->getType(StaticSchema::inst()->typeNameForDataObject(BaseElement::class));
29
    }
30
31
    public function args()
32
    {
33
        return [
34
            'ClassName' => ['type' => Type::nonNull(Type::string())],
35
            'ElementalAreaID' => ['type' => Type::nonNull(Type::id())],
36
            'AfterElementID' => ['type' => Type::id()],
37
        ];
38
    }
39
40
    public function resolve($object, array $args, $context, ResolveInfo $info)
41
    {
42
        $elementClass = $args['ClassName'];
43
        $elementalAreaID = $args['ElementalAreaID'];
44
        $afterElementID = isset($args['AfterElementID']) ? $args['AfterElementID'] : null;
45
46
        if (!is_subclass_of($elementClass, BaseElement::class)) {
47
            throw new InvalidArgumentException("$elementClass is not a subclass of " . BaseElement::class);
48
        }
49
50
        $elementalArea = ElementalArea::get()->byID($elementalAreaID);
51
52
        if (!$elementalArea) {
0 ignored issues
show
$elementalArea is of type SilverStripe\ORM\DataObject, thus it always evaluated to true.
Loading history...
53
            throw new InvalidArgumentException("Invalid ElementalAreaID: $elementalAreaID");
54
        }
55
56
        if (!$elementalArea->canEdit($context['currentUser'])) {
57
            throw new InvalidArgumentException("The current user has insufficient permission to edit ElementalAreas");
58
        }
59
60
        $newElement = Injector::inst()->create($elementClass);
61
62
        if (!$newElement->canEdit($context['currentUser'])) {
63
            throw new InvalidArgumentException(
64
                'The current user has insufficient permission to edit Elements'
65
            );
66
        }
67
68
        $elementalArea->Elements()->add($newElement);
69
70
        if (!is_null($afterElementID)) {
71
            $reorderer = Injector::inst()->create(ReorderElements::class, $newElement);
72
            $reorderer->reorder($afterElementID);
73
        }
74
75
        return $newElement;
76
    }
77
}
78