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
|
||
})
|
||
}
|