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;
22 public function __construct( IConnectionProvider $dbProvider ) {
23 $this->dbProvider = $dbProvider;
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' ] )
32 'tmgs_group' => self::getGroupIdForDatabase( $groupId ),
33 'tmgs_user_id' => $userId,
35 ->caller( __METHOD__ )
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__ );
47 if ( $groupIds !==
null ) {
49 foreach ( $groupIds as $groupId ) {
50 $dbGroupIds[] = self::getGroupIdForDatabase( $groupId );
52 $queryBuilder->where( [
'tmgs_group' => $dbGroupIds ] );
55 if ( $userId !==
null ) {
56 $queryBuilder->andWhere( [
'tmgs_user_id' => $userId ] );
59 return $queryBuilder->fetchResultSet();
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__ );
72 return $queryBuilder->fetchFieldValues();
75 public function removeSubscriptions(
string $groupId,
int $userId ):
void {
76 $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN )
77 ->newDeleteQueryBuilder()
78 ->deleteFrom( self::TABLE_NAME )
80 'tmgs_group' => $groupId,
81 'tmgs_user_id' => $userId
83 ->caller( __METHOD__ )
87 private static function getGroupIdForDatabase(
string $groupId ):
string {
89 if ( strlen( $groupId ) <= self::MAX_GROUP_LENGTH ) {
93 $hash = hash(
'md5', $groupId );
95 return mb_strcut( $groupId, 0, 160 ) .
'||' . $hash;