github.com/vnforks/kid/v5@v5.22.1-0.20200408055009-b89d99c65676/store/sqlstore/status_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 "database/sql" 8 "net/http" 9 "strconv" 10 "strings" 11 12 "github.com/vnforks/kid/v5/model" 13 "github.com/vnforks/kid/v5/store" 14 ) 15 16 const ( 17 MISSING_STATUS_ERROR = "store.sql_status.get.missing.app_error" 18 ) 19 20 type SqlStatusStore struct { 21 SqlStore 22 } 23 24 func newSqlStatusStore(sqlStore SqlStore) store.StatusStore { 25 s := &SqlStatusStore{sqlStore} 26 27 for _, db := range sqlStore.GetAllConns() { 28 table := db.AddTableWithName(model.Status{}, "Status").SetKeys(false, "UserId") 29 table.ColMap("UserId").SetMaxSize(26) 30 table.ColMap("Status").SetMaxSize(32) 31 table.ColMap("ActiveClass").SetMaxSize(26) 32 } 33 34 return s 35 } 36 37 func (s SqlStatusStore) createIndexesIfNotExists() { 38 s.CreateIndexIfNotExists("idx_status_user_id", "Status", "UserId") 39 s.CreateIndexIfNotExists("idx_status_status", "Status", "Status") 40 } 41 42 func (s SqlStatusStore) SaveOrUpdate(status *model.Status) *model.AppError { 43 if err := s.GetReplica().SelectOne(&model.Status{}, "SELECT * FROM Status WHERE UserId = :UserId", map[string]interface{}{"UserId": status.UserId}); err == nil { 44 if _, err := s.GetMaster().Update(status); err != nil { 45 return model.NewAppError("SqlStatusStore.SaveOrUpdate", "store.sql_status.update.app_error", nil, err.Error(), http.StatusInternalServerError) 46 } 47 } else { 48 if err := s.GetMaster().Insert(status); err != nil { 49 if !(strings.Contains(err.Error(), "for key 'PRIMARY'") && strings.Contains(err.Error(), "Duplicate entry")) { 50 return model.NewAppError("SqlStatusStore.SaveOrUpdate", "store.sql_status.save.app_error", nil, err.Error(), http.StatusInternalServerError) 51 } 52 } 53 } 54 return nil 55 } 56 57 func (s SqlStatusStore) Get(userId string) (*model.Status, *model.AppError) { 58 var status model.Status 59 60 if err := s.GetReplica().SelectOne(&status, 61 `SELECT 62 * 63 FROM 64 Status 65 WHERE 66 UserId = :UserId`, map[string]interface{}{"UserId": userId}); err != nil { 67 if err == sql.ErrNoRows { 68 return nil, model.NewAppError("SqlStatusStore.Get", MISSING_STATUS_ERROR, nil, err.Error(), http.StatusNotFound) 69 } 70 return nil, model.NewAppError("SqlStatusStore.Get", "store.sql_status.get.app_error", nil, err.Error(), http.StatusInternalServerError) 71 } 72 return &status, nil 73 } 74 75 func (s SqlStatusStore) GetByIds(userIds []string) ([]*model.Status, *model.AppError) { 76 props := make(map[string]interface{}) 77 idQuery := "" 78 79 for index, userId := range userIds { 80 if len(idQuery) > 0 { 81 idQuery += ", " 82 } 83 84 props["userId"+strconv.Itoa(index)] = userId 85 idQuery += ":userId" + strconv.Itoa(index) 86 } 87 88 var statuses []*model.Status 89 if _, err := s.GetReplica().Select(&statuses, "SELECT * FROM Status WHERE UserId IN ("+idQuery+")", props); err != nil { 90 return nil, model.NewAppError("SqlStatusStore.GetByIds", "store.sql_status.get.app_error", nil, err.Error(), http.StatusInternalServerError) 91 } 92 return statuses, nil 93 } 94 95 func (s SqlStatusStore) ResetAll() *model.AppError { 96 if _, err := s.GetMaster().Exec("UPDATE Status SET Status = :Status WHERE Manual = false", map[string]interface{}{"Status": model.STATUS_OFFLINE}); err != nil { 97 return model.NewAppError("SqlStatusStore.ResetAll", "store.sql_status.reset_all.app_error", nil, "", http.StatusInternalServerError) 98 } 99 return nil 100 } 101 102 func (s SqlStatusStore) GetTotalActiveUsersCount() (int64, *model.AppError) { 103 time := model.GetMillis() - (1000 * 60 * 60 * 24) 104 count, err := s.GetReplica().SelectInt("SELECT COUNT(UserId) FROM Status WHERE LastActivityAt > :Time", map[string]interface{}{"Time": time}) 105 if err != nil { 106 return count, model.NewAppError("SqlStatusStore.GetTotalActiveUsersCount", "store.sql_status.get_total_active_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) 107 } 108 return count, nil 109 } 110 111 func (s SqlStatusStore) UpdateLastActivityAt(userId string, lastActivityAt int64) *model.AppError { 112 if _, err := s.GetMaster().Exec("UPDATE Status SET LastActivityAt = :Time WHERE UserId = :UserId", map[string]interface{}{"UserId": userId, "Time": lastActivityAt}); err != nil { 113 return model.NewAppError("SqlStatusStore.UpdateLastActivityAt", "store.sql_status.update_last_activity_at.app_error", nil, "", http.StatusInternalServerError) 114 } 115 116 return nil 117 }