/
user_like_repo.go
109 lines (93 loc) · 3.86 KB
/
user_like_repo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package repository
//go:generate mockgen -source=user_like_repo.go -destination=../../internal/mocks/user_like_repo_mock.go -package mocks
import (
"context"
"fmt"
"strings"
"github.com/pkg/errors"
"github.com/spf13/cast"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
"gorm.io/gorm"
"github.com/go-microservice/moment-service/internal/cache"
"github.com/go-microservice/moment-service/internal/model"
)
var (
_tableUserLikeName = (&model.UserLikeModel{}).TableName()
_createSQL = "INSERT IGNORE INTO %s SET obj_type=?, obj_id=?, user_id=?, status=?, created_at=? ON duplicate key update status=?"
_getUserLikeSQL = "SELECT user_id, obj_type, obj_id, status FROM %s WHERE user_id=? AND obj_type=? AND obj_id=?"
_batchGetUserLikeSQL = "SELECT * FROM %s WHERE user_id=? AND obj_type=? AND obj_id IN (%s)"
_listUserLikeByObjSQL = "SELECT * FROM %s WHERE obj_type=? AND obj_id=? AND status=1 and id <=? ORDER BY id DESC limit ?"
)
var _ UserLikeRepo = (*userLikeRepo)(nil)
// UserLikeRepo define a repo interface
type UserLikeRepo interface {
CreateUserLike(ctx context.Context, db *gorm.DB, data *model.UserLikeModel) (id int64, err error)
UpdateUserLike(ctx context.Context, id int64, data *model.UserLikeModel) error
GetUserLike(ctx context.Context, userID, objID int64, objType int32) (ret *model.UserLikeModel, err error)
BatchGetUserLike(ctx context.Context, userId int64, objType int32, ids []int64) (ret []*model.UserLikeModel, err error)
ListUserLikeByObj(ctx context.Context, objType int32, objID, lastID int64, limit int32) (ret []*model.UserLikeModel, err error)
}
type userLikeRepo struct {
db *gorm.DB
tracer trace.Tracer
cache cache.UserLikeCache
}
// NewUserLike new a repository and return
func NewUserLike(db *gorm.DB, cache cache.UserLikeCache) UserLikeRepo {
return &userLikeRepo{
db: db,
tracer: otel.Tracer("userLike"),
cache: cache,
}
}
// CreateUserLike create a item
func (r *userLikeRepo) CreateUserLike(ctx context.Context, db *gorm.DB, data *model.UserLikeModel) (id int64, err error) {
sql := fmt.Sprintf(_createSQL, data.TableName())
err = db.WithContext(ctx).Exec(sql, data.ObjType, data.ObjID, data.UserID, data.Status, data.CreatedAt, data.Status).Error
if err != nil {
return 0, errors.Wrap(err, "[repo] create UserLike err")
}
return data.ID, nil
}
// UpdateUserLike update item
func (r *userLikeRepo) UpdateUserLike(ctx context.Context, id int64, data *model.UserLikeModel) error {
item := &model.UserLikeModel{}
err := r.db.Model(&item).Updates(data).Error
if err != nil {
return err
}
// delete cache
_ = r.cache.DelUserLikeCache(ctx, id)
return nil
}
// GetUserLike get a record
// TODO: add cache
func (r *userLikeRepo) GetUserLike(ctx context.Context, userID, objID int64, objType int32) (ret *model.UserLikeModel, err error) {
// read db
data := new(model.UserLikeModel)
err = r.db.WithContext(ctx).Raw(fmt.Sprintf(_getUserLikeSQL, _tableUserLikeName), userID, objType, objID).Scan(&data).Error
if err != nil {
return
}
return data, nil
}
// BatchGetUserLike batch get items
func (r *userLikeRepo) BatchGetUserLike(ctx context.Context, userId int64, objType int32, ids []int64) (ret []*model.UserLikeModel, err error) {
idsStr := cast.ToStringSlice(ids)
var userLikes []*model.UserLikeModel
_sql := fmt.Sprintf(_batchGetUserLikeSQL, _tableUserLikeName, strings.Join(idsStr, ","))
err = r.db.WithContext(ctx).Raw(_sql, userId, objType).Scan(&userLikes).Error
if err != nil {
return nil, err
}
return userLikes, nil
}
func (r *userLikeRepo) ListUserLikeByObj(ctx context.Context, objType int32, objID, lastID int64, limit int32) (ret []*model.UserLikeModel, err error) {
var items []*model.UserLikeModel
err = r.db.WithContext(ctx).Raw(fmt.Sprintf(_listUserLikeByObjSQL, _tableUserLikeName), objType, objID, lastID, limit).Scan(&items).Error
if err != nil {
return
}
return items, nil
}