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