fix(schema): check the hook function parameter type (#7468)
* fix(schema): Check the callback function parameter type * fix log * fix
This commit is contained in:
		
							parent
							
								
									985940f0d8
								
							
						
					
					
						commit
						b9c7e562b0
					
				| @ -5,6 +5,7 @@ import ( | |||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"go/ast" | 	"go/ast" | ||||||
|  | 	"path" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| @ -313,8 +314,14 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam | |||||||
| 	for _, cbName := range callbackTypes { | 	for _, cbName := range callbackTypes { | ||||||
| 		if methodValue := callBackToMethodValue(modelValue, cbName); methodValue.IsValid() { | 		if methodValue := callBackToMethodValue(modelValue, cbName); methodValue.IsValid() { | ||||||
| 			switch methodValue.Type().String() { | 			switch methodValue.Type().String() { | ||||||
| 			case "func(*gorm.DB) error": // TODO hack
 | 			case "func(*gorm.DB) error": | ||||||
| 				reflect.Indirect(reflect.ValueOf(schema)).FieldByName(string(cbName)).SetBool(true) | 				expectedPkgPath := path.Dir(reflect.TypeOf(schema).Elem().PkgPath()) | ||||||
|  | 				if inVarPkg := methodValue.Type().In(0).Elem().PkgPath(); inVarPkg == expectedPkgPath { | ||||||
|  | 					reflect.Indirect(reflect.ValueOf(schema)).FieldByName(string(cbName)).SetBool(true) | ||||||
|  | 				} else { | ||||||
|  | 					logger.Default.Warn(context.Background(), "In model %v, the hook function `%v(*gorm.DB) error` has an incorrect parameter type. The expected parameter type is `%v`, but the provided type is `%v`.", schema, cbName, expectedPkgPath, inVarPkg) | ||||||
|  | 					// PASS
 | ||||||
|  | 				} | ||||||
| 			default: | 			default: | ||||||
| 				logger.Default.Warn(context.Background(), "Model %v don't match %vInterface, should be `%v(*gorm.DB) error`. Please see https://gorm.io/docs/hooks.html", schema, cbName, cbName) | 				logger.Default.Warn(context.Background(), "Model %v don't match %vInterface, should be `%v(*gorm.DB) error`. Please see https://gorm.io/docs/hooks.html", schema, cbName, cbName) | ||||||
| 			} | 			} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 jc
						jc