Browse Source

阶段提交

yjp 1 year ago
parent
commit
bf1d0c1fa1

+ 4 - 1
convenient/domain/auth/auth.go

@@ -13,13 +13,16 @@ import (
 type Simple struct {
 	// schema
 	Schema string
+
+	// AES加密用到的Key
+	AESKey string
 }
 
 func (simple *Simple) bind(binder *binding.Binder) {
 	(&permission.Simple{Schema: simple.Schema}).Bind(binder)
 	(&permission_group.Simple{Schema: simple.Schema}).Bind(binder)
 	(&role.Simple{Schema: simple.Schema}).Bind(binder)
-	(&user.Simple{Schema: simple.Schema}).Bind(binder)
+	(&user.Simple{Schema: simple.Schema, AESKey: simple.AESKey}).Bind(binder)
 	(&relations.Simple{Schema: simple.Schema}).Bind(binder)
 
 	// TODO Challenge

+ 147 - 1
convenient/domain/auth/user/api.go

@@ -3,12 +3,23 @@ package user
 import (
 	"git.sxidc.com/go-framework/baize/convenient/entity_crud"
 	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure/database"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure/database/sql"
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/encoding"
+	"git.sxidc.com/go-tools/utils/strutils"
 )
 
 // Simple Bind参数
 type Simple struct {
 	// schema
 	Schema string
+
+	// AES加密用到的Key
+	AESKey string
 }
 
 func (simple *Simple) Bind(binder *binding.Binder) {
@@ -21,5 +32,140 @@ func (simple *Simple) Bind(binder *binding.Binder) {
 		UpdateJsonBody:     &UpdateUserJsonBody{},
 		QueryQueryParams:   &GetUsersQueryParams{},
 		GetByIDQueryParams: &GetUserQueryParams{},
-	})
+	}, entity_crud.WithCreateCallbacks(&entity_crud.CreateCallbacks{
+		Before: func(e entity.Entity, prepared map[string]any, i *infrastructure.Infrastructure, tx database.Executor) error {
+			userEntity, err := domain.ToConcrete[*Entity](e)
+			if err != nil {
+				return err
+			}
+
+			encryptedPassword, err := encoding.AESEncrypt(userEntity.Password, simple.AESKey)
+			if err != nil {
+				return err
+			}
+
+			userEntity.Password = encryptedPassword
+
+			if strutils.IsStringEmpty(userEntity.Name) {
+				userEntity.Name = "匿名-" + strutils.SimpleUUID()[0:8]
+			}
+
+			encryptedPhone, err := encoding.AESEncrypt(userEntity.Phone, simple.AESKey)
+			if err != nil {
+				return err
+			}
+
+			userEntity.Phone = encryptedPhone
+
+			encryptedEmail, err := encoding.AESEncrypt(userEntity.Email, simple.AESKey)
+			if err != nil {
+				return err
+			}
+
+			userEntity.Email = encryptedEmail
+
+			checkResult := check.Struct(userEntity, fieldMap)
+
+			err = domain.CheckField(checkResult, userEntity.DomainCNName(), FieldPassword)
+			if err != nil {
+				return err
+			}
+
+			err = domain.CheckField(checkResult, userEntity.DomainCNName(), FieldName)
+			if err != nil {
+				return err
+			}
+
+			err = domain.CheckField(checkResult, userEntity.DomainCNName(), FieldPhone)
+			if err != nil {
+				return err
+			}
+
+			err = domain.CheckField(checkResult, userEntity.DomainCNName(), FieldEmail)
+			if err != nil {
+				return err
+			}
+
+			return nil
+		},
+	}), entity_crud.WithUpdateCallbacks(&entity_crud.UpdateCallbacks{
+		Before: func(e entity.Entity, prepared map[string]any, i *infrastructure.Infrastructure, tx database.Executor) error {
+			userEntity, err := domain.ToConcrete[*Entity](e)
+			if err != nil {
+				return err
+			}
+
+			if strutils.IsStringNotEmpty(userEntity.Password) {
+				encryptedPassword, err := encoding.AESEncrypt(userEntity.Password, simple.AESKey)
+				if err != nil {
+					return err
+				}
+
+				userEntity.Password = encryptedPassword
+			}
+
+			if strutils.IsStringEmpty(userEntity.Name) {
+				userEntity.Name = "匿名-" + strutils.SimpleUUID()[0:8]
+			}
+
+			if strutils.IsStringNotEmpty(userEntity.Phone) {
+				encryptedPhone, err := encoding.AESEncrypt(userEntity.Phone, simple.AESKey)
+				if err != nil {
+					return err
+				}
+
+				userEntity.Phone = encryptedPhone
+			}
+
+			if strutils.IsStringNotEmpty(userEntity.Email) {
+				encryptedEmail, err := encoding.AESEncrypt(userEntity.Email, simple.AESKey)
+				if err != nil {
+					return err
+				}
+
+				userEntity.Email = encryptedEmail
+			}
+
+			checkResult := check.Struct(userEntity, fieldMap)
+
+			if strutils.IsStringNotEmpty(userEntity.Password) {
+				err := domain.CheckField(checkResult, e.DomainCNName(), FieldPassword)
+				if err != nil {
+					return err
+				}
+			}
+
+			if strutils.IsStringNotEmpty(userEntity.Name) {
+				err := domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+				if err != nil {
+					return err
+				}
+			}
+
+			if strutils.IsStringNotEmpty(userEntity.Phone) {
+				err := domain.CheckField(checkResult, e.DomainCNName(), FieldPhone)
+				if err != nil {
+					return err
+				}
+			}
+
+			if strutils.IsStringNotEmpty(userEntity.Email) {
+				err := domain.CheckField(checkResult, e.DomainCNName(), FieldEmail)
+				if err != nil {
+					return err
+				}
+			}
+
+			return nil
+		},
+	}), entity_crud.WithQueryConditionFieldCallback[Info](func(conditions *sql.Conditions, fieldName string, columnName string, value any) (hasDeal bool) {
+		switch fieldName {
+		case FieldPassword:
+		case FieldName:
+		case FieldPhone:
+		case FieldEmail:
+		default:
+			return false
+		}
+	}))
 }

+ 5 - 43
convenient/domain/auth/user/entity.go

@@ -40,9 +40,9 @@ type Entity struct {
 	entity.Base
 	UserName      string    `sqlmapping:"column:user_name;notUpdate" sqlresult:"column:user_name" check:"required,lte=256"`
 	Password      string    `sqlmapping:"column:password" sqlresult:"column:password" check:"required,lte=256"`
-	Name          string    `sqlmapping:"column:name" sqlresult:"column:name" check:"lte=256"`
-	Phone         string    `sqlmapping:"column:phone" sqlresult:"column:phone" check:"lte=128"`
-	Email         string    `sqlmapping:"column:email" sqlresult:"column:email" check:"lte=512"`
+	Name          string    `sqlmapping:"column:name;updateClear" sqlresult:"column:name" check:"lte=256"`
+	Phone         string    `sqlmapping:"column:phone;updateClear" sqlresult:"column:phone" check:"lte=128"`
+	Email         string    `sqlmapping:"column:email;updateClear" sqlresult:"column:email" check:"lte=512"`
 	Token         string    `sqlmapping:"column:token;notUpdate" sqlresult:"column:token"`
 	LastLoginTime time.Time `sqlmapping:"column:last_login_time;notUpdate" sqlresult:"column:last_login_time" check:"required,timezero"`
 
@@ -72,16 +72,6 @@ func (e *Entity) ForCreate() error {
 		return err
 	}
 
-	err = domain.CheckField(checkResult, e.DomainCNName(), FieldPassword)
-	if err != nil {
-		return err
-	}
-
-	err = domain.CheckField(checkResult, e.DomainCNName(), FieldName)
-	if err != nil {
-		return err
-	}
-
 	err = domain.CheckField(checkResult, e.DomainCNName(), FieldLastLoginTime)
 	if err != nil {
 		return err
@@ -109,7 +99,7 @@ func (e *Entity) ForUpdate() error {
 		return err
 	}
 
-	err = e.checkUpdateFields(checkResult)
+	err = e.checkUpdateFields()
 	if err != nil {
 		return err
 	}
@@ -117,38 +107,10 @@ func (e *Entity) ForUpdate() error {
 	return nil
 }
 
-func (e *Entity) checkUpdateFields(checkResult check.Result) error {
+func (e *Entity) checkUpdateFields() error {
 	if strutils.AllBlank(e.Password) && e.LastLoginTime.IsZero() {
 		return errors.New(e.DomainCNName() + "没有传递需要更新的字段")
 	}
 
-	if strutils.IsStringNotEmpty(e.Password) {
-		err := domain.CheckField(checkResult, e.DomainCNName(), FieldPassword)
-		if err != nil {
-			return err
-		}
-	}
-
-	if strutils.IsStringNotEmpty(e.Name) {
-		err := domain.CheckField(checkResult, e.DomainCNName(), FieldName)
-		if err != nil {
-			return err
-		}
-	}
-
-	if strutils.IsStringNotEmpty(e.Phone) {
-		err := domain.CheckField(checkResult, e.DomainCNName(), FieldPhone)
-		if err != nil {
-			return err
-		}
-	}
-
-	if strutils.IsStringNotEmpty(e.Email) {
-		err := domain.CheckField(checkResult, e.DomainCNName(), FieldEmail)
-		if err != nil {
-			return err
-		}
-	}
-
 	return nil
 }