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  }