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