16 private const TABLE_NAME =
'translate_message_group_subscriptions';
18 private const MAX_GROUP_LENGTH = 200;
19 private IConnectionProvider $connectionProvider;
21 public function __construct( IConnectionProvider $connectionProvider ) {
22 $this->connectionProvider = $connectionProvider;
25 public function addSubscription(
string $groupId,
int $userId ):
void {
26 $this->connectionProvider->getPrimaryDatabase()->replace(
28 [ [
'tmgs_group',
'tmgs_user_id' ] ],
30 'tmgs_group' => self::getGroupIdForDatabase( $groupId ),
31 'tmgs_user_id' => $userId,
37 public function getSubscriptions( ?array $groupIds, ?
int $userId ): IResultWrapper {
38 $queryBuilder = $this->connectionProvider
39 ->getReplicaDatabase()
40 ->newSelectQueryBuilder()
41 ->select( [
'tmgs_group',
'tmgs_user_id' ] )
42 ->from( self::TABLE_NAME )
43 ->caller( __METHOD__ );
45 if ( $groupIds !==
null ) {
47 foreach ( $groupIds as $groupId ) {
48 $dbGroupIds[] = self::getGroupIdForDatabase( $groupId );
50 $queryBuilder->where( [
'tmgs_group' => $dbGroupIds ] );
53 if ( $userId !==
null ) {
54 $queryBuilder->andWhere( [
'tmgs_user_id' => $userId ] );
57 return $queryBuilder->fetchResultSet();
60 public function removeSubscriptions(
string $groupId,
int $userId ):
void {
62 'tmgs_group' => $groupId,
63 'tmgs_user_id' => $userId
66 $this->connectionProvider->getPrimaryDatabase()
74 private static function getGroupIdForDatabase(
string $groupId ):
string {
76 if ( strlen( $groupId ) <= self::MAX_GROUP_LENGTH ) {
80 $hash = hash(
'md5', $groupId );
82 return mb_strcut( $groupId, 0, 160 ) .
'||' . $hash;