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 }