topfans/backend/services/assetService/repository/asset_like_repository.go
2026-04-07 22:29:48 +08:00

225 lines
4.9 KiB
Go

package repository
import (
"errors"
"github.com/topfans/backend/pkg/models"
"gorm.io/gorm"
)
// AssetLikeRepository 资产点赞记录Repository接口
type AssetLikeRepository interface {
// Create 创建点赞记录
Create(like *models.AssetLike) error
// Delete 删除点赞记录
Delete(assetID, userID, starID int64) error
// Exists 检查点赞记录是否存在
Exists(assetID, userID, starID int64) (bool, error)
// GetByAsset 获取资产的点赞记录列表(分页)
GetByAsset(assetID int64, limit, offset int) ([]*models.AssetLike, error)
// GetByUser 获取用户的点赞记录列表(分页)
GetByUser(userID, starID int64, limit, offset int) ([]*models.AssetLike, error)
// CountByAsset 统计资产的点赞数
CountByAsset(assetID int64) (int64, error)
// CountByUser 统计用户的点赞数
CountByUser(userID, starID int64) (int64, error)
}
// assetLikeRepository 资产点赞记录Repository实现
type assetLikeRepository struct {
db *gorm.DB
}
// NewAssetLikeRepository 创建资产点赞记录Repository实例
func NewAssetLikeRepository(db *gorm.DB) AssetLikeRepository {
return &assetLikeRepository{
db: db,
}
}
// Create 创建点赞记录
func (r *assetLikeRepository) Create(like *models.AssetLike) error {
if like == nil {
return errors.New("asset like cannot be nil")
}
if like.AssetID <= 0 {
return errors.New("asset_id must be greater than 0")
}
if like.UserID <= 0 {
return errors.New("user_id must be greater than 0")
}
if like.StarID <= 0 {
return errors.New("star_id must be greater than 0")
}
// 检查是否已存在
exists, err := r.Exists(like.AssetID, like.UserID, like.StarID)
if err != nil {
return err
}
if exists {
return errors.New("already liked")
}
if err := r.db.Create(like).Error; err != nil {
return err
}
return nil
}
// Delete 删除点赞记录
func (r *assetLikeRepository) Delete(assetID, userID, starID int64) error {
if assetID <= 0 {
return errors.New("asset_id must be greater than 0")
}
if userID <= 0 {
return errors.New("user_id must be greater than 0")
}
if starID <= 0 {
return errors.New("star_id must be greater than 0")
}
result := r.db.Where("asset_id = ? AND user_id = ? AND star_id = ?", assetID, userID, starID).
Delete(&models.AssetLike{})
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return errors.New("asset like not found")
}
return nil
}
// Exists 检查点赞记录是否存在
func (r *assetLikeRepository) Exists(assetID, userID, starID int64) (bool, error) {
if assetID <= 0 {
return false, errors.New("asset_id must be greater than 0")
}
if userID <= 0 {
return false, errors.New("user_id must be greater than 0")
}
if starID <= 0 {
return false, errors.New("star_id must be greater than 0")
}
var count int64
err := r.db.Model(&models.AssetLike{}).
Where("asset_id = ? AND user_id = ? AND star_id = ?", assetID, userID, starID).
Count(&count).Error
if err != nil {
return false, err
}
return count > 0, nil
}
// GetByAsset 获取资产的点赞记录列表(分页)
func (r *assetLikeRepository) GetByAsset(assetID int64, limit, offset int) ([]*models.AssetLike, error) {
if assetID <= 0 {
return nil, errors.New("asset_id must be greater than 0")
}
if limit <= 0 {
limit = 20
}
var likes []*models.AssetLike
err := r.db.Where("asset_id = ?", assetID).
Order("created_at DESC").
Limit(limit).
Offset(offset).
Find(&likes).Error
if err != nil {
return nil, err
}
return likes, nil
}
// GetByUser 获取用户的点赞记录列表(分页)
func (r *assetLikeRepository) GetByUser(userID, starID int64, limit, offset int) ([]*models.AssetLike, error) {
if userID <= 0 {
return nil, errors.New("user_id must be greater than 0")
}
if starID <= 0 {
return nil, errors.New("star_id must be greater than 0")
}
if limit <= 0 {
limit = 20
}
var likes []*models.AssetLike
err := r.db.Where("user_id = ? AND star_id = ?", userID, starID).
Order("created_at DESC").
Limit(limit).
Offset(offset).
Find(&likes).Error
if err != nil {
return nil, err
}
return likes, nil
}
// CountByAsset 统计资产的点赞数
func (r *assetLikeRepository) CountByAsset(assetID int64) (int64, error) {
if assetID <= 0 {
return 0, errors.New("asset_id must be greater than 0")
}
var count int64
err := r.db.Model(&models.AssetLike{}).
Where("asset_id = ?", assetID).
Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// CountByUser 统计用户的点赞数
func (r *assetLikeRepository) CountByUser(userID, starID int64) (int64, error) {
if userID <= 0 {
return 0, errors.New("user_id must be greater than 0")
}
if starID <= 0 {
return 0, errors.New("star_id must be greater than 0")
}
var count int64
err := r.db.Model(&models.AssetLike{}).
Where("user_id = ? AND star_id = ?", userID, starID).
Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}