Ver Fonte

完成关联设计

yjp há 1 ano atrás
pai
commit
eb63aba439

+ 2 - 2
convenient/entity/service.go

@@ -65,7 +65,7 @@ func Delete(tableName string, callbacks *Callbacks[any]) binding.ServiceFunc[any
 			return nil, fserr.New("需要传递领域对象应该为实体")
 		}
 
-		err := e.ForDelete()
+		err := e.CheckFieldID()
 		if err != nil {
 			return callbackOnErrorReturn(callbacks, e, err, i, nil)
 		}
@@ -277,7 +277,7 @@ func CreateTx(tableName string, callbacks *Callbacks[string]) binding.ServiceFun
 			return callbackOnErrorReturn(callbacks, e, err, i, "")
 		}
 
-		err = e.CheckFieldID()
+		err = e.ForCreate()
 		if err != nil {
 			return callbackOnErrorReturn(callbacks, e, err, i, "")
 		}

+ 153 - 0
convenient/relation/many2many/simple.go

@@ -0,0 +1,153 @@
+package many2many
+
+import (
+	"git.sxidc.com/go-framework/baize/binding"
+	"git.sxidc.com/go-framework/baize/binding/request"
+	"git.sxidc.com/go-framework/baize/domain"
+)
+
+// Simple 关联的Bind参数
+// LI 为左边实体的Info类型
+// RI 为右边实体的Info类型
+type Simple[LI any, RI any] struct {
+	// 左领域实体,注意是Entity类型
+	Left domain.Entity
+
+	// 右领域实体,注意是Entity类型
+	Right domain.Entity
+
+	// 中间表表名
+	MiddleTableName string
+
+	// URL领域相对路径,如/person/identities,后面会自动补充,如/person/identities/update
+	LeftDomainPath string
+
+	// URL领域相对路径,如/identity/persons,后面会自动补充,如/identity/persons/update
+	RightDomainPath string
+
+	// 更新左实体关联使用的请求参数
+	LeftUpdateJsonBody request.Params
+
+	// 查询左实体关联使用的请求参数,注意是Query类型
+	LeftQueryQueryParams request.Query
+
+	// 更新右实体关联使用的请求参数
+	RightUpdateJsonBody request.Params
+
+	// 查询右实体关联使用的请求参数,注意是Query类型
+	RightQueryQueryParams request.Query
+
+	// 可选配置项,通过WithXXX配置
+	options *Options[LI, RI]
+}
+
+func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
+	//options := simple.options
+
+}
+
+func BindSimple[LI any, RI any](binder *binding.Binder, simple *Simple[LI, RI], opts ...Option[LI, RI]) {
+	options := new(Options[LI, RI])
+
+	for _, opt := range opts {
+		opt(options)
+	}
+
+	simple.options = options
+
+	simple.bind(binder)
+}
+
+type Option[LI any, RI any] func(options *Options[LI, RI])
+
+type Options[LI any, RI any] struct {
+	// 左实体中指向右实体的字段
+	leftRelationField string
+
+	// 右实体中指向左实体的字段
+	rightRelationField string
+
+	// 左实体中指向右实体的列名
+	leftRelationColumn string
+
+	// 右实体中指向左实体的列名
+	rightRelationColumn string
+
+	// 关闭左侧到右侧关联
+	disableLeft bool
+
+	// 关闭右侧到左侧关联
+	disableRight bool
+
+	// 关闭左侧更新
+	disableLeftUpdate bool
+
+	// 关闭左侧查询
+	disableLeftQuery bool
+
+	// 关闭右侧更新
+	disableRightUpdate bool
+
+	// 关闭右侧查询
+	disableRightQuery bool
+}
+
+func WithLeftRelationField[LI any, RI any](leftRelationField string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.leftRelationField = leftRelationField
+	}
+}
+
+func WithRightRelationField[LI any, RI any](rightRelationField string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.rightRelationField = rightRelationField
+	}
+}
+
+func WithLeftRelationColumn[LI any, RI any](leftRelationColumn string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.leftRelationColumn = leftRelationColumn
+	}
+}
+
+func WithRightRelationColumn[LI any, RI any](rightRelationColumn string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.rightRelationColumn = rightRelationColumn
+	}
+}
+
+func WithDisableLeft[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeft = true
+	}
+}
+
+func WithDisableRight[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRight = true
+	}
+}
+
+func WithDisableLeftUpdate[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeftUpdate = true
+	}
+}
+
+func WithDisableLeftQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeftQuery = true
+	}
+}
+
+func WithDisableRightUpdate[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightUpdate = true
+	}
+}
+
+func WithDisableRightQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightQuery = true
+	}
+}

+ 150 - 0
convenient/relation/one2many/simple.go

@@ -0,0 +1,150 @@
+package one2many
+
+import (
+	"git.sxidc.com/go-framework/baize/binding"
+	"git.sxidc.com/go-framework/baize/binding/request"
+	"git.sxidc.com/go-framework/baize/domain"
+)
+
+// Simple 关联的Bind参数
+// LI 为左边实体的Info类型
+// RI 为右边实体的Info类型
+type Simple[LI any, RI any] struct {
+	// 左领域实体,注意是Entity类型
+	Left domain.Entity
+
+	// 右领域实体,注意是Entity类型
+	Right domain.Entity
+
+	// 左表名
+	LeftTableName string
+
+	// 右表名
+	RightTableName string
+
+	// URL领域相对路径,如/class/students,后面会自动补充,如/class/students/update
+	LeftDomainPath string
+
+	// URL领域相对路径,如/student/classes,后面会自动补充,如/student/classes/update
+	RightDomainPath string
+
+	// 更新左实体关联使用的请求参数
+	LeftUpdateJsonBody request.Params
+
+	// 查询左实体关联使用的请求参数,注意是Query类型
+	LeftQueryQueryParams request.Query
+
+	// 更新左实体关联使用的请求参数
+	RightUpdateJsonBody request.Params
+
+	// 查询右实体关联使用的请求参数,注意是Query类型
+	RightQueryQueryParams request.Query
+
+	// 查询右实体带左实体信息使用的请求参数,注意是Query类型
+	RightQueryWithLeftQueryParams request.Query
+
+	// 可选配置项,通过WithXXX配置
+	options *Options[LI, RI]
+}
+
+func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
+	//options := simple.options
+
+}
+
+func BindSimple[LI any, RI any](binder *binding.Binder, simple *Simple[LI, RI], opts ...Option[LI, RI]) {
+	options := new(Options[LI, RI])
+
+	for _, opt := range opts {
+		opt(options)
+	}
+
+	simple.options = options
+
+	simple.bind(binder)
+}
+
+type Option[LI any, RI any] func(options *Options[LI, RI])
+
+type Options[LI any, RI any] struct {
+	// 右实体中指向左实体的字段
+	rightRelationField string
+
+	// 右实体中指向左实体的列名
+	rightRelationColumn string
+
+	// 关闭左侧到右侧关联
+	disableLeft bool
+
+	// 关闭右侧到左侧关联
+	disableRight bool
+
+	// 关闭左侧更新
+	disableLeftUpdate bool
+
+	// 关闭左侧查询
+	disableLeftQuery bool
+
+	// 关闭右侧更新
+	disableRightUpdate bool
+
+	// 关闭右侧查询
+	disableRightQuery bool
+
+	// 关闭右实体带左实体信息查询
+	disableRightWithLeftQuery bool
+}
+
+func WithRightRelationField[LI any, RI any](rightRelationField string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.rightRelationField = rightRelationField
+	}
+}
+
+func WithRightRelationColumn[LI any, RI any](rightRelationColumn string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.rightRelationColumn = rightRelationColumn
+	}
+}
+
+func WithDisableLeft[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeft = true
+	}
+}
+
+func WithDisableRight[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRight = true
+	}
+}
+
+func WithDisableLeftUpdate[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeftUpdate = true
+	}
+}
+
+func WithDisableLeftQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeftQuery = true
+	}
+}
+
+func WithDisableRightUpdate[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightUpdate = true
+	}
+}
+
+func WithDisableRightQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightQuery = true
+	}
+}
+
+func WithDisableRightWithLeftQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightWithLeftQuery = true
+	}
+}

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

@@ -0,0 +1,155 @@
+package one2one
+
+import (
+	"git.sxidc.com/go-framework/baize/binding"
+	"git.sxidc.com/go-framework/baize/binding/request"
+	"git.sxidc.com/go-framework/baize/domain"
+)
+
+// Simple 关联的Bind参数
+// LI 为左边实体的Info类型
+// RI 为右边实体的Info类型
+type Simple[LI any, RI any] struct {
+	// 左领域实体,注意是Entity类型
+	Left domain.Entity
+
+	// 右领域实体,注意是Entity类型
+	Right domain.Entity
+
+	// 左表名
+	LeftTableName string
+
+	// 右表名
+	RightTableName string
+
+	// URL领域相对路径,如/user/userInfo,后面会自动补充,如/user/userInfo/update
+	LeftDomainPath string
+
+	// URL领域相对路径,如/userInfo/user,后面会自动补充,如/userInfo/user/update
+	RightDomainPath string
+
+	// 更新左实体关联使用的请求参数
+	LeftUpdateJsonBody request.Params
+
+	// 查询左实体关联使用的请求参数,注意是Query类型
+	LeftQueryQueryParams request.Query
+
+	// 更新右实体关联使用的请求参数
+	RightUpdateJsonBody request.Params
+
+	// 查询右实体关联使用的请求参数,注意是Query类型
+	RightQueryQueryParams request.Query
+
+	// 可选配置项,通过WithXXX配置
+	options *Options[LI, RI]
+}
+
+func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
+	//options := simple.options
+}
+
+func BindSimple[LI any, RI any](binder *binding.Binder, simple *Simple[LI, RI], opts ...Option[LI, RI]) {
+	options := new(Options[LI, RI])
+
+	for _, opt := range opts {
+		opt(options)
+	}
+
+	simple.options = options
+
+	simple.bind(binder)
+}
+
+type Option[LI any, RI any] func(options *Options[LI, RI])
+
+type Options[LI any, RI any] struct {
+	// 左实体中指向右实体的字段
+	leftRelationField string
+
+	// 右实体中指向左实体的字段
+	rightRelationField string
+
+	// 左实体中指向右实体的列名
+	leftRelationColumn string
+
+	// 右实体中指向左实体的列名
+	rightRelationColumn string
+
+	// 关闭左侧到右侧关联
+	disableLeft bool
+
+	// 关闭右侧到左侧关联
+	disableRight bool
+
+	// 关闭左侧更新
+	disableLeftUpdate bool
+
+	// 关闭左侧查询
+	disableLeftQuery bool
+
+	// 关闭右侧更新
+	disableRightUpdate bool
+
+	// 关闭右侧查询
+	disableRightQuery bool
+}
+
+func WithLeftRelationField[LI any, RI any](leftRelationField string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.leftRelationField = leftRelationField
+	}
+}
+
+func WithRightRelationField[LI any, RI any](rightRelationField string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.rightRelationField = rightRelationField
+	}
+}
+
+func WithLeftRelationColumn[LI any, RI any](leftRelationColumn string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.leftRelationColumn = leftRelationColumn
+	}
+}
+
+func WithRightRelationColumn[LI any, RI any](rightRelationColumn string) Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.rightRelationColumn = rightRelationColumn
+	}
+}
+
+func WithDisableLeft[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeft = true
+	}
+}
+
+func WithDisableRight[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRight = true
+	}
+}
+
+func WithDisableLeftUpdate[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeftUpdate = true
+	}
+}
+
+func WithDisableLeftQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableLeftQuery = true
+	}
+}
+
+func WithDisableRightUpdate[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightUpdate = true
+	}
+}
+
+func WithDisableRightQuery[LI any, RI any]() Option[LI, RI] {
+	return func(options *Options[LI, RI]) {
+		options.disableRightQuery = true
+	}
+}

+ 1 - 1
convenient/value_object/simple.go

@@ -8,7 +8,7 @@ import (
 	"git.sxidc.com/go-framework/baize/domain"
 )
 
-// Simple 实体CRUD的Bind参数
+// Simple 值对象CRD的Bind参数
 // I 为查询相关接口返回的Info类型
 type Simple[I any] struct {
 	// 使用的领域实体,注意是ValueObject类型

+ 17 - 29
domain/common.go

@@ -19,49 +19,37 @@ const (
 	FieldIDLen = 32
 )
 
-type TenantIDField struct {
-	TenantID string `sqlmapping:"column:tenant_id;" sqlresult:"column:tenant_id;"`
-}
-
-func (field *TenantIDField) CheckFieldTenantID(domainCNName string, errCode int) error {
-	if strutils.IsStringEmpty(field.TenantID) {
-		return fserr.WithCode(nil, errCode, fserr.MsgOption(domainCNName+"租户ID为空"))
+func CheckID(domainCNName, fieldCNName string, id string) error {
+	if strutils.IsStringEmpty(id) {
+		return fserr.New(domainCNName + fieldCNName + "为空")
 	}
 
-	if len([]byte(field.TenantID)) != FieldIDLen {
-		return fserr.WithCode(nil, errCode, fserr.MsgOption(domainCNName+"租户ID长度不正确"))
+	if len(id) != FieldIDLen {
+		return fserr.New(domainCNName + fieldCNName + "长度不正确")
 	}
 
 	return nil
 }
 
+type TenantIDField struct {
+	TenantID string `sqlmapping:"column:tenant_id;" sqlresult:"column:tenant_id;"`
+}
+
+func (field *TenantIDField) CheckFieldTenantID(domainCNName string) error {
+	return CheckID(field.TenantID, domainCNName, "租户ID")
+}
+
 type UserIDFields struct {
 	CreateUserID     string `sqlmapping:"column:create_user_id;" sqlresult:"column:create_user_id;"`
 	LastUpdateUserID string `sqlmapping:"column:last_update_user_id;" sqlresult:"column:last_update_user_id;"`
 }
 
-func (field *UserIDFields) CheckFieldCreateUserID(domainCNName string, errCode int) error {
-	if strutils.IsStringEmpty(field.CreateUserID) {
-		return fserr.WithCode(nil, errCode, fserr.MsgOption(domainCNName+"创建用户ID为空"))
-	}
-
-	if len([]byte(field.CreateUserID)) != FieldIDLen {
-		return fserr.WithCode(nil, errCode, fserr.MsgOption(domainCNName+"创建用户ID长度不正确"))
-	}
-
-	return nil
+func (field *UserIDFields) CheckFieldCreateUserID(domainCNName string) error {
+	return CheckID(field.CreateUserID, domainCNName, "创建用户ID")
 }
 
-func (field *UserIDFields) CheckFieldLastUpdateUserID(domainCNName string, errCode int) error {
-	if strutils.IsStringEmpty(field.LastUpdateUserID) {
-		return fserr.WithCode(nil, errCode, fserr.MsgOption(domainCNName+"最近更新用户ID为空"))
-	}
-
-	if len([]byte(field.LastUpdateUserID)) != FieldIDLen {
-		return fserr.WithCode(nil, errCode, fserr.MsgOption(domainCNName+"最近更新用户ID长度不正确"))
-	}
-
-	return nil
+func (field *UserIDFields) CheckFieldLastUpdateUserID(domainCNName string) error {
+	return CheckID(field.LastUpdateUserID, domainCNName, "更新用户ID")
 }
 
 type TimeFields struct {

+ 1 - 15
domain/entity.go

@@ -2,7 +2,6 @@ package domain
 
 import (
 	"git.sxidc.com/go-tools/utils/strutils"
-	"git.sxidc.com/service-supports/fserr"
 )
 
 type Entity interface {
@@ -13,7 +12,6 @@ type Entity interface {
 	CheckFieldID() error
 	IDColumnName() string
 	ForCreate() error
-	ForDelete() error
 	ForUpdate() error
 }
 
@@ -35,15 +33,7 @@ func (e *BaseEntity) GetID() string {
 }
 
 func (e *BaseEntity) CheckFieldID() error {
-	if strutils.IsStringEmpty(e.ID) {
-		return fserr.New(e.DomainCNName() + "ID为空")
-	}
-
-	if len([]byte(e.ID)) != FieldIDLen {
-		return fserr.New(e.DomainCNName() + "ID长度不正确")
-	}
-
-	return nil
+	return CheckID(e.ID, e.DomainCNName(), "ID")
 }
 
 func (e *BaseEntity) IDColumnName() string {
@@ -54,10 +44,6 @@ func (e *BaseEntity) ForCreate() error {
 	panic("领域实体没有实现ForCreate接口")
 }
 
-func (e *BaseEntity) ForDelete() error {
-	panic("领域实体没有实现ForDelete接口")
-}
-
 func (e *BaseEntity) ForUpdate() error {
 	panic("领域实体没有实现ForUpdate接口")
 }

+ 0 - 4
examples/example_domain/class/entity.go

@@ -48,10 +48,6 @@ func (e *Entity) ForCreate() error {
 	return nil
 }
 
-func (e *Entity) ForDelete() error {
-	return e.CheckFieldID()
-}
-
 func (e *Entity) ForUpdate() error {
 	err := e.CheckFieldID()
 	if err != nil {