github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/sqlstore/emoji_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  	"fmt"
     9  
    10  	"github.com/pkg/errors"
    11  
    12  	"github.com/mattermost/mattermost-server/v5/einterfaces"
    13  	"github.com/mattermost/mattermost-server/v5/model"
    14  	"github.com/mattermost/mattermost-server/v5/store"
    15  )
    16  
    17  type SqlEmojiStore struct {
    18  	*SqlStore
    19  	metrics einterfaces.MetricsInterface
    20  }
    21  
    22  func newSqlEmojiStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.EmojiStore {
    23  	s := &SqlEmojiStore{
    24  		SqlStore: sqlStore,
    25  		metrics:  metrics,
    26  	}
    27  
    28  	for _, db := range sqlStore.GetAllConns() {
    29  		table := db.AddTableWithName(model.Emoji{}, "Emoji").SetKeys(false, "Id")
    30  		table.ColMap("Id").SetMaxSize(26)
    31  		table.ColMap("CreatorId").SetMaxSize(26)
    32  		table.ColMap("Name").SetMaxSize(64)
    33  
    34  		table.SetUniqueTogether("Name", "DeleteAt")
    35  	}
    36  
    37  	return s
    38  }
    39  
    40  func (es SqlEmojiStore) createIndexesIfNotExists() {
    41  	es.CreateIndexIfNotExists("idx_emoji_update_at", "Emoji", "UpdateAt")
    42  	es.CreateIndexIfNotExists("idx_emoji_create_at", "Emoji", "CreateAt")
    43  	es.CreateIndexIfNotExists("idx_emoji_delete_at", "Emoji", "DeleteAt")
    44  	es.CreateIndexIfNotExists("idx_emoji_name", "Emoji", "Name")
    45  }
    46  
    47  func (es SqlEmojiStore) Save(emoji *model.Emoji) (*model.Emoji, error) {
    48  	emoji.PreSave()
    49  	if err := emoji.IsValid(); err != nil {
    50  		return nil, err
    51  	}
    52  
    53  	if err := es.GetMaster().Insert(emoji); err != nil {
    54  		return nil, errors.Wrap(err, "error saving emoji")
    55  	}
    56  
    57  	return emoji, nil
    58  }
    59  
    60  func (es SqlEmojiStore) Get(id string, allowFromCache bool) (*model.Emoji, error) {
    61  	return es.getBy("Id", id)
    62  }
    63  
    64  func (es SqlEmojiStore) GetByName(name string, allowFromCache bool) (*model.Emoji, error) {
    65  	return es.getBy("Name", name)
    66  }
    67  
    68  func (es SqlEmojiStore) GetMultipleByName(names []string) ([]*model.Emoji, error) {
    69  	keys, params := MapStringsToQueryParams(names, "Emoji")
    70  
    71  	var emojis []*model.Emoji
    72  
    73  	if _, err := es.GetReplica().Select(&emojis,
    74  		`SELECT
    75  			*
    76  		FROM
    77  			Emoji
    78  		WHERE
    79  			Name IN `+keys+`
    80  			AND DeleteAt = 0`, params); err != nil {
    81  		return nil, errors.Wrapf(err, "error getting emoji by names %v", names)
    82  	}
    83  	return emojis, nil
    84  }
    85  
    86  func (es SqlEmojiStore) GetList(offset, limit int, sort string) ([]*model.Emoji, error) {
    87  	var emoji []*model.Emoji
    88  
    89  	query := "SELECT * FROM Emoji WHERE DeleteAt = 0"
    90  
    91  	if sort == model.EMOJI_SORT_BY_NAME {
    92  		query += " ORDER BY Name"
    93  	}
    94  
    95  	query += " LIMIT :Limit OFFSET :Offset"
    96  
    97  	if _, err := es.GetReplica().Select(&emoji, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
    98  		return nil, errors.Wrap(err, "could not get list of emojis")
    99  	}
   100  	return emoji, nil
   101  }
   102  
   103  func (es SqlEmojiStore) Delete(emoji *model.Emoji, time int64) error {
   104  	if sqlResult, err := es.GetMaster().Exec(
   105  		`UPDATE
   106  			Emoji
   107  		SET
   108  			DeleteAt = :DeleteAt,
   109  			UpdateAt = :UpdateAt
   110  		WHERE
   111  			Id = :Id
   112  			AND DeleteAt = 0`, map[string]interface{}{"DeleteAt": time, "UpdateAt": time, "Id": emoji.Id}); err != nil {
   113  		return errors.Wrap(err, "could not delete emoji")
   114  	} else if rows, _ := sqlResult.RowsAffected(); rows == 0 {
   115  		return store.NewErrNotFound("Emoji", emoji.Id)
   116  	}
   117  
   118  	return nil
   119  }
   120  
   121  func (es SqlEmojiStore) Search(name string, prefixOnly bool, limit int) ([]*model.Emoji, error) {
   122  	var emojis []*model.Emoji
   123  
   124  	name = sanitizeSearchTerm(name, "\\")
   125  
   126  	term := ""
   127  	if !prefixOnly {
   128  		term = "%"
   129  	}
   130  
   131  	term += name + "%"
   132  
   133  	if _, err := es.GetReplica().Select(&emojis,
   134  		`SELECT
   135  			*
   136  		FROM
   137  			Emoji
   138  		WHERE
   139  			Name LIKE :Name
   140  			AND DeleteAt = 0
   141  			ORDER BY Name
   142  			LIMIT :Limit`, map[string]interface{}{"Name": term, "Limit": limit}); err != nil {
   143  		return nil, errors.Wrapf(err, "could not search emojis by name %s", name)
   144  	}
   145  	return emojis, nil
   146  }
   147  
   148  // getBy returns one active (not deleted) emoji, found by any one column (what/key).
   149  func (es SqlEmojiStore) getBy(what, key string) (*model.Emoji, error) {
   150  	var emoji *model.Emoji
   151  
   152  	err := es.GetReplica().SelectOne(&emoji,
   153  		`SELECT
   154  			*
   155  		FROM
   156  			Emoji
   157  		WHERE
   158  			`+what+` = :Key
   159  			AND DeleteAt = 0`, map[string]string{"Key": key})
   160  	if err != nil {
   161  		if err == sql.ErrNoRows {
   162  			return nil, store.NewErrNotFound("Emoji", fmt.Sprintf("%s=%s", what, key))
   163  		}
   164  
   165  		return nil, errors.Wrapf(err, "could not get emoji by %s with value %s", what, key)
   166  	}
   167  
   168  	return emoji, nil
   169  }