first commit
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
package mysqldao
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/global"
|
||||
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/internal/mysqlmodel"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
// CollectDao 收藏数据访问
|
||||
type CollectDao struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewCollectDao 创建收藏 DAO
|
||||
func NewCollectDao() *CollectDao {
|
||||
return &CollectDao{db: global.MysqlEngine}
|
||||
}
|
||||
|
||||
// CollectCreate 创建收藏记录
|
||||
func (d *CollectDao) CollectCreate(ctx context.Context, collect *mysqlmodel.Collect) error {
|
||||
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectCreate")
|
||||
defer span.End()
|
||||
|
||||
if err := d.db.WithContext(ctx).Create(collect).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CollectUpsertOn 收藏幂等写入:唯一索引冲突时仅置 status=1,防并发重复插入。
|
||||
func (d *CollectDao) CollectUpsertOn(ctx context.Context, collect *mysqlmodel.Collect) error {
|
||||
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectUpsertOn")
|
||||
defer span.End()
|
||||
|
||||
if err := d.db.WithContext(ctx).Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "collect_type"}, {Name: "target_id"}, {Name: "user_id"}},
|
||||
DoUpdates: clause.AssignmentColumns([]string{"status"}),
|
||||
}).Create(collect).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CollectUpdateStatus 更新收藏状态(1=已收藏 0=已取消)
|
||||
func (d *CollectDao) CollectUpdateStatus(ctx context.Context, id int64, status int8) error {
|
||||
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectUpdateStatus")
|
||||
defer span.End()
|
||||
|
||||
if err := d.db.WithContext(ctx).Model(&mysqlmodel.Collect{}).Where("id = ?", id).UpdateColumn("status", status).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CollectGetByTargetAndUser 查询用户在目标上的收藏记录
|
||||
func (d *CollectDao) CollectGetByTargetAndUser(ctx context.Context, collectType int8, targetID, userID int64) (*mysqlmodel.Collect, error) {
|
||||
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectGetByTargetAndUser")
|
||||
defer span.End()
|
||||
|
||||
var collect mysqlmodel.Collect
|
||||
if err := d.db.WithContext(ctx).Where("collect_type = ? AND target_id = ? AND user_id = ?", collectType, targetID, userID).First(&collect).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return nil, err
|
||||
}
|
||||
return &collect, nil
|
||||
}
|
||||
|
||||
// CollectCountByTarget 统计目标收藏数(仅 status=1)
|
||||
func (d *CollectDao) CollectCountByTarget(ctx context.Context, collectType int8, targetID int64) (int64, error) {
|
||||
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectCountByTarget")
|
||||
defer span.End()
|
||||
|
||||
var count int64
|
||||
if err := d.db.WithContext(ctx).Model(&mysqlmodel.Collect{}).
|
||||
Where("collect_type = ? AND target_id = ? AND status = ?", collectType, targetID, int8(1)).
|
||||
Count(&count).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return 0, err
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
|
||||
// CollectListTargetIDsByUserPage 分页查询用户收藏的目标ID列表(仅 status=1),返回 ids 与总数。
|
||||
func (d *CollectDao) CollectListTargetIDsByUserPage(ctx context.Context, collectType int8, userID int64, page, pageSize int) ([]int64, int64, error) {
|
||||
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectListTargetIDsByUserPage")
|
||||
defer span.End()
|
||||
|
||||
q := d.db.WithContext(ctx).Model(&mysqlmodel.Collect{}).
|
||||
Where("collect_type = ? AND user_id = ? AND status = ?", collectType, userID, int8(1))
|
||||
|
||||
var total int64
|
||||
if err := q.Count(&total).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
var ids []int64
|
||||
if err := q.Order("id DESC").Offset((page - 1) * pageSize).Limit(pageSize).Pluck("target_id", &ids).Error; err != nil {
|
||||
span.RecordError(err)
|
||||
return nil, 0, err
|
||||
}
|
||||
return ids, total, nil
|
||||
}
|
||||
Reference in New Issue
Block a user