yjp пре 1 година
родитељ
комит
f80a2fba5a

+ 20 - 14
convenient/entity/service.go

@@ -154,32 +154,36 @@ type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, c
 
 func Query[O any](tableName string, callbacks *Callbacks[response.InfosData[O]], conditionFieldCallback ConditionFieldCallback) binding.ServiceFunc[response.InfosData[O]] {
 	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[O], error) {
+		errResponse := response.InfosData[O]{
+			Infos: make([]O, 0),
+		}
+
 		if params == nil {
-			return response.InfosData[O]{}, fserr.New("请求参数为空")
+			return errResponse, fserr.New("请求参数为空")
 		}
 
 		object := objects[0]
 		if object == nil {
-			return response.InfosData[O]{}, fserr.New("领域实体为空")
+			return errResponse, fserr.New("领域实体为空")
 		}
 
 		dbExecutor := i.DBExecutor()
 
 		queryParams, ok := params.(request.Query)
 		if !ok {
-			return response.InfosData[O]{}, fserr.New("请求参数不是Query接口")
+			return errResponse, fserr.New("请求参数不是Query接口")
 		}
 
 		e, ok := objects[0].(domain.Entity)
 		if !ok {
-			return response.InfosData[O]{}, fserr.New("需要传递领域对象应该为实体")
+			return errResponse, fserr.New("需要传递领域对象应该为实体")
 		}
 
 		conditions := sql.NewConditions()
 
 		fields, err := sql_mapping.DefaultUsage(e)
 		if err != nil {
-			return response.InfosData[O]{}, err
+			return errResponse, err
 		}
 
 		for _, field := range fields {
@@ -198,7 +202,7 @@ func Query[O any](tableName string, callbacks *Callbacks[response.InfosData[O]],
 
 		err = callbackBeforeDBOperate(callbacks, e, i, dbExecutor)
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, e, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, e, err, i, errResponse)
 		}
 
 		results, totalCount, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
@@ -208,18 +212,18 @@ func Query[O any](tableName string, callbacks *Callbacks[response.InfosData[O]],
 			PageSize:   queryParams.GetPageSize(),
 		})
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, e, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, e, err, i, errResponse)
 		}
 
 		err = callbackAfterDBOperate(callbacks, e, i, dbExecutor)
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, e, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, e, err, i, errResponse)
 		}
 
 		infos := make([]O, 0)
 		err = sql.ParseSqlResult(results, &infos)
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, e, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, e, err, i, errResponse)
 		}
 
 		output := response.InfosData[O]{
@@ -236,6 +240,13 @@ func GetByID[O any](tableName string, callbacks *Callbacks[O]) binding.ServiceFu
 	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (O, error) {
 		var outputZero O
 
+		outputZeroValue := reflect.New(reflect.TypeOf(outputZero)).Elem()
+		if outputZeroValue.Kind() == reflect.Pointer {
+			outputZeroValue.Set(reflect.New(outputZeroValue.Type().Elem()))
+		}
+
+		outputZero = outputZeroValue.Interface().(O)
+
 		object := objects[0]
 		if object == nil {
 			return outputZero, fserr.New("领域实体为空")
@@ -243,11 +254,6 @@ func GetByID[O any](tableName string, callbacks *Callbacks[O]) binding.ServiceFu
 
 		dbExecutor := i.DBExecutor()
 
-		outputZeroValue := reflect.Zero(reflect.TypeOf(outputZero))
-		if outputZeroValue.Kind() == reflect.Pointer {
-			outputZeroValue.Set(reflect.New(outputZeroValue.Type().Elem()))
-		}
-
 		e, ok := objects[0].(domain.Entity)
 		if !ok {
 			return outputZero, fserr.New("需要传递领域对象应该为实体")

+ 68 - 4
convenient/relation/one2one/service.go

@@ -21,6 +21,8 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 			return nil, fserr.New("领域实体为空")
 		}
 
+		dbExecutor := i.DBExecutor()
+
 		fromEntity, ok := object.(domain.Entity)
 		if !ok {
 			return nil, fserr.New("领域对象不是实体")
@@ -37,7 +39,7 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 		}
 
 		// from存在性校验
-		fromResult, err := database.QueryOne(i.DBExecutor(), &sql.QueryOneExecuteParams{
+		fromResult, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
 			TableName:  fromTableName,
 			Conditions: sql.NewConditions().Equal(domain.ColumnID, fromEntity.GetID()),
 		})
@@ -67,7 +69,7 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 
 		if strutils.IsStringNotEmpty(newToID) {
 			// to存在性校验
-			toExist, err := database.CheckExist(i.DBExecutor(), &sql.CheckExistExecuteParams{
+			toExist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
 				TableName:  toTableName,
 				Conditions: sql.NewConditions().Equal(domain.ColumnID, newToID),
 			})
@@ -80,7 +82,7 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 			}
 		}
 
-		err = database.Transaction(i.DBExecutor(), func(tx database.Executor) error {
+		err = database.Transaction(dbExecutor, func(tx database.Executor) error {
 			if strutils.IsStringNotEmpty(fromTableName) {
 				err := database.Update(tx, &sql.UpdateExecuteParams{
 					TableName:  fromTableName,
@@ -124,9 +126,71 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 	}
 }
 
-func Query[TI any](tableName string) binding.ServiceFunc[TI] {
+func Query[TI any](fromTableName string, toTableName string, toRelationColumnName string) binding.ServiceFunc[TI] {
 	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (TI, error) {
+		var outputZero TI
+
+		outputZeroValue := reflect.New(reflect.TypeOf(outputZero)).Elem()
+		if outputZeroValue.Kind() == reflect.Pointer {
+			outputZeroValue.Set(reflect.New(outputZeroValue.Type().Elem()))
+		}
+
+		outputZero = outputZeroValue.Interface().(TI)
+
+		dbExecutor := i.DBExecutor()
+
+		object := objects[0]
+		if object == nil {
+			return outputZero, fserr.New("领域实体为空")
+		}
+
+		fromEntity, ok := object.(domain.Entity)
+		if !ok {
+			return outputZero, fserr.New("领域对象不是实体")
+		}
+
+		// from存在性校验
+		fromResult, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
+			TableName:  fromTableName,
+			Conditions: sql.NewConditions().Equal(domain.ColumnID, fromEntity.GetID()),
+		})
+		if err != nil {
+			if database.IsErrorDBRecordNotExist(err) {
+				return outputZero, fserr.New(fromEntity.DomainCNName() + "不存在")
+			}
+
+			return outputZero, err
+		}
+
+		existFrom := reflect.New(reflect.TypeOf(object).Elem()).Interface()
+		err = sql.ParseSqlResult(fromResult, existFrom)
+		if err != nil {
+			return outputZero, err
+		}
+
+		existFromEntity := existFrom.(domain.Entity)
+
+		toResult, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
+			TableName:  toTableName,
+			Conditions: sql.NewConditions().Equal(toRelationColumnName, existFromEntity.GetID()),
+		})
+		if err != nil {
+			return outputZero, err
+		}
+
 		var info TI
+		var infoPointer any
+
+		infoPointer = &info
+		if outputZeroValue.Kind() == reflect.Pointer {
+			infoPointer = info
+		}
+
+		err = sql.ParseSqlResult(toResult, infoPointer)
+		if err != nil {
+			return outputZero, err
+		}
+
 		return info, nil
 	}
 }

+ 22 - 0
convenient/relation/one2one/simple.go

@@ -73,6 +73,17 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 					simple.RightTableName, simple.Right.DomainCNName(), rightRelationColumnName),
 			})
 		}
+
+		if !options.disableLeftQuery {
+			// 左到右查询
+			binding.GetBind(binder, &binding.SimpleBindItem[RI]{
+				Path:          simple.LeftDomainPath + simple.RightDomainPath + "/query",
+				ResponseFunc:  response.SendInfoResponse[RI],
+				RequestParams: simple.LeftQueryQueryParams,
+				Objects:       []domain.Object{simple.Left},
+				ServiceFunc:   Query[RI](simple.LeftTableName, simple.RightTableName, rightRelationColumnName),
+			})
+		}
 	}
 
 	if !options.disableRight {
@@ -87,6 +98,17 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 					simple.LeftTableName, simple.Left.DomainCNName(), leftRelationColumnName),
 			})
 		}
+
+		if !options.disableRightQuery {
+			// 右到左查询
+			binding.GetBind(binder, &binding.SimpleBindItem[RI]{
+				Path:          simple.RightDomainPath + simple.LeftDomainPath + "/query",
+				ResponseFunc:  response.SendInfoResponse[RI],
+				RequestParams: simple.RightQueryQueryParams,
+				Objects:       []domain.Object{simple.Right},
+				ServiceFunc:   Query[RI](simple.RightTableName, simple.LeftTableName, leftRelationColumnName),
+			})
+		}
 	}
 
 }

+ 13 - 9
convenient/value_object/service.go

@@ -98,32 +98,36 @@ type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, c
 
 func Query[O any](tableName string, callbacks *Callbacks[response.InfosData[O]], conditionFieldCallback ConditionFieldCallback) binding.ServiceFunc[response.InfosData[O]] {
 	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[O], error) {
+		errResponse := response.InfosData[O]{
+			Infos: make([]O, 0),
+		}
+
 		if params == nil {
-			return response.InfosData[O]{}, fserr.New("请求参数为空")
+			return errResponse, fserr.New("请求参数为空")
 		}
 
 		object := objects[0]
 		if object == nil {
-			return response.InfosData[O]{}, fserr.New("领域实体为空")
+			return errResponse, fserr.New("领域实体为空")
 		}
 
 		dbExecutor := i.DBExecutor()
 
 		queryParams, ok := params.(request.Query)
 		if !ok {
-			return response.InfosData[O]{}, fserr.New("请求参数不是Query接口")
+			return errResponse, fserr.New("请求参数不是Query接口")
 		}
 
 		valueObject, ok := objects[0].(domain.ValueObject)
 		if !ok {
-			return response.InfosData[O]{}, fserr.New("需要传递领域对象应该为值对象")
+			return errResponse, fserr.New("需要传递领域对象应该为值对象")
 		}
 
 		conditions := sql.NewConditions()
 
 		fields, err := sql_mapping.DefaultUsage(valueObject)
 		if err != nil {
-			return response.InfosData[O]{}, err
+			return errResponse, err
 		}
 
 		for _, field := range fields {
@@ -142,7 +146,7 @@ func Query[O any](tableName string, callbacks *Callbacks[response.InfosData[O]],
 
 		err = callbackBeforeDBOperate(callbacks, valueObject, i, dbExecutor)
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, valueObject, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, valueObject, err, i, errResponse)
 		}
 
 		results, totalCount, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
@@ -152,18 +156,18 @@ func Query[O any](tableName string, callbacks *Callbacks[response.InfosData[O]],
 			PageSize:   queryParams.GetPageSize(),
 		})
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, valueObject, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, valueObject, err, i, errResponse)
 		}
 
 		err = callbackAfterDBOperate(callbacks, valueObject, i, dbExecutor)
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, valueObject, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, valueObject, err, i, errResponse)
 		}
 
 		infos := make([]O, 0)
 		err = sql.ParseSqlResult(results, &infos)
 		if err != nil {
-			return callbackOnErrorReturn(callbacks, valueObject, err, i, response.InfosData[O]{})
+			return callbackOnErrorReturn(callbacks, valueObject, err, i, errResponse)
 		}
 
 		output := response.InfosData[O]{

+ 1 - 1
examples/examples/project/application/service/student.go

@@ -20,7 +20,7 @@ func (app *Student) Destroy() error {
 func (app *Student) v1(appInstance *application.App) {
 	v1Binder := appInstance.Binder(application.RouterPrefix, "v1")
 
-	entity.BindSimple[student.Info](v1Binder, &entity.Simple[student.Info]{
+	entity.BindSimple[*student.Info](v1Binder, &entity.Simple[*student.Info]{
 		Entity:             &student.Entity{},
 		TableName:          student.TableName,
 		DomainPath:         student.DomainPath,

+ 2 - 2
examples/examples/project/main.go

@@ -37,11 +37,11 @@ import (
 
 // Student-Family
 // curl -X POST -H "Content-Type: application/json" -d '{"id":"fc3e96926aac46268ae783c4ad675d43", "familyId": "ed86bbb59a80429eb654d7f9f13ff116"}' "http://localhost:31000/example/v1/student/family/update"
-// curl -X GET "http://localhost:31000/example/v1/example/v1/student/family/query?id="
+// curl -X GET "http://localhost:31000/example/v1/student/family/query?id=fc3e96926aac46268ae783c4ad675d43"
 
 // Family-Student
 // curl -X POST -H "Content-Type: application/json" -d '{"id":"ed86bbb59a80429eb654d7f9f13ff116", "studentId": "fc3e96926aac46268ae783c4ad675d43"}' "http://localhost:31000/example/v1/family/student/update"
-// curl -X GET "http://localhost:31000/example/v1/example/v1/family/student/query?id="
+// curl -X GET "http://localhost:31000/example/v1/family/student/query?id=ed86bbb59a80429eb654d7f9f13ff116"
 
 func main() {
 	application.NewApp()