github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/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  	"context"
     8  	"database/sql"
     9  	"fmt"
    10  
    11  	"github.com/pkg/errors"
    12  
    13  	"github.com/masterhung0112/hk_server/v5/einterfaces"
    14  	"github.com/masterhung0112/hk_server/v5/model"
    15  	"github.com/masterhung0112/hk_server/v5/store"
    16  )
    17  
    18  type SqlEmojiStore struct {
    19  	*SqlStore
    20  	metrics einterfaces.MetricsInterface
    21  }
    22  
    23  func newSqlEmojiStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.EmojiStore {
    24  	s := &SqlEmojiStore{
    25  		SqlStore: sqlStore,
    26  		metrics:  metrics,
    27  	}
    28  
    29  	for _, db := range sqlStore.GetAllConns() {
    30  		table := db.AddTableWithName(model.Emoji{}, "Emoji").SetKeys(false, "Id")
    31  		table.ColMap("Id").SetMaxSize(26)
    32  		table.ColMap("CreatorId").SetMaxSize(26)
    33  		table.ColMap("Name").SetMaxSize(64)
    34  
    35  		table.SetUniqueTogether("Name", "DeleteAt")
    36  	}
    37  
    38  	return s
    39  }
    40  
    41  func (es SqlEmojiStore) createIndexesIfNotExists() {
    42  	es.CreateIndexIfNotExists("idx_emoji_update_at", "Emoji", "UpdateAt")
    43  	es.CreateIndexIfNotExists("idx_emoji_create_at", "Emoji", "CreateAt")
    44  	es.CreateIndexIfNotExists("idx_emoji_delete_at", "Emoji", "DeleteAt")
    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(ctx context.Context, id string, allowFromCache bool) (*model.Emoji, error) {
    61  	return es.getBy(ctx, "Id", id)
    62  }
    63  
    64  func (es SqlEmojiStore) GetByName(ctx context.Context, name string, allowFromCache bool) (*model.Emoji, error) {
    65  	return es.getBy(ctx, "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(ctx context.Context, what, key string) (*model.Emoji, error) {
   150  	var emoji *model.Emoji
   151  
   152  	err := es.DBFromContext(ctx).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  }