package one2one import ( "fmt" "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/domain" "github.com/iancoleman/strcase" "reflect" ) // 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.WithID // 查询左实体关联使用的请求参数,注意是Query类型 LeftQueryQueryParams request.QueryWithID // 更新右实体关联使用的请求参数 RightUpdateJsonBody request.WithID // 查询右实体关联使用的请求参数,注意是Query类型 RightQueryQueryParams request.QueryWithID // 查询左实体带右实体信息使用的请求参数,注意是Query类型 LeftQueryWithRightQueryParams request.QueryWithID // 查询右实体带左实体信息使用的请求参数,注意是Query类型 RightQueryWithLeftQueryParams request.QueryWithID // 可选配置项,通过WithXXX配置 options *Options } func (simple *Simple[LI, RI]) bind(binder *binding.Binder) { options := simple.options leftEntityType := reflect.TypeOf(simple.Left) rightEntityType := reflect.TypeOf(simple.Right) leftRelationFieldName := fmt.Sprintf("%sID", strcase.ToCamel(rightEntityType.Name())) rightRelationFieldName := fmt.Sprintf("%sID", strcase.ToCamel(leftEntityType.Name())) leftRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(rightEntityType.Name())) rightRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(leftEntityType.Name())) if !options.disableLeft { if !options.disableLeftUpdate { // 左到右更新 binding.PostBind(binder, &binding.SimpleBindItem[any]{ Path: simple.LeftDomainPath + simple.RightDomainPath + "/update", ResponseFunc: response.SendMsgResponse, RequestParams: simple.LeftUpdateJsonBody, Objects: []domain.Object{simple.Left}, ServiceFunc: Update(simple.LeftTableName, leftRelationFieldName, leftRelationColumnName, simple.RightTableName, simple.Right.DomainCNName()), }) } } if !options.disableRight { if !options.disableRightUpdate { // 右到左更新 binding.PostBind(binder, &binding.SimpleBindItem[any]{ Path: simple.RightDomainPath + simple.LeftDomainPath + "/update", ResponseFunc: response.SendMsgResponse, RequestParams: simple.RightUpdateJsonBody, Objects: []domain.Object{simple.Right}, ServiceFunc: Update(simple.RightTableName, rightRelationFieldName, rightRelationColumnName, simple.LeftTableName, simple.Left.DomainCNName()), }) } } } func BindSimple[LI any, RI any](binder *binding.Binder, simple *Simple[LI, RI], opts ...Option) { options := new(Options) for _, opt := range opts { opt(options) } simple.options = options simple.bind(binder) } type Option func(options *Options) type Options struct { // 关闭左侧到右侧关联 disableLeft bool // 关闭右侧到左侧关联 disableRight bool // 关闭左侧更新 disableLeftUpdate bool // 关闭左侧查询 disableLeftQuery bool // 关闭右侧更新 disableRightUpdate bool // 关闭右侧查询 disableRightQuery bool // 关闭左实体带右实体信息查询 disableLeftWithRightQuery bool // 关闭右实体带左实体信息查询 disableRightWithLeftQuery bool } func WithDisableLeft() Option { return func(options *Options) { options.disableLeft = true } } func WithDisableRight() Option { return func(options *Options) { options.disableRight = true } } func WithDisableLeftUpdate() Option { return func(options *Options) { options.disableLeftUpdate = true } } func WithDisableLeftQuery[LI any, RI any]() Option { return func(options *Options) { options.disableLeftQuery = true } } func WithDisableRightUpdate() Option { return func(options *Options) { options.disableRightUpdate = true } } func WithDisableRightQuery[LI any, RI any]() Option { return func(options *Options) { options.disableRightQuery = true } } func WithDisableLeftWithRightQuery[LI any, RI any]() Option { return func(options *Options) { options.disableLeftWithRightQuery = true } } func WithDisableRightWithLeftQuery() Option { return func(options *Options) { options.disableRightWithLeftQuery = true } }