Skip to content

Commit

Permalink
NEW Adding GraphQL operation scaffolder for rollbackRecursive on vers…
Browse files Browse the repository at this point in the history
…ioned objects
  • Loading branch information
ScopeyNZ committed Nov 14, 2018
1 parent addbb89 commit d2aed1e
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 2 deletions.
3 changes: 2 additions & 1 deletion _config/graphql.yml
Expand Up @@ -22,6 +22,7 @@ SilverStripe\GraphQL\Scaffolding\Scaffolders\OperationScaffolder:
copyToStage: SilverStripe\Versioned\GraphQL\Operations\CopyToStage
publish: SilverStripe\Versioned\GraphQL\Operations\Publish
unpublish: SilverStripe\Versioned\GraphQL\Operations\Unpublish
rollback: SilverStripe\Versioned\GraphQL\Operations\Rollback
SilverStripe\GraphQL\Manager:
extensions:
- SilverStripe\Versioned\GraphQL\Extensions\ManagerExtension
- SilverStripe\Versioned\GraphQL\Extensions\ManagerExtension
6 changes: 5 additions & 1 deletion src/GraphQL/Operations/CopyToStage.php
Expand Up @@ -16,7 +16,11 @@
}

/**
* A generic "create" operation for a DataObject.
* Scaffolds a "copy to stage" operation for DataObjects.
*
* copy[TypeName]ToStage(ID!, FromVersion!, FromStage!, ToStage!)
*
* @internal This is a low level API that might be removed in the future. Consider using the "rollback" mutation instead
*/
class CopyToStage extends MutationScaffolder implements OperationResolver
{
Expand Down
99 changes: 99 additions & 0 deletions src/GraphQL/Operations/Rollback.php
@@ -0,0 +1,99 @@
<?php

namespace SilverStripe\Versioned\GraphQL\Operations;

use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use InvalidArgumentException;
use SilverStripe\GraphQL\Manager;
use SilverStripe\GraphQL\OperationResolver;
use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder;
use SilverStripe\ORM\DataObject;
use SilverStripe\Versioned\Versioned;

if (!class_exists(MutationScaffolder::class)) {
return;
}

/**
* Scaffolds a "rollback recursive" operation for DataObjects.
*
* rollback[TypeName](ID!, ToVersion!)
*/
class Rollback extends MutationScaffolder implements OperationResolver
{
/**
* CreateOperationScaffolder constructor.
*
* @param string $dataObjectClass
*/
public function __construct($dataObjectClass)
{
parent::__construct(null, null, $this, $dataObjectClass);
}

/**
* @return string
*/
public function getName()
{
$name = parent::getName();
if ($name) {
return $name;
}

$typeName = $this->getTypeName();

return 'rollback' . ucfirst($typeName);
}

/**
* @param Manager $manager
* @return array
*/
public function createDefaultArgs(Manager $manager)
{
return [
'ID' => [
'type' => Type::nonNull(Type::id()),
'description' => 'The object ID that needs to be rolled back'
],
'ToVersion' => [
'type' => Type::nonNull(Type::int()),
'description' => 'The version of the object that should be rolled back to'
],
];
}

/**
* Invoked by the Executor class to resolve this mutation / query
* @see Executor
*
* @param mixed $object
* @param array $args
* @param mixed $context
* @param ResolveInfo $info
* @return mixed
*/
public function resolve($object, array $args, $context, ResolveInfo $info)
{
// Get the args
$id = $args['ID'];
$rollbackVersion = $args['ToVersion'];

// Pull the latest version of the record
/** @var Versioned|DataObject $record */
$record = Versioned::get_latest_version($this->getDataObjectClass(), $id);

// Assert permission
$user = $context['currentUser'];
if (!$record->canEdit($user)) {
throw new InvalidArgumentException('Current user does not have permission to roll back this resource');
}

// Perform the rollback
$record = $record->rollbackRecursive($rollbackVersion);

return $record;
}
}

0 comments on commit d2aed1e

Please sign in to comment.