16 private const VIRTUAL_DOMAIN =
'virtual-translate';
17 private const TABLE_NAME =
'translate_message_group_subscriptions';
19 private const MAX_GROUP_LENGTH = 200;
21 public function __construct(
22 private readonly IConnectionProvider $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__ )
45 $queryBuilder = $this->dbProvider
46 ->getReplicaDatabase( self::VIRTUAL_DOMAIN )
47 ->newSelectQueryBuilder()
48 ->select( [
'tmgs_group',
'tmgs_user_id' ] )
49 ->from( self::TABLE_NAME )
50 ->caller( __METHOD__ );
53 $dbGroupIds = array_map( self::getGroupIdForDatabase( ... ), $groupIds );
54 $queryBuilder->where( [
'tmgs_group' => $dbGroupIds ] );
58 $queryBuilder->andWhere( [
'tmgs_user_id' => $userId ] );
62 foreach ( $queryBuilder->fetchResultSet() as $row ) {
63 $subscriptions[$row->tmgs_group][] = (int)$row->tmgs_user_id;
65 return $subscriptions;
73 $userIds = $this->dbProvider
74 ->getReplicaDatabase( self::VIRTUAL_DOMAIN )
75 ->newSelectQueryBuilder()
76 ->select(
'tmgs_user_id' )
77 ->from( self::TABLE_NAME )
78 ->where( [
'tmgs_group' => $groupIds ] )
79 ->having(
'COUNT(tmgs_group) = ' . count( $groupIds ) )
80 ->caller( __METHOD__ )
82 return array_map( intval( ... ), $userIds );
85 public function removeSubscriptions(
string $groupId,
int $userId ): void {
86 $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN )
87 ->newDeleteQueryBuilder()
88 ->deleteFrom( self::TABLE_NAME )
90 'tmgs_group' => $groupId,
91 'tmgs_user_id' => $userId
93 ->caller( __METHOD__ )
97 public static function getGroupIdForDatabase(
MessageGroup|
string $groupId ): string {
99 $groupId = $groupId->getId();
102 return strlen( $groupId ) > self::MAX_GROUP_LENGTH ?
104 mb_strcut( $groupId, 0, 160 ) .
'||' . md5( $groupId ) :