github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/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 }