github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/sqlstore/remote_cluster_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  
    10  	sq "github.com/Masterminds/squirrel"
    11  	"github.com/pkg/errors"
    12  
    13  	"github.com/masterhung0112/hk_server/v5/model"
    14  	"github.com/masterhung0112/hk_server/v5/store"
    15  )
    16  
    17  type sqlRemoteClusterStore struct {
    18  	*SqlStore
    19  }
    20  
    21  func newSqlRemoteClusterStore(sqlStore *SqlStore) store.RemoteClusterStore {
    22  	s := &sqlRemoteClusterStore{sqlStore}
    23  
    24  	for _, db := range sqlStore.GetAllConns() {
    25  		table := db.AddTableWithName(model.RemoteCluster{}, "RemoteClusters").SetKeys(false, "RemoteId", "Name")
    26  		table.ColMap("RemoteId").SetMaxSize(26)
    27  		table.ColMap("RemoteTeamId").SetMaxSize(26)
    28  		table.ColMap("Name").SetMaxSize(64)
    29  		table.ColMap("DisplayName").SetMaxSize(64)
    30  		table.ColMap("SiteURL").SetMaxSize(512)
    31  		table.ColMap("Token").SetMaxSize(26)
    32  		table.ColMap("RemoteToken").SetMaxSize(26)
    33  		table.ColMap("Topics").SetMaxSize(512)
    34  		table.ColMap("CreatorId").SetMaxSize(26)
    35  	}
    36  	return s
    37  }
    38  
    39  func (s sqlRemoteClusterStore) Save(remoteCluster *model.RemoteCluster) (*model.RemoteCluster, error) {
    40  	remoteCluster.PreSave()
    41  	if err := remoteCluster.IsValid(); err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	if err := s.GetMaster().Insert(remoteCluster); err != nil {
    46  		return nil, errors.Wrap(err, "failed to save RemoteCluster")
    47  	}
    48  	return remoteCluster, nil
    49  }
    50  
    51  func (s sqlRemoteClusterStore) Update(remoteCluster *model.RemoteCluster) (*model.RemoteCluster, error) {
    52  	remoteCluster.PreUpdate()
    53  	if err := remoteCluster.IsValid(); err != nil {
    54  		return nil, err
    55  	}
    56  
    57  	if _, err := s.GetMaster().Update(remoteCluster); err != nil {
    58  		return nil, errors.Wrap(err, "failed to update RemoteCluster")
    59  	}
    60  	return remoteCluster, nil
    61  }
    62  
    63  func (s sqlRemoteClusterStore) Delete(remoteId string) (bool, error) {
    64  	squery, args, err := s.getQueryBuilder().
    65  		Delete("RemoteClusters").
    66  		Where(sq.Eq{"RemoteId": remoteId}).
    67  		ToSql()
    68  	if err != nil {
    69  		return false, errors.Wrap(err, "delete_remote_cluster_tosql")
    70  	}
    71  
    72  	result, err := s.GetMaster().Exec(squery, args...)
    73  	if err != nil {
    74  		return false, errors.Wrap(err, "failed to delete RemoteCluster")
    75  	}
    76  
    77  	count, err := result.RowsAffected()
    78  	if err != nil {
    79  		return false, errors.Wrap(err, "failed to determine rows affected")
    80  	}
    81  
    82  	return count > 0, nil
    83  }
    84  
    85  func (s sqlRemoteClusterStore) Get(remoteId string) (*model.RemoteCluster, error) {
    86  	query := s.getQueryBuilder().
    87  		Select("*").
    88  		From("RemoteClusters").
    89  		Where(sq.Eq{"RemoteId": remoteId})
    90  
    91  	queryString, args, err := query.ToSql()
    92  	if err != nil {
    93  		return nil, errors.Wrap(err, "remote_cluster_get_tosql")
    94  	}
    95  
    96  	var rc model.RemoteCluster
    97  	if err := s.GetReplica().SelectOne(&rc, queryString, args...); err != nil {
    98  		return nil, errors.Wrapf(err, "failed to find RemoteCluster")
    99  	}
   100  	return &rc, nil
   101  }
   102  
   103  func (s sqlRemoteClusterStore) GetAll(filter model.RemoteClusterQueryFilter) ([]*model.RemoteCluster, error) {
   104  	query := s.getQueryBuilder().
   105  		Select("rc.*").
   106  		From("RemoteClusters rc")
   107  
   108  	if filter.InChannel != "" {
   109  		query = query.Where("rc.RemoteId IN (SELECT scr.RemoteId FROM SharedChannelRemotes scr WHERE scr.ChannelId = ?)", filter.InChannel)
   110  	}
   111  
   112  	if filter.NotInChannel != "" {
   113  		query = query.Where("rc.RemoteId NOT IN (SELECT scr.RemoteId FROM SharedChannelRemotes scr WHERE scr.ChannelId = ?)", filter.NotInChannel)
   114  	}
   115  
   116  	if filter.ExcludeOffline {
   117  		query = query.Where(sq.Gt{"rc.LastPingAt": model.GetMillis() - model.RemoteOfflineAfterMillis})
   118  	}
   119  
   120  	if filter.CreatorId != "" {
   121  		query = query.Where(sq.Eq{"rc.CreatorId": filter.CreatorId})
   122  	}
   123  
   124  	if filter.OnlyConfirmed {
   125  		query = query.Where(sq.NotEq{"rc.SiteURL": ""})
   126  	}
   127  
   128  	if filter.Topic != "" {
   129  		trimmed := strings.TrimSpace(filter.Topic)
   130  		if trimmed == "" || trimmed == "*" {
   131  			return nil, errors.New("invalid topic")
   132  		}
   133  		queryTopic := fmt.Sprintf("%% %s %%", trimmed)
   134  		query = query.Where(sq.Or{sq.Like{"rc.Topics": queryTopic}, sq.Eq{"rc.Topics": "*"}})
   135  	}
   136  
   137  	queryString, args, err := query.ToSql()
   138  	if err != nil {
   139  		return nil, errors.Wrap(err, "remote_cluster_getall_tosql")
   140  	}
   141  
   142  	var list []*model.RemoteCluster
   143  	if _, err := s.GetReplica().Select(&list, queryString, args...); err != nil {
   144  		return nil, errors.Wrapf(err, "failed to find RemoteClusters")
   145  	}
   146  	return list, nil
   147  }
   148  
   149  func (s sqlRemoteClusterStore) UpdateTopics(remoteClusterid string, topics string) (*model.RemoteCluster, error) {
   150  	rc, err := s.Get(remoteClusterid)
   151  	if err != nil {
   152  		return nil, err
   153  	}
   154  	rc.Topics = topics
   155  
   156  	rc.PreUpdate()
   157  
   158  	if _, err = s.GetMaster().Update(rc); err != nil {
   159  		return nil, err
   160  	}
   161  	return rc, nil
   162  }
   163  
   164  func (s sqlRemoteClusterStore) SetLastPingAt(remoteClusterId string) error {
   165  	query := s.getQueryBuilder().
   166  		Update("RemoteClusters").
   167  		Set("LastPingAt", model.GetMillis()).
   168  		Where(sq.Eq{"RemoteId": remoteClusterId})
   169  
   170  	queryString, args, err := query.ToSql()
   171  	if err != nil {
   172  		return errors.Wrap(err, "remote_cluster_tosql")
   173  	}
   174  
   175  	if _, err := s.GetMaster().Exec(queryString, args...); err != nil {
   176  		return errors.Wrap(err, "failed to update RemoteCluster")
   177  	}
   178  	return nil
   179  }
   180  
   181  func (s *sqlRemoteClusterStore) createIndexesIfNotExists() {
   182  	uniquenessColumns := []string{"SiteUrl", "RemoteTeamId"}
   183  	if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
   184  		uniquenessColumns = []string{"RemoteTeamId", "SiteUrl(168)"}
   185  	}
   186  	s.CreateUniqueCompositeIndexIfNotExists(RemoteClusterSiteURLUniqueIndex, "RemoteClusters", uniquenessColumns)
   187  }