1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Wikibase\Api\Service; |
4
|
|
|
|
5
|
|
|
use Mediawiki\DataModel\EditInfo; |
6
|
|
|
use UnexpectedValueException; |
7
|
|
|
use Wikibase\Api\WikibaseApi; |
8
|
|
|
use Wikibase\DataModel\Entity\EntityId; |
9
|
|
|
use Wikibase\DataModel\Entity\Item; |
10
|
|
|
use Wikibase\DataModel\Entity\Property; |
11
|
|
|
use Wikibase\DataModel\SiteLink; |
12
|
|
|
|
13
|
|
|
/** |
14
|
|
|
* @access private |
15
|
|
|
* |
16
|
|
|
* @author Addshore |
17
|
|
|
*/ |
18
|
|
View Code Duplication |
class SiteLinkSetter { |
|
|
|
|
19
|
|
|
|
20
|
|
|
/** |
21
|
|
|
* @var WikibaseApi |
22
|
|
|
*/ |
23
|
|
|
private $api; |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* @param WikibaseApi $api |
27
|
|
|
*/ |
28
|
|
|
public function __construct( WikibaseApi $api ) { |
29
|
|
|
$this->api = $api; |
30
|
|
|
} |
31
|
|
|
|
32
|
|
|
/** |
33
|
|
|
* @since 0.2 |
34
|
|
|
* |
35
|
|
|
* @param SiteLink $siteLink |
36
|
|
|
* @param EntityId|Item|Property|SiteLink $target |
37
|
|
|
* @param EditInfo|null $editInfo |
38
|
|
|
* |
39
|
|
|
* @return bool |
40
|
|
|
*/ |
41
|
|
|
public function set( SiteLink $siteLink, $target, EditInfo $editInfo = null ) { |
42
|
|
|
$this->throwExceptionsOnBadTarget( $target ); |
43
|
|
|
|
44
|
|
|
$params = $this->getTargetParamsFromTarget( |
45
|
|
|
$this->getEntityIdentifierFromTarget( $target ) |
|
|
|
|
46
|
|
|
); |
47
|
|
|
|
48
|
|
|
$params['linksite'] = $siteLink->getSiteId(); |
49
|
|
|
$params['linktitle'] = $siteLink->getPageName(); |
50
|
|
|
$params['badges'] = implode( '|', $siteLink->getBadges() ); |
51
|
|
|
|
52
|
|
|
$this->api->postRequest( 'wbsetsitelink', $params, $editInfo ); |
53
|
|
|
return true; |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* @param mixed $target |
58
|
|
|
* |
59
|
|
|
* @throws UnexpectedValueException |
60
|
|
|
* |
61
|
|
|
* @todo Fix duplicated code |
62
|
|
|
*/ |
63
|
|
|
private function throwExceptionsOnBadTarget( $target ) { |
64
|
|
|
if ( !$target instanceof EntityId && !$target instanceof Item && !$target instanceof Property && !$target instanceof SiteLink ) { |
65
|
|
|
throw new UnexpectedValueException( '$target needs to be an EntityId, Item, Property or SiteLink' ); |
66
|
|
|
} |
67
|
|
|
if ( ( $target instanceof Item || $target instanceof Property ) && $target->getId() === null ) { |
68
|
|
|
throw new UnexpectedValueException( '$target Entity object needs to have an Id set' ); |
69
|
|
|
} |
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
/** |
73
|
|
|
* @param EntityId|Item|Property $target |
74
|
|
|
* |
75
|
|
|
* @throws UnexpectedValueException |
76
|
|
|
* @return EntityId|SiteLink |
77
|
|
|
* |
78
|
|
|
* @todo Fix duplicated code |
79
|
|
|
*/ |
80
|
|
|
private function getEntityIdentifierFromTarget( $target ) { |
81
|
|
|
if ( $target instanceof Item || $target instanceof Property ) { |
82
|
|
|
return $target->getId(); |
83
|
|
|
} else { |
84
|
|
|
return $target; |
85
|
|
|
} |
86
|
|
|
} |
87
|
|
|
|
88
|
|
|
/** |
89
|
|
|
* @param EntityId|SiteLink $target |
90
|
|
|
* |
91
|
|
|
* @throws UnexpectedValueException |
92
|
|
|
* @return array |
93
|
|
|
* |
94
|
|
|
* @todo Fix duplicated code |
95
|
|
|
*/ |
96
|
|
|
private function getTargetParamsFromTarget( $target ) { |
97
|
|
|
if ( $target instanceof EntityId ) { |
98
|
|
|
return [ 'id' => $target->getSerialization() ]; |
99
|
|
|
} elseif ( $target instanceof SiteLink ) { |
100
|
|
|
return [ |
101
|
|
|
'site' => $target->getSiteId(), |
102
|
|
|
'title' => $target->getPageName(), |
103
|
|
|
]; |
104
|
|
|
} else { |
105
|
|
|
throw new UnexpectedValueException( '$target needs to be an EntityId or SiteLink' ); |
106
|
|
|
} |
107
|
|
|
} |
108
|
|
|
} |
109
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.