package repository import ( "carrotskin/internal/model" "context" "errors" "fmt" "gorm.io/gorm" ) // profileRepository ProfileRepository的实现 type profileRepository struct { db *gorm.DB } // NewProfileRepository 创建ProfileRepository实例 func NewProfileRepository(db *gorm.DB) ProfileRepository { return &profileRepository{db: db} } func (r *profileRepository) Create(ctx context.Context, profile *model.Profile) error { return r.db.WithContext(ctx).Create(profile).Error } func (r *profileRepository) FindByUUID(ctx context.Context, uuid string) (*model.Profile, error) { var profile model.Profile err := r.db.WithContext(ctx).Where("uuid = ?", uuid). Preload("Skin"). Preload("Cape"). First(&profile).Error if err != nil { return nil, err } return &profile, nil } func (r *profileRepository) FindByName(ctx context.Context, name string) (*model.Profile, error) { var profile model.Profile // 使用 LOWER 函数进行不区分大小写的查询,并预加载 Skin 和 Cape err := r.db.WithContext(ctx).Where("LOWER(name) = LOWER(?)", name). Preload("Skin"). Preload("Cape"). First(&profile).Error if err != nil { return nil, err } return &profile, nil } func (r *profileRepository) FindByUserID(ctx context.Context, userID int64) ([]*model.Profile, error) { var profiles []*model.Profile err := r.db.WithContext(ctx).Where("user_id = ?", userID). Preload("Skin"). Preload("Cape"). Order("created_at DESC"). Find(&profiles).Error return profiles, err } func (r *profileRepository) FindByUUIDs(ctx context.Context, uuids []string) ([]*model.Profile, error) { if len(uuids) == 0 { return []*model.Profile{}, nil } var profiles []*model.Profile // 使用 IN 查询优化批量查询,并预加载关联 err := r.db.WithContext(ctx).Where("uuid IN ?", uuids). Preload("Skin"). Preload("Cape"). Find(&profiles).Error return profiles, err } func (r *profileRepository) Update(ctx context.Context, profile *model.Profile) error { return r.db.WithContext(ctx).Save(profile).Error } func (r *profileRepository) UpdateFields(ctx context.Context, uuid string, updates map[string]interface{}) error { return r.db.WithContext(ctx).Model(&model.Profile{}). Where("uuid = ?", uuid). Updates(updates).Error } func (r *profileRepository) Delete(ctx context.Context, uuid string) error { return r.db.WithContext(ctx).Where("uuid = ?", uuid).Delete(&model.Profile{}).Error } func (r *profileRepository) BatchUpdate(ctx context.Context, uuids []string, updates map[string]interface{}) (int64, error) { if len(uuids) == 0 { return 0, nil } result := r.db.WithContext(ctx).Model(&model.Profile{}).Where("uuid IN ?", uuids).Updates(updates) return result.RowsAffected, result.Error } func (r *profileRepository) BatchDelete(ctx context.Context, uuids []string) (int64, error) { if len(uuids) == 0 { return 0, nil } result := r.db.WithContext(ctx).Where("uuid IN ?", uuids).Delete(&model.Profile{}) return result.RowsAffected, result.Error } func (r *profileRepository) CountByUserID(ctx context.Context, userID int64) (int64, error) { var count int64 err := r.db.WithContext(ctx).Model(&model.Profile{}). Where("user_id = ?", userID). Count(&count).Error return count, err } func (r *profileRepository) SetActive(ctx context.Context, uuid string, userID int64) error { return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { if err := tx.Model(&model.Profile{}). Where("user_id = ?", userID). Update("is_active", false).Error; err != nil { return err } return tx.Model(&model.Profile{}). Where("uuid = ? AND user_id = ?", uuid, userID). Update("is_active", true).Error }) } func (r *profileRepository) UpdateLastUsedAt(ctx context.Context, uuid string) error { return r.db.WithContext(ctx).Model(&model.Profile{}). Where("uuid = ?", uuid). Update("last_used_at", gorm.Expr("CURRENT_TIMESTAMP")).Error } func (r *profileRepository) GetByNames(ctx context.Context, names []string) ([]*model.Profile, error) { var profiles []*model.Profile err := r.db.WithContext(ctx).Where("name in (?)", names). Preload("Skin"). Preload("Cape"). Find(&profiles).Error return profiles, err } func (r *profileRepository) GetKeyPair(ctx context.Context, profileId string) (*model.KeyPair, error) { if profileId == "" { return nil, errors.New("参数不能为空") } var profile model.Profile result := r.db.WithContext(ctx). Select("key_pair"). Where("id = ?", profileId). First(&profile) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, errors.New("key pair未找到") } return nil, fmt.Errorf("获取key pair失败: %w", result.Error) } return &model.KeyPair{}, nil } func (r *profileRepository) UpdateKeyPair(ctx context.Context, profileId string, keyPair *model.KeyPair) error { if profileId == "" { return errors.New("profileId 不能为空") } if keyPair == nil { return errors.New("keyPair 不能为 nil") } return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { result := tx.Table("profiles"). Where("id = ?", profileId). UpdateColumns(map[string]interface{}{ "private_key": keyPair.PrivateKey, "public_key": keyPair.PublicKey, }) if result.Error != nil { return fmt.Errorf("更新 keyPair 失败: %w", result.Error) } return nil }) }