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 }