Set up project files and add .gitignore to exclude local build/runtime artifacts. Made-with: Cursor
113 lines
3.2 KiB
Go
113 lines
3.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"carrot_bbs/internal/model"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// StickerRepository 自定义表情仓库接口
|
|
type StickerRepository interface {
|
|
// 获取用户的所有表情
|
|
GetByUserID(userID string) ([]model.UserSticker, error)
|
|
// 根据ID获取表情
|
|
GetByID(id string) (*model.UserSticker, error)
|
|
// 创建表情
|
|
Create(sticker *model.UserSticker) error
|
|
// 删除表情
|
|
Delete(id string) error
|
|
// 删除用户的所有表情
|
|
DeleteByUserID(userID string) error
|
|
// 检查表情是否存在
|
|
Exists(userID string, url string) (bool, error)
|
|
// 更新排序
|
|
UpdateSortOrder(id string, sortOrder int) error
|
|
// 批量更新排序
|
|
BatchUpdateSortOrder(userID string, orders map[string]int) error
|
|
// 获取用户表情数量
|
|
CountByUserID(userID string) (int64, error)
|
|
}
|
|
|
|
// stickerRepository 自定义表情仓库实现
|
|
type stickerRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewStickerRepository 创建自定义表情仓库
|
|
func NewStickerRepository(db *gorm.DB) StickerRepository {
|
|
return &stickerRepository{db: db}
|
|
}
|
|
|
|
// GetByUserID 获取用户的所有表情
|
|
func (r *stickerRepository) GetByUserID(userID string) ([]model.UserSticker, error) {
|
|
var stickers []model.UserSticker
|
|
err := r.db.Where("user_id = ?", userID).
|
|
Order("sort_order ASC, created_at DESC").
|
|
Find(&stickers).Error
|
|
return stickers, err
|
|
}
|
|
|
|
// GetByID 根据ID获取表情
|
|
func (r *stickerRepository) GetByID(id string) (*model.UserSticker, error) {
|
|
var sticker model.UserSticker
|
|
err := r.db.Where("id = ?", id).First(&sticker).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &sticker, nil
|
|
}
|
|
|
|
// Create 创建表情
|
|
func (r *stickerRepository) Create(sticker *model.UserSticker) error {
|
|
return r.db.Create(sticker).Error
|
|
}
|
|
|
|
// Delete 删除表情
|
|
func (r *stickerRepository) Delete(id string) error {
|
|
return r.db.Where("id = ?", id).Delete(&model.UserSticker{}).Error
|
|
}
|
|
|
|
// DeleteByUserID 删除用户的所有表情
|
|
func (r *stickerRepository) DeleteByUserID(userID string) error {
|
|
return r.db.Where("user_id = ?", userID).Delete(&model.UserSticker{}).Error
|
|
}
|
|
|
|
// Exists 检查表情是否存在
|
|
func (r *stickerRepository) Exists(userID string, url string) (bool, error) {
|
|
var count int64
|
|
err := r.db.Model(&model.UserSticker{}).
|
|
Where("user_id = ? AND url = ?", userID, url).
|
|
Count(&count).Error
|
|
return count > 0, err
|
|
}
|
|
|
|
// UpdateSortOrder 更新排序
|
|
func (r *stickerRepository) UpdateSortOrder(id string, sortOrder int) error {
|
|
return r.db.Model(&model.UserSticker{}).
|
|
Where("id = ?", id).
|
|
Update("sort_order", sortOrder).Error
|
|
}
|
|
|
|
// BatchUpdateSortOrder 批量更新排序
|
|
func (r *stickerRepository) BatchUpdateSortOrder(userID string, orders map[string]int) error {
|
|
return r.db.Transaction(func(tx *gorm.DB) error {
|
|
for id, sortOrder := range orders {
|
|
if err := tx.Model(&model.UserSticker{}).
|
|
Where("id = ? AND user_id = ?", id, userID).
|
|
Update("sort_order", sortOrder).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
// CountByUserID 获取用户表情数量
|
|
func (r *stickerRepository) CountByUserID(userID string) (int64, error) {
|
|
var count int64
|
|
err := r.db.Model(&model.UserSticker{}).
|
|
Where("user_id = ?", userID).
|
|
Count(&count).Error
|
|
return count, err
|
|
}
|