package gwtools import ( "git.sxidc.com/go-framework/baize/framework/gateway" "git.sxidc.com/go-tools/utils/template" "github.com/iancoleman/strcase" "net/http" ) func Many2Many(builder *gateway.Builder, params *Many2ManyParams, opts ...Many2ManyOption) { options := new(Many2ManyOptions) for _, opt := range opts { opt(options) } params.options = options params.many2many(builder) } type Many2ManyParams struct { // 除去后缀的服务URL,如http://localhost:8080/example/api/v1 ServiceVersionedUrl string // 左领域名称 LeftDomainCamelName string // 右领域名称 RightDomainCamelName string // 可选配置项,通过WithXXX配置 options *Many2ManyOptions } func (params *Many2ManyParams) many2many(builder *gateway.Builder) { options := params.options leftDomainPath := "/" + strcase.ToLowerCamel(template.Id(params.LeftDomainCamelName)) rightDomainPath := "/" + strcase.ToLowerCamel(template.Id(params.RightDomainCamelName)) if !options.disableLeft { if !options.disableLeftUpdate { // 左到右更新 builder. Url(http.MethodPost, leftDomainPath+rightDomainPath+"/update"). Post(&gateway.PostRequest{ Url: params.ServiceVersionedUrl + leftDomainPath + rightDomainPath + "/update", }, nil). Build() } if !options.disableLeftQuery { // 左到右查询 builder. Url(http.MethodGet, leftDomainPath+rightDomainPath+"/query"). Get(&gateway.GetRequest{ Url: params.ServiceVersionedUrl + leftDomainPath + rightDomainPath + "/query", }, nil). Build() } } if !options.disableRight { if !options.disableRightUpdate { // 右到左更新 builder. Url(http.MethodPost, rightDomainPath+leftDomainPath+"/update"). Post(&gateway.PostRequest{ Url: params.ServiceVersionedUrl + rightDomainPath + leftDomainPath + "/update", }, nil). Build() } if !options.disableRightQuery { // 右到左查询 builder. Url(http.MethodGet, rightDomainPath+leftDomainPath+"/query"). Get(&gateway.GetRequest{ Url: params.ServiceVersionedUrl + rightDomainPath + leftDomainPath + "/query", }, nil). Build() } } } type Many2ManyOption func(options *Many2ManyOptions) type Many2ManyOptions struct { // 关闭左侧到右侧关联 disableLeft bool // 关闭右侧到左侧关联 disableRight bool // 关闭左侧更新 disableLeftUpdate bool // 关闭左侧查询 disableLeftQuery bool // 关闭右侧更新 disableRightUpdate bool // 关闭右侧查询 disableRightQuery bool } func WithMany2ManyDisableLeft() Many2ManyOption { return func(options *Many2ManyOptions) { options.disableLeft = true } } func WithMany2ManyDisableRight() Many2ManyOption { return func(options *Many2ManyOptions) { options.disableRight = true } } func WithMany2ManyDisableLeftUpdate() Many2ManyOption { return func(options *Many2ManyOptions) { options.disableLeftUpdate = true } } func WithMany2ManyDisableLeftQuery() Many2ManyOption { return func(options *Many2ManyOptions) { options.disableLeftQuery = true } } func WithMany2ManyDisableRightUpdate() Many2ManyOption { return func(options *Many2ManyOptions) { options.disableRightUpdate = true } } func WithMany2ManyDisableRightQuery() Many2ManyOption { return func(options *Many2ManyOptions) { options.disableRightQuery = true } }