Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
MessageGroupSubscriptionStore.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\MessageGroupProcessing;
5
6use Wikimedia\Rdbms\IConnectionProvider;
7use Wikimedia\Rdbms\IResultWrapper;
8
16 private const VIRTUAL_DOMAIN = 'virtual-translate';
17 private const TABLE_NAME = 'translate_message_group_subscriptions';
19 private const MAX_GROUP_LENGTH = 200;
20 private IConnectionProvider $dbProvider;
21
22 public function __construct( IConnectionProvider $dbProvider ) {
23 $this->dbProvider = $dbProvider;
24 }
25
26 public function addSubscription( string $groupId, int $userId ): void {
27 $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN )
28 ->newReplaceQueryBuilder()
29 ->replaceInto( self::TABLE_NAME )
30 ->uniqueIndexFields( [ 'tmgs_group', 'tmgs_user_id' ] )
31 ->row( [
32 'tmgs_group' => self::getGroupIdForDatabase( $groupId ),
33 'tmgs_user_id' => $userId,
34 ] )
35 ->caller( __METHOD__ )
36 ->execute();
37 }
38
39 public function getSubscriptions( ?array $groupIds, ?int $userId ): IResultWrapper {
40 $queryBuilder = $this->dbProvider
41 ->getReplicaDatabase( self::VIRTUAL_DOMAIN )
42 ->newSelectQueryBuilder()
43 ->select( [ 'tmgs_group', 'tmgs_user_id' ] )
44 ->from( self::TABLE_NAME )
45 ->caller( __METHOD__ );
46
47 if ( $groupIds !== null ) {
48 $dbGroupIds = [];
49 foreach ( $groupIds as $groupId ) {
50 $dbGroupIds[] = self::getGroupIdForDatabase( $groupId );
51 }
52 $queryBuilder->where( [ 'tmgs_group' => $dbGroupIds ] );
53 }
54
55 if ( $userId !== null ) {
56 $queryBuilder->andWhere( [ 'tmgs_user_id' => $userId ] );
57 }
58
59 return $queryBuilder->fetchResultSet();
60 }
61
62 public function getSubscriptionByGroupUnion( array $groupIds ): array {
63 $queryBuilder = $this->dbProvider
64 ->getReplicaDatabase( self::VIRTUAL_DOMAIN )
65 ->newSelectQueryBuilder()
66 ->select( [ 'tmgs_user_id' ] )
67 ->from( self::TABLE_NAME )
68 ->where( [ 'tmgs_group' => $groupIds ] )
69 ->having( 'COUNT(tmgs_group) = ' . count( $groupIds ) )
70 ->caller( __METHOD__ );
71
72 return $queryBuilder->fetchFieldValues();
73 }
74
75 public function removeSubscriptions( string $groupId, int $userId ): void {
76 $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN )
77 ->newDeleteQueryBuilder()
78 ->deleteFrom( self::TABLE_NAME )
79 ->where( [
80 'tmgs_group' => $groupId,
81 'tmgs_user_id' => $userId
82 ] )
83 ->caller( __METHOD__ )
84 ->execute();
85 }
86
87 private static function getGroupIdForDatabase( string $groupId ): string {
88 // Check if length is more than 200 bytes
89 if ( strlen( $groupId ) <= self::MAX_GROUP_LENGTH ) {
90 return $groupId;
91 }
92
93 $hash = hash( 'md5', $groupId );
94 // We take 160 bytes of the original string and append the md5 hash (32 bytes)
95 return mb_strcut( $groupId, 0, 160 ) . '||' . $hash;
96 }
97}
Store service for looking up and storing user subscriptions to message group.