Files
user-system/internal/repository/custom_field.go

151 lines
5.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
})
}