Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.45% covered (success)
95.45%
21 / 22
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserGroupManagerFactory
95.45% covered (success)
95.45%
21 / 22
50.00% covered (danger)
50.00%
1 / 2
6
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getUserGroupManager
95.24% covered (success)
95.24%
20 / 21
0.00% covered (danger)
0.00%
0 / 1
5
1<?php
2/**
3 * @license GPL-2.0-or-later
4 * @file
5 */
6
7namespace MediaWiki\User;
8
9use MediaWiki\Config\ServiceOptions;
10use MediaWiki\HookContainer\HookContainer;
11use MediaWiki\JobQueue\JobQueueGroupFactory;
12use MediaWiki\User\TempUser\TempUserConfig;
13use MediaWiki\WikiMap\WikiMap;
14use Wikimedia\LockManager\ILockManager;
15use Wikimedia\Rdbms\ILBFactory;
16use Wikimedia\Rdbms\ReadOnlyMode;
17
18/**
19 * Factory service for UserGroupManager instances. This allows UserGroupManager to be created for
20 * cross-wiki access.
21 *
22 * @since 1.35
23 * @ingroup User
24 */
25class UserGroupManagerFactory {
26
27    /**
28     * @var UserGroupManager[] User group manager instances indexed by wiki
29     */
30    private $instances = [];
31
32    /**
33     * @param ServiceOptions $options
34     * @param ReadOnlyMode $readOnlyMode
35     * @param ILBFactory $dbLoadBalancerFactory
36     * @param HookContainer $hookContainer
37     * @param JobQueueGroupFactory $jobQueueGroupFactory
38     * @param TempUserConfig $tempUserConfig Assumed to be the same across all domains.
39     * @param UserFactory $userFactory
40     * @param UserRequirementsConditionCheckerFactory $userRequirementsConditionCheckerFactory
41     * @param RestrictedUserGroupConfigReader $restrictedUserGroupConfigReader
42     * @param ILockManager $lockManager
43     * @param callable[] $clearCacheCallbacks
44     */
45    public function __construct(
46        private readonly ServiceOptions $options,
47        private readonly ReadOnlyMode $readOnlyMode,
48        private readonly ILBFactory $dbLoadBalancerFactory,
49        private readonly HookContainer $hookContainer,
50        private readonly JobQueueGroupFactory $jobQueueGroupFactory,
51        private readonly TempUserConfig $tempUserConfig,
52        private readonly UserFactory $userFactory,
53        private readonly UserRequirementsConditionCheckerFactory $userRequirementsConditionCheckerFactory,
54        private readonly RestrictedUserGroupConfigReader $restrictedUserGroupConfigReader,
55        private readonly ILockManager $lockManager,
56        private readonly array $clearCacheCallbacks = [],
57    ) {
58    }
59
60    /**
61     * @param string|false $wikiId
62     * @return UserGroupManager
63     */
64    public function getUserGroupManager( $wikiId = UserIdentity::LOCAL ): UserGroupManager {
65        if (
66            is_string( $wikiId ) &&
67            (
68                $this->dbLoadBalancerFactory->getLocalDomainID() === $wikiId ||
69                WikiMap::getWikiIdFromDbDomain( $this->dbLoadBalancerFactory->getLocalDomainID() ) === $wikiId
70            )
71        ) {
72            $wikiId = UserIdentity::LOCAL;
73        }
74        $key = (string)$wikiId;
75        if ( !isset( $this->instances[$key] ) ) {
76            $this->instances[$key] = new UserGroupManager(
77                $this->options,
78                $this->readOnlyMode,
79                $this->dbLoadBalancerFactory,
80                $this->hookContainer,
81                $this->jobQueueGroupFactory->makeJobQueueGroup( $wikiId ),
82                $this->tempUserConfig,
83                $this->userFactory,
84                $this->userRequirementsConditionCheckerFactory,
85                $this->restrictedUserGroupConfigReader,
86                $this->lockManager,
87                $this->clearCacheCallbacks,
88                $wikiId
89            );
90        }
91        return $this->instances[$key];
92    }
93}