Ver Fonte

添加crud自定义查询条件回调

yjp há 1 ano atrás
pai
commit
88ad2a6960

+ 29 - 12
convenient/entity_crud/service.go

@@ -197,7 +197,14 @@ func Update(tableName string, needLastUpdateUserID bool, callbacks *UpdateCallba
 
 type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, columnName string, value any) (hasDeal bool, err error)
 
-func Query[O any](tableName string, orderBy string, callbacks *QueryCallbacks[O], conditionFieldCallback ConditionFieldCallback) binding.ServiceFunc[response.InfosData[O]] {
+type CustomCondition struct {
+	Conditions *sql.Conditions
+	OrderBy    string
+}
+
+type FormCustomConditionFunc func(c *api.Context, params request.Params, e entity.Entity) (*CustomCondition, error)
+
+func Query[O any](tableName string, orderBy string, callbacks *QueryCallbacks[O], conditionFieldCallback ConditionFieldCallback, formCustomConditionFunc FormCustomConditionFunc) 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),
@@ -231,21 +238,31 @@ func Query[O any](tableName string, orderBy string, callbacks *QueryCallbacks[O]
 			return errResponse, err
 		}
 
-		for _, field := range fields {
-			hasDeal := false
-			if conditionFieldCallback != nil {
-				hasDeal, err = conditionFieldCallback(conditions, field.FieldName, field.ColumnName, field.Value)
-				if err != nil {
-					return errResponse, err
+		if formCustomConditionFunc == nil {
+			for _, field := range fields {
+				hasDeal := false
+				if conditionFieldCallback != nil {
+					hasDeal, err = conditionFieldCallback(conditions, field.FieldName, field.ColumnName, field.Value)
+					if err != nil {
+						return errResponse, err
+					}
 				}
-			}
 
-			if !hasDeal {
-				fieldValue := reflect.ValueOf(field.Value)
-				if !fieldValue.IsZero() {
-					conditions.Equal(field.ColumnName, field.Value)
+				if !hasDeal {
+					fieldValue := reflect.ValueOf(field.Value)
+					if !fieldValue.IsZero() {
+						conditions.Equal(field.ColumnName, field.Value)
+					}
 				}
 			}
+		} else {
+			customCondition, err := formCustomConditionFunc(c, params, e)
+			if err != nil {
+				return errResponse, err
+			}
+
+			conditions = customCondition.Conditions
+			orderBy = customCondition.OrderBy
 		}
 
 		err = callbackBeforeQuery(callbacks, c, params, e, i)

+ 10 - 1
convenient/entity_crud/simple.go

@@ -130,7 +130,7 @@ func (simple *Simple[I]) bind(binder *binding.Binder) {
 			SendResponseFunc: response.SendInfosResponse[I],
 			RequestParams:    simple.QueryQueryParams,
 			Objects:          []domain.Object{simple.Entity},
-			ServiceFunc:      Query[I](tableName, queryOptions.orderBy, queryOptions.callbacks, queryOptions.conditionFieldCallback),
+			ServiceFunc:      Query[I](tableName, queryOptions.orderBy, queryOptions.callbacks, queryOptions.conditionFieldCallback, queryOptions.formCustomConditionFunc),
 		}, queryMiddlewares...)
 	}
 
@@ -251,6 +251,9 @@ type QueryOptions[I any] struct {
 	// 查询条件构造回调
 	conditionFieldCallback ConditionFieldCallback
 
+	// 自定义添加构造函数
+	formCustomConditionFunc FormCustomConditionFunc
+
 	// 查询回调
 	callbacks *QueryCallbacks[I]
 
@@ -374,6 +377,12 @@ func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) Que
 	}
 }
 
+func WithQueryFormCustomConditionFunc[I any](formCustomConditionFunc FormCustomConditionFunc) QueryOption[I] {
+	return func(options *QueryOptions[I]) {
+		options.formCustomConditionFunc = formCustomConditionFunc
+	}
+}
+
 func WithQueryCallbacks[I any](callbacks *QueryCallbacks[I]) QueryOption[I] {
 	return func(options *QueryOptions[I]) {
 		options.callbacks = callbacks

+ 29 - 12
convenient/value_object_crud/service.go

@@ -107,7 +107,14 @@ func Delete(tableName string, callbacks *DeleteCallbacks) binding.ServiceFunc[an
 
 type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, columnName string, value any) (hasDeal bool, err error)
 
-func Query[O any](tableName string, orderBy string, callbacks *QueryCallbacks[O], conditionFieldCallback ConditionFieldCallback) binding.ServiceFunc[response.InfosData[O]] {
+type CustomCondition struct {
+	Conditions *sql.Conditions
+	OrderBy    string
+}
+
+type FormCustomConditionFunc func(c *api.Context, params request.Params, valueObject value_object.ValueObject) (*CustomCondition, error)
+
+func Query[O any](tableName string, orderBy string, callbacks *QueryCallbacks[O], conditionFieldCallback ConditionFieldCallback, formCustomConditionFunc FormCustomConditionFunc) 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),
@@ -141,21 +148,31 @@ func Query[O any](tableName string, orderBy string, callbacks *QueryCallbacks[O]
 			return errResponse, err
 		}
 
-		for _, field := range fields {
-			hasDeal := false
-			if conditionFieldCallback != nil {
-				hasDeal, err = conditionFieldCallback(conditions, field.FieldName, field.ColumnName, field.Value)
-				if err != nil {
-					return errResponse, err
+		if formCustomConditionFunc == nil {
+			for _, field := range fields {
+				hasDeal := false
+				if conditionFieldCallback != nil {
+					hasDeal, err = conditionFieldCallback(conditions, field.FieldName, field.ColumnName, field.Value)
+					if err != nil {
+						return errResponse, err
+					}
 				}
-			}
 
-			if !hasDeal {
-				fieldValue := reflect.ValueOf(field.Value)
-				if !fieldValue.IsZero() {
-					conditions.Equal(field.ColumnName, field.Value)
+				if !hasDeal {
+					fieldValue := reflect.ValueOf(field.Value)
+					if !fieldValue.IsZero() {
+						conditions.Equal(field.ColumnName, field.Value)
+					}
 				}
 			}
+		} else {
+			customCondition, err := formCustomConditionFunc(c, queryParams, valueObject)
+			if err != nil {
+				return errResponse, err
+			}
+
+			conditions = customCondition.Conditions
+			orderBy = customCondition.OrderBy
 		}
 
 		err = callbackBeforeQuery(callbacks, c, params, valueObject, i)

+ 10 - 1
convenient/value_object_crud/simple.go

@@ -99,7 +99,7 @@ func (simple *Simple[I]) bind(binder *binding.Binder) {
 			SendResponseFunc: response.SendInfosResponse[I],
 			RequestParams:    simple.QueryQueryParams,
 			Objects:          []domain.Object{simple.ValueObject},
-			ServiceFunc:      Query(tableName, queryOptions.orderBy, queryOptions.callbacks, queryOptions.conditionFieldCallback),
+			ServiceFunc:      Query(tableName, queryOptions.orderBy, queryOptions.callbacks, queryOptions.conditionFieldCallback, queryOptions.formCustomConditionFunc),
 		}, queryMiddlewares...)
 	}
 }
@@ -177,6 +177,9 @@ type QueryOptions[I any] struct {
 	// 查询条件构造回调
 	conditionFieldCallback ConditionFieldCallback
 
+	// 自定义添加构造函数
+	formCustomConditionFunc FormCustomConditionFunc
+
 	// 查询回调
 	callbacks *QueryCallbacks[I]
 
@@ -253,6 +256,12 @@ func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) Que
 	}
 }
 
+func WithQueryFormCustomConditionFunc[I any](formCustomConditionFunc FormCustomConditionFunc) QueryOption[I] {
+	return func(options *QueryOptions[I]) {
+		options.formCustomConditionFunc = formCustomConditionFunc
+	}
+}
+
 func WithQueryCallbacks[I any](callbacks *QueryCallbacks[I]) QueryOption[I] {
 	return func(options *QueryOptions[I]) {
 		options.callbacks = callbacks