151 lines
5.0 KiB
Go
151 lines
5.0 KiB
Go
|
|
package repository
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
|
|||
|
|
"gorm.io/gorm"
|
|||
|
|
|
|||
|
|
"github.com/user-management-system/internal/domain"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// CustomFieldRepository 自定义字段数据访问层
|
|||
|
|
type CustomFieldRepository struct {
|
|||
|
|
db *gorm.DB
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewCustomFieldRepository 创建自定义字段数据访问层
|
|||
|
|
func NewCustomFieldRepository(db *gorm.DB) *CustomFieldRepository {
|
|||
|
|
return &CustomFieldRepository{db: db}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Create 创建自定义字段
|
|||
|
|
func (r *CustomFieldRepository) Create(ctx context.Context, field *domain.CustomField) error {
|
|||
|
|
return r.db.WithContext(ctx).Create(field).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Update 更新自定义字段
|
|||
|
|
func (r *CustomFieldRepository) Update(ctx context.Context, field *domain.CustomField) error {
|
|||
|
|
return r.db.WithContext(ctx).Save(field).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Delete 删除自定义字段
|
|||
|
|
func (r *CustomFieldRepository) Delete(ctx context.Context, id int64) error {
|
|||
|
|
return r.db.WithContext(ctx).Delete(&domain.CustomField{}, id).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByID 根据ID获取自定义字段
|
|||
|
|
func (r *CustomFieldRepository) GetByID(ctx context.Context, id int64) (*domain.CustomField, error) {
|
|||
|
|
var field domain.CustomField
|
|||
|
|
err := r.db.WithContext(ctx).First(&field, id).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return &field, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByFieldKey 根据FieldKey获取自定义字段
|
|||
|
|
func (r *CustomFieldRepository) GetByFieldKey(ctx context.Context, fieldKey string) (*domain.CustomField, error) {
|
|||
|
|
var field domain.CustomField
|
|||
|
|
err := r.db.WithContext(ctx).Where("field_key = ?", fieldKey).First(&field).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return &field, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// List 获取所有启用的自定义字段
|
|||
|
|
func (r *CustomFieldRepository) List(ctx context.Context) ([]*domain.CustomField, error) {
|
|||
|
|
var fields []*domain.CustomField
|
|||
|
|
err := r.db.WithContext(ctx).Where("status = ?", 1).Order("sort ASC").Find(&fields).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return fields, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ListAll 获取所有自定义字段
|
|||
|
|
func (r *CustomFieldRepository) ListAll(ctx context.Context) ([]*domain.CustomField, error) {
|
|||
|
|
var fields []*domain.CustomField
|
|||
|
|
err := r.db.WithContext(ctx).Order("sort ASC").Find(&fields).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return fields, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserCustomFieldValueRepository 用户自定义字段值数据访问层
|
|||
|
|
type UserCustomFieldValueRepository struct {
|
|||
|
|
db *gorm.DB
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewUserCustomFieldValueRepository 创建用户自定义字段值数据访问层
|
|||
|
|
func NewUserCustomFieldValueRepository(db *gorm.DB) *UserCustomFieldValueRepository {
|
|||
|
|
return &UserCustomFieldValueRepository{db: db}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Set 为用户设置自定义字段值(upsert)
|
|||
|
|
func (r *UserCustomFieldValueRepository) Set(ctx context.Context, userID int64, fieldID int64, fieldKey, value string) error {
|
|||
|
|
return r.db.WithContext(ctx).Exec(`
|
|||
|
|
INSERT INTO user_custom_field_values (user_id, field_id, field_key, value, created_at, updated_at)
|
|||
|
|
VALUES (?, ?, ?, ?, NOW(), NOW())
|
|||
|
|
ON CONFLICT(user_id, field_id) DO UPDATE SET value = ?, updated_at = NOW()
|
|||
|
|
`, userID, fieldID, fieldKey, value, value).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByUserID 获取用户的所有自定义字段值
|
|||
|
|
func (r *UserCustomFieldValueRepository) GetByUserID(ctx context.Context, userID int64) ([]*domain.UserCustomFieldValue, error) {
|
|||
|
|
var values []*domain.UserCustomFieldValue
|
|||
|
|
err := r.db.WithContext(ctx).Where("user_id = ?", userID).Find(&values).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return values, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByUserIDAndFieldKey 获取用户指定字段的值
|
|||
|
|
func (r *UserCustomFieldValueRepository) GetByUserIDAndFieldKey(ctx context.Context, userID int64, fieldKey string) (*domain.UserCustomFieldValue, error) {
|
|||
|
|
var value domain.UserCustomFieldValue
|
|||
|
|
err := r.db.WithContext(ctx).Where("user_id = ? AND field_key = ?", userID, fieldKey).First(&value).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return &value, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Delete 删除用户的自定义字段值
|
|||
|
|
func (r *UserCustomFieldValueRepository) Delete(ctx context.Context, userID int64, fieldID int64) error {
|
|||
|
|
return r.db.WithContext(ctx).Where("user_id = ? AND field_id = ?", userID, fieldID).Delete(&domain.UserCustomFieldValue{}).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DeleteByUserID 删除用户的所有自定义字段值
|
|||
|
|
func (r *UserCustomFieldValueRepository) DeleteByUserID(ctx context.Context, userID int64) error {
|
|||
|
|
return r.db.WithContext(ctx).Where("user_id = ?", userID).Delete(&domain.UserCustomFieldValue{}).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// BatchSet 批量设置用户的自定义字段值
|
|||
|
|
func (r *UserCustomFieldValueRepository) BatchSet(ctx context.Context, userID int64, values map[string]string) error {
|
|||
|
|
if len(values) == 0 {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
|||
|
|
for fieldKey, value := range values {
|
|||
|
|
if err := tx.Exec(`
|
|||
|
|
INSERT INTO user_custom_field_values (user_id, field_id, field_key, value, created_at, updated_at)
|
|||
|
|
VALUES (
|
|||
|
|
?,
|
|||
|
|
(SELECT id FROM custom_fields WHERE field_key = ? LIMIT 1),
|
|||
|
|
?,
|
|||
|
|
?,
|
|||
|
|
NOW(),
|
|||
|
|
NOW()
|
|||
|
|
)
|
|||
|
|
ON CONFLICT(user_id, field_id) DO UPDATE SET value = ?, updated_at = NOW()
|
|||
|
|
`, userID, fieldKey, fieldKey, value, value).Error; err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
})
|
|||
|
|
}
|