Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
UndoHandler
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
3 / 3
7
100.00% covered (success)
100.00%
1 / 1
 validateContentIds
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
4
 getDiffFromContents
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 tryPatching
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare( strict_types = 1 );
4
5namespace EntitySchema\MediaWiki;
6
7use Diff\DiffOp\Diff\Diff;
8use Diff\Patcher\PatcherException;
9use DomainException;
10use EntitySchema\Domain\Model\EntitySchemaId;
11use EntitySchema\MediaWiki\Content\EntitySchemaContent;
12use EntitySchema\Services\Converter\EntitySchemaConverter;
13use EntitySchema\Services\Diff\EntitySchemaDiffer;
14use EntitySchema\Services\Diff\EntitySchemaPatcher;
15use MediaWiki\Status\Status;
16
17/**
18 * @license GPL-2.0-or-later
19 */
20final class UndoHandler {
21
22    /**
23     * @throws DomainException
24     */
25    public function validateContentIds(
26        EntitySchemaContent $undoFromContent,
27        EntitySchemaContent $undoToContent,
28        EntitySchemaContent $baseContent = null
29    ): EntitySchemaId {
30        $converter = new EntitySchemaConverter();
31        $firstID = $converter->getSchemaID( $undoFromContent->getText() );
32        if ( $firstID !== $converter->getSchemaID( $undoToContent->getText() ) ) {
33            throw new DomainException( 'ID must be the same for all contents' );
34        }
35
36        if ( $baseContent !== null &&
37            $firstID !== $converter->getSchemaID( $baseContent->getText() )
38        ) {
39            throw new DomainException( 'ID must be the same for all contents' );
40        }
41
42        return new EntitySchemaId( $firstID );
43    }
44
45    public function getDiffFromContents(
46        EntitySchemaContent $undoFromContent,
47        EntitySchemaContent $undoToContent
48    ): Status {
49
50        $differ = new EntitySchemaDiffer();
51        $converter = new EntitySchemaConverter();
52        $diff = $differ->diffSchemas(
53            $converter->getFullArraySchemaData( $undoFromContent->getText() ),
54            $converter->getFullArraySchemaData( $undoToContent->getText() )
55        );
56
57        return Status::newGood( $diff );
58    }
59
60    public function tryPatching( Diff $diff, EntitySchemaContent $baseContent ): Status {
61
62        $patcher = new EntitySchemaPatcher();
63        $converter = new EntitySchemaConverter();
64
65        try {
66            $patchedSchema = $patcher->patchSchema(
67                $converter->getFullArraySchemaData( $baseContent->getText() ),
68                $diff
69            );
70        } catch ( PatcherException $e ) {
71            // show error here
72            return Status::newFatal( 'entityschema-undo-cannot-apply-patch' );
73        }
74
75        return Status::newGood( $patchedSchema );
76    }
77
78}