package value_object import ( "git.sxidc.com/go-framework/baize/convenient/binding" "git.sxidc.com/go-framework/baize/convenient/binding/request" "git.sxidc.com/go-framework/baize/convenient/binding/response" "git.sxidc.com/go-framework/baize/framwork/api" "git.sxidc.com/go-framework/baize/framwork/domain" "git.sxidc.com/go-framework/baize/framwork/domain/value_object" "git.sxidc.com/go-framework/baize/framwork/infrastructure" "git.sxidc.com/go-framework/baize/framwork/infrastructure/database" "git.sxidc.com/go-framework/baize/framwork/infrastructure/database/sql" "git.sxidc.com/go-framework/baize/framwork/tag/sql/sql_mapping" "git.sxidc.com/service-supports/fserr" "reflect" ) func Create(tableName string, callbacks *Callbacks[any]) binding.ServiceFunc[any] { return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) { object := objects[0] if object == nil { return nil, fserr.New("领域实体为空") } dbExecutor := i.DBExecutor() valueObject, ok := objects[0].(value_object.ValueObject) if !ok { return nil, fserr.New("需要传递领域对象应该为值对象") } err := valueObject.ForCreate() if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = callbackBeforeDBOperate(callbacks, valueObject, i, dbExecutor) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = database.InsertEntity(dbExecutor, tableName, valueObject) if err != nil { if database.IsErrorDBRecordHasExist(err) { err = fserr.New(valueObject.DomainCNName() + "已存在") } return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = callbackAfterDBOperate(callbacks, valueObject, i, dbExecutor) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } return callbackOnSuccessReturn(callbacks, valueObject, i, nil) } } func Delete(tableName string, callbacks *Callbacks[any]) binding.ServiceFunc[any] { return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) { object := objects[0] if object == nil { return nil, fserr.New("领域实体为空") } dbExecutor := i.DBExecutor() valueObject, ok := objects[0].(value_object.ValueObject) if !ok { return nil, fserr.New("需要传递领域对象应该为值对象") } err := valueObject.CheckKeyFields() if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = callbackBeforeDBOperate(callbacks, valueObject, i, dbExecutor) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = database.DeleteEntity(dbExecutor, tableName, valueObject) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = callbackAfterDBOperate(callbacks, valueObject, i, dbExecutor) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } return callbackOnSuccessReturn(callbacks, valueObject, i, nil) } } type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, columnName string, value any) (hasDeal bool) 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 errResponse, fserr.New("请求参数为空") } object := objects[0] if object == nil { return errResponse, fserr.New("领域实体为空") } dbExecutor := i.DBExecutor() queryParams, ok := params.(request.Query) if !ok { return errResponse, fserr.New("请求参数不是Query接口") } valueObject, ok := objects[0].(value_object.ValueObject) if !ok { return errResponse, fserr.New("需要传递领域对象应该为值对象") } conditions := sql.NewConditions() fields, err := sql_mapping.DefaultUsage(valueObject) if err != nil { return errResponse, err } for _, field := range fields { hasDeal := false if conditionFieldCallback != nil { hasDeal = conditionFieldCallback(conditions, field.FieldName, field.ColumnName, field.Value) } if !hasDeal { fieldValue := reflect.ValueOf(field.Value) if !fieldValue.IsZero() { conditions.Equal(field.ColumnName, field.Value) } } } err = callbackBeforeDBOperate(callbacks, valueObject, i, dbExecutor) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, errResponse) } results, totalCount, err := database.Query(dbExecutor, &sql.QueryExecuteParams{ TableName: tableName, Conditions: conditions, PageNo: queryParams.GetPageNo(), PageSize: queryParams.GetPageSize(), }) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, errResponse) } err = callbackAfterDBOperate(callbacks, valueObject, i, dbExecutor) if err != nil { 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, errResponse) } output := response.InfosData[O]{ Infos: infos, TotalCount: totalCount, PageNo: queryParams.GetPageNo(), } return callbackOnSuccessReturn(callbacks, valueObject, i, output) } } func CreateTx(tableName string, callbacks *Callbacks[any]) binding.ServiceFunc[any] { return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) { dbExecutor := i.DBExecutor() valueObject, ok := objects[0].(value_object.ValueObject) if !ok { return nil, fserr.New("需要传递领域对象应该为值对象") } err := database.Transaction(dbExecutor, func(tx database.Executor) error { err := callbackBeforeDBOperate(callbacks, valueObject, i, tx) if err != nil { return err } err = database.InsertEntity(tx, tableName, valueObject) if err != nil { if database.IsErrorDBRecordHasExist(err) { err = fserr.New(valueObject.DomainCNName() + "已存在") } return err } err = callbackAfterDBOperate(callbacks, valueObject, i, tx) if err != nil { return err } return nil }) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } return callbackOnSuccessReturn(callbacks, valueObject, i, nil) } } func DeleteTx(tableName string, callbacks *Callbacks[any]) binding.ServiceFunc[any] { return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) { dbExecutor := i.DBExecutor() valueObject, ok := objects[0].(value_object.ValueObject) if !ok { return nil, fserr.New("需要传递领域对象应该为值对象") } err := valueObject.CheckKeyFields() if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } err = database.Transaction(dbExecutor, func(tx database.Executor) error { err = callbackBeforeDBOperate(callbacks, valueObject, i, tx) if err != nil { return err } err = database.DeleteEntity(tx, tableName, valueObject) if err != nil { return err } err = callbackAfterDBOperate(callbacks, valueObject, i, tx) if err != nil { return err } return nil }) if err != nil { return callbackOnErrorReturn(callbacks, valueObject, err, i, nil) } return callbackOnSuccessReturn(callbacks, valueObject, i, nil) } }