373 lines
13 KiB
Go
373 lines
13 KiB
Go
package repository
|
|
|
|
import (
|
|
"errors"
|
|
|
|
appErrors "github.com/topfans/backend/pkg/errors"
|
|
"github.com/topfans/backend/pkg/models"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// AssetRegistryRepository 资产统一索引Repository接口
|
|
type AssetRegistryRepository interface {
|
|
// Create 创建索引记录
|
|
Create(registry *models.AssetRegistry) error
|
|
|
|
// GetByID 根据ID查询
|
|
GetByID(id int64) (*models.AssetRegistry, error)
|
|
|
|
// GetByAssetID 根据asset_id查询
|
|
GetByAssetID(assetID int64) (*models.AssetRegistry, error)
|
|
|
|
// GetByAssetTypeAndID 根据类型和asset_id查询
|
|
GetByAssetTypeAndID(assetType string, assetID int64) (*models.AssetRegistry, error)
|
|
|
|
// GetByOwner 查询用户的所有索引记录
|
|
GetByOwner(ownerUID, starID int64) ([]*models.AssetRegistry, error)
|
|
|
|
// GetByOwnerAndType 查询用户指定类型的索引记录
|
|
GetByOwnerAndType(ownerUID, starID int64, assetType string, limit, offset int) ([]*models.AssetRegistry, error)
|
|
|
|
// GetByOwnerAndTypeAndGrade 查询用户指定类型和等级的索引记录
|
|
GetByOwnerAndTypeAndGrade(ownerUID, starID int64, assetType string, grade int32, limit, offset int) ([]*models.AssetRegistry, error)
|
|
|
|
// GetByOwnerAndTypeAndCategory 查询用户指定类型和分类的索引记录
|
|
GetByOwnerAndTypeAndCategory(ownerUID, starID int64, assetType string, category string, limit, offset int) ([]*models.AssetRegistry, error)
|
|
|
|
// GetByOwnerAndTypeAndActivity 查询用户指定类型和活动的索引记录
|
|
GetByOwnerAndTypeAndActivity(ownerUID, starID int64, assetType string, activityID int64, limit, offset int) ([]*models.AssetRegistry, error)
|
|
|
|
// CountByOwner 统计用户的索引记录数量
|
|
CountByOwner(ownerUID, starID int64) (int64, error)
|
|
|
|
// CountByOwnerAndType 统计用户指定类型的索引记录数量
|
|
CountByOwnerAndType(ownerUID, starID int64, assetType string) (int64, error)
|
|
|
|
// CountByOwnerAndTypeAndGrade 统计用户指定类型和等级的索引记录数量
|
|
CountByOwnerAndTypeAndGrade(ownerUID, starID int64, assetType string, grade int32) (int64, error)
|
|
|
|
// CountByOwnerAndTypeAndCategory 统计用户指定类型和分类的索引记录数量
|
|
CountByOwnerAndTypeAndCategory(ownerUID, starID int64, assetType string, category string) (int64, error)
|
|
|
|
// CountByOwnerAndTypeAndActivity 统计用户指定类型和活动的索引记录数量
|
|
CountByOwnerAndTypeAndActivity(ownerUID, starID int64, assetType string, activityID int64) (int64, error)
|
|
|
|
// UpdateLikeCount 更新点赞数
|
|
UpdateLikeCount(assetID int64, likeCount int32) error
|
|
|
|
// UpdateGrade 更新等级
|
|
UpdateGrade(assetID int64, grade int32) error
|
|
|
|
// Delete 删除索引记录
|
|
Delete(assetID int64) error
|
|
|
|
// DeleteByAssetType 删除指定类型的索引记录
|
|
DeleteByAssetType(assetType string, assetID int64) error
|
|
}
|
|
|
|
// assetRegistryRepository 资产统一索引Repository实现
|
|
type assetRegistryRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewAssetRegistryRepository 创建资产统一索引Repository实例
|
|
func NewAssetRegistryRepository(db *gorm.DB) AssetRegistryRepository {
|
|
return &assetRegistryRepository{db: db}
|
|
}
|
|
|
|
// Create 创建索引记录
|
|
func (r *assetRegistryRepository) Create(registry *models.AssetRegistry) error {
|
|
if registry == nil {
|
|
return errors.New("registry cannot be nil")
|
|
}
|
|
if registry.OwnerUID <= 0 {
|
|
return errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if registry.StarID <= 0 {
|
|
return errors.New("star_id must be greater than 0")
|
|
}
|
|
return r.db.Create(registry).Error
|
|
}
|
|
|
|
// GetByID 根据ID查询
|
|
func (r *assetRegistryRepository) GetByID(id int64) (*models.AssetRegistry, error) {
|
|
if id <= 0 {
|
|
return nil, errors.New("id must be greater than 0")
|
|
}
|
|
var registry models.AssetRegistry
|
|
if err := r.db.Where("id = ?", id).First(®istry).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, appErrors.ErrAssetRegistryNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return ®istry, nil
|
|
}
|
|
|
|
// GetByAssetID 根据asset_id查询
|
|
func (r *assetRegistryRepository) GetByAssetID(assetID int64) (*models.AssetRegistry, error) {
|
|
if assetID <= 0 {
|
|
return nil, errors.New("asset_id must be greater than 0")
|
|
}
|
|
var registry models.AssetRegistry
|
|
if err := r.db.Where("asset_id = ?", assetID).First(®istry).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, appErrors.ErrAssetRegistryNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return ®istry, nil
|
|
}
|
|
|
|
// GetByAssetTypeAndID 根据类型和asset_id查询
|
|
func (r *assetRegistryRepository) GetByAssetTypeAndID(assetType string, assetID int64) (*models.AssetRegistry, error) {
|
|
if assetType == "" {
|
|
return nil, errors.New("asset_type must not be empty")
|
|
}
|
|
if assetID <= 0 {
|
|
return nil, errors.New("asset_id must be greater than 0")
|
|
}
|
|
var registry models.AssetRegistry
|
|
if err := r.db.Where("asset_type = ? AND asset_id = ?", assetType, assetID).First(®istry).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, appErrors.ErrAssetRegistryNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return ®istry, nil
|
|
}
|
|
|
|
// GetByOwner 查询用户的所有索引记录
|
|
func (r *assetRegistryRepository) GetByOwner(ownerUID, starID int64) ([]*models.AssetRegistry, error) {
|
|
if ownerUID <= 0 {
|
|
return nil, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return nil, errors.New("star_id must be greater than 0")
|
|
}
|
|
var registries []*models.AssetRegistry
|
|
if err := r.db.Where("owner_uid = ? AND star_id = ?", ownerUID, starID).
|
|
Order("created_at DESC").
|
|
Find(®istries).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return registries, nil
|
|
}
|
|
|
|
// GetByOwnerAndType 查询用户指定类型的索引记录
|
|
func (r *assetRegistryRepository) GetByOwnerAndType(ownerUID, starID int64, assetType string, limit, offset int) ([]*models.AssetRegistry, error) {
|
|
if ownerUID <= 0 {
|
|
return nil, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return nil, errors.New("star_id must be greater than 0")
|
|
}
|
|
var registries []*models.AssetRegistry
|
|
query := r.db.Where("owner_uid = ? AND star_id = ? AND asset_type = ?", ownerUID, starID, assetType).
|
|
Order("created_at DESC")
|
|
if limit > 0 {
|
|
query = query.Limit(limit)
|
|
}
|
|
if offset > 0 {
|
|
query = query.Offset(offset)
|
|
}
|
|
if err := query.Find(®istries).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return registries, nil
|
|
}
|
|
|
|
// GetByOwnerAndTypeAndGrade 查询用户指定类型和等级的索引记录
|
|
func (r *assetRegistryRepository) GetByOwnerAndTypeAndGrade(ownerUID, starID int64, assetType string, grade int32, limit, offset int) ([]*models.AssetRegistry, error) {
|
|
if ownerUID <= 0 {
|
|
return nil, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return nil, errors.New("star_id must be greater than 0")
|
|
}
|
|
var registries []*models.AssetRegistry
|
|
query := r.db.Where("owner_uid = ? AND star_id = ? AND asset_type = ? AND grade = ?", ownerUID, starID, assetType, grade).
|
|
Order("created_at DESC")
|
|
if limit > 0 {
|
|
query = query.Limit(limit)
|
|
}
|
|
if offset > 0 {
|
|
query = query.Offset(offset)
|
|
}
|
|
if err := query.Find(®istries).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return registries, nil
|
|
}
|
|
|
|
// GetByOwnerAndTypeAndCategory 查询用户指定类型和分类的索引记录
|
|
func (r *assetRegistryRepository) GetByOwnerAndTypeAndCategory(ownerUID, starID int64, assetType string, category string, limit, offset int) ([]*models.AssetRegistry, error) {
|
|
if ownerUID <= 0 {
|
|
return nil, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return nil, errors.New("star_id must be greater than 0")
|
|
}
|
|
var registries []*models.AssetRegistry
|
|
query := r.db.Where("owner_uid = ? AND star_id = ? AND asset_type = ? AND collection_category = ?", ownerUID, starID, assetType, category).
|
|
Order("created_at DESC")
|
|
if limit > 0 {
|
|
query = query.Limit(limit)
|
|
}
|
|
if offset > 0 {
|
|
query = query.Offset(offset)
|
|
}
|
|
if err := query.Find(®istries).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return registries, nil
|
|
}
|
|
|
|
// GetByOwnerAndTypeAndActivity 查询用户指定类型和活动的索引记录
|
|
func (r *assetRegistryRepository) GetByOwnerAndTypeAndActivity(ownerUID, starID int64, assetType string, activityID int64, limit, offset int) ([]*models.AssetRegistry, error) {
|
|
if ownerUID <= 0 {
|
|
return nil, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return nil, errors.New("star_id must be greater than 0")
|
|
}
|
|
var registries []*models.AssetRegistry
|
|
query := r.db.Where("owner_uid = ? AND star_id = ? AND asset_type = ? AND activity_id = ?", ownerUID, starID, assetType, activityID).
|
|
Order("created_at DESC")
|
|
if limit > 0 {
|
|
query = query.Limit(limit)
|
|
}
|
|
if offset > 0 {
|
|
query = query.Offset(offset)
|
|
}
|
|
if err := query.Find(®istries).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return registries, nil
|
|
}
|
|
|
|
// CountByOwner 统计用户的索引记录数量
|
|
func (r *assetRegistryRepository) CountByOwner(ownerUID, starID int64) (int64, error) {
|
|
if ownerUID <= 0 {
|
|
return 0, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return 0, errors.New("star_id must be greater than 0")
|
|
}
|
|
var count int64
|
|
if err := r.db.Model(&models.AssetRegistry{}).
|
|
Where("owner_uid = ? AND star_id = ?", ownerUID, starID).
|
|
Count(&count).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
// CountByOwnerAndType 统计用户指定类型的索引记录数量
|
|
func (r *assetRegistryRepository) CountByOwnerAndType(ownerUID, starID int64, assetType string) (int64, error) {
|
|
if ownerUID <= 0 {
|
|
return 0, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return 0, errors.New("star_id must be greater than 0")
|
|
}
|
|
var count int64
|
|
if err := r.db.Model(&models.AssetRegistry{}).
|
|
Where("owner_uid = ? AND star_id = ? AND asset_type = ?", ownerUID, starID, assetType).
|
|
Count(&count).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
// CountByOwnerAndTypeAndGrade 统计用户指定类型和等级的索引记录数量
|
|
func (r *assetRegistryRepository) CountByOwnerAndTypeAndGrade(ownerUID, starID int64, assetType string, grade int32) (int64, error) {
|
|
if ownerUID <= 0 {
|
|
return 0, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return 0, errors.New("star_id must be greater than 0")
|
|
}
|
|
var count int64
|
|
if err := r.db.Model(&models.AssetRegistry{}).
|
|
Where("owner_uid = ? AND star_id = ? AND asset_type = ? AND grade = ?", ownerUID, starID, assetType, grade).
|
|
Count(&count).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
// CountByOwnerAndTypeAndCategory 统计用户指定类型和分类的索引记录数量
|
|
func (r *assetRegistryRepository) CountByOwnerAndTypeAndCategory(ownerUID, starID int64, assetType string, category string) (int64, error) {
|
|
if ownerUID <= 0 {
|
|
return 0, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return 0, errors.New("star_id must be greater than 0")
|
|
}
|
|
var count int64
|
|
if err := r.db.Model(&models.AssetRegistry{}).
|
|
Where("owner_uid = ? AND star_id = ? AND asset_type = ? AND collection_category = ?", ownerUID, starID, assetType, category).
|
|
Count(&count).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
// CountByOwnerAndTypeAndActivity 统计用户指定类型和活动的索引记录数量
|
|
func (r *assetRegistryRepository) CountByOwnerAndTypeAndActivity(ownerUID, starID int64, assetType string, activityID int64) (int64, error) {
|
|
if ownerUID <= 0 {
|
|
return 0, errors.New("owner_uid must be greater than 0")
|
|
}
|
|
if starID <= 0 {
|
|
return 0, errors.New("star_id must be greater than 0")
|
|
}
|
|
var count int64
|
|
if err := r.db.Model(&models.AssetRegistry{}).
|
|
Where("owner_uid = ? AND star_id = ? AND asset_type = ? AND activity_id = ?", ownerUID, starID, assetType, activityID).
|
|
Count(&count).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
// UpdateLikeCount 更新点赞数
|
|
func (r *assetRegistryRepository) UpdateLikeCount(assetID int64, likeCount int32) error {
|
|
if assetID <= 0 {
|
|
return errors.New("asset_id must be greater than 0")
|
|
}
|
|
return r.db.Model(&models.AssetRegistry{}).
|
|
Where("asset_id = ?", assetID).
|
|
Update("like_count", likeCount).Error
|
|
}
|
|
|
|
// UpdateGrade 更新等级
|
|
func (r *assetRegistryRepository) UpdateGrade(assetID int64, grade int32) error {
|
|
if assetID <= 0 {
|
|
return errors.New("asset_id must be greater than 0")
|
|
}
|
|
return r.db.Model(&models.AssetRegistry{}).
|
|
Where("asset_id = ?", assetID).
|
|
Update("grade", grade).Error
|
|
}
|
|
|
|
// Delete 删除索引记录
|
|
func (r *assetRegistryRepository) Delete(assetID int64) error {
|
|
if assetID <= 0 {
|
|
return errors.New("asset_id must be greater than 0")
|
|
}
|
|
return r.db.Where("asset_id = ?", assetID).Delete(&models.AssetRegistry{}).Error
|
|
}
|
|
|
|
// DeleteByAssetType 删除指定类型的索引记录
|
|
func (r *assetRegistryRepository) DeleteByAssetType(assetType string, assetID int64) error {
|
|
if assetType == "" {
|
|
return errors.New("asset_type must not be empty")
|
|
}
|
|
if assetID <= 0 {
|
|
return errors.New("asset_id must be greater than 0")
|
|
}
|
|
return r.db.Where("asset_type = ? AND asset_id = ?", assetType, assetID).
|
|
Delete(&models.AssetRegistry{}).Error
|
|
}
|