diff --git a/module/release/iml.go b/module/release/iml.go index d46f1094..f8a495ea 100644 --- a/module/release/iml.go +++ b/module/release/iml.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" + "github.com/APIParkLab/APIPark/service/strategy" + api_doc "github.com/APIParkLab/APIPark/service/api-doc" service_doc "github.com/APIParkLab/APIPark/service/service-doc" @@ -40,11 +42,39 @@ type imlReleaseModule struct { serviceDocService service_doc.IDocService `autowired:""` upstreamService upstream.IUpstreamService `autowired:""` publishService publish.IPublishService `autowired:""` + strategyService strategy.IStrategyService `autowired:""` transaction store.ITransaction `autowired:""` projectService service.IServiceService `autowired:""` clusterService cluster.IClusterService `autowired:""` } +func (m *imlReleaseModule) latestStrategyCommits(ctx context.Context, serviceId string) ([]*commit.Commit[strategy.StrategyCommit], error) { + list, err := m.strategyService.All(ctx, 2, serviceId) + if err != nil { + return nil, fmt.Errorf("get latest strategy failed:%w", err) + } + + return utils.SliceToSlice(list, func(s *strategy.Strategy) *commit.Commit[strategy.StrategyCommit] { + key := fmt.Sprintf("service-%s", s.Id) + return &commit.Commit[strategy.StrategyCommit]{ + Target: s.Id, + Key: key, + Data: &strategy.StrategyCommit{ + Id: s.Id, + Name: s.Name, + Priority: s.Priority, + Filters: s.Filters, + Config: s.Config, + Driver: s.Driver, + IsStop: s.IsStop, + Version: s.UpdateAt.Format("20060102150405"), + }, + } + }, func(s *strategy.Strategy) bool { + return !s.IsDelete + }), nil +} + func (m *imlReleaseModule) Create(ctx context.Context, serviceId string, input *dto.CreateInput) (string, error) { proInfo, err := m.projectService.Check(ctx, serviceId, projectRuleMustServer) @@ -103,6 +133,13 @@ func (m *imlReleaseModule) Create(ctx context.Context, serviceId string, input * return c.Key, c.UUID }) }) + strategies, err := m.latestStrategyCommits(ctx, serviceId) + if err != nil { + return "", err + } + strategyCommits := utils.SliceToMapO(strategies, func(c *commit.Commit[strategy.StrategyCommit]) (string, string) { + return c.Target, c.UUID + }) var newRelease *release.Release err = m.transaction.Transaction(ctx, func(ctx context.Context) error { @@ -161,7 +198,7 @@ func (m *imlReleaseModule) Create(ctx context.Context, serviceId string, input * requestCommitMap := utils.SliceToMapO(requestCommits, func(c *commit.Commit[api.Request]) (string, string) { return c.Target, c.UUID }) - newRelease, err = m.releaseService.CreateRelease(ctx, serviceId, input.Version, input.Remark, requestCommitMap, apiProxyCommits, docCommit.UUID, serviceDocCommit.UUID, upstreamCommitsForUKC) + newRelease, err = m.releaseService.CreateRelease(ctx, serviceId, input.Version, input.Remark, requestCommitMap, apiProxyCommits, docCommit.UUID, serviceDocCommit.UUID, upstreamCommitsForUKC, strategyCommits) return err }) if err != nil { diff --git a/service/release/commit.go b/service/release/commit.go index fb8ca5c8..e1feabee 100644 --- a/service/release/commit.go +++ b/service/release/commit.go @@ -8,4 +8,5 @@ const ( CommitUpstream CommitType = "upstream" CommitApiProxy CommitType = "api_proxy" CommitServiceDoc CommitType = "service_doc" + CommitStrategy CommitType = "strategy" ) diff --git a/service/release/iml.go b/service/release/iml.go index 2b8705ba..da0a32ee 100644 --- a/service/release/iml.go +++ b/service/release/iml.go @@ -281,7 +281,7 @@ func (s *imlReleaseService) SetRunning(ctx context.Context, service string, id s } -func (s *imlReleaseService) CreateRelease(ctx context.Context, service string, version string, remark string, apiRequestCommit, apisProxyCommits map[string]string, apiDocCommit, serviceDocCommit string, upstreams map[string]map[string]string) (*Release, error) { +func (s *imlReleaseService) CreateRelease(ctx context.Context, service, version, remark string, apiRequestCommit, apisProxyCommits map[string]string, apiDocCommits, serviceDocCommits string, upstreams map[string]map[string]string, strategies map[string]string) (*Release, error) { operator := utils.UserId(ctx) releaseId := uuid.NewString() commits := make([]*release.Commit, 0, len(apisProxyCommits)+len(upstreams)+2) @@ -315,23 +315,32 @@ func (s *imlReleaseService) CreateRelease(ctx context.Context, service string, v }) } } - if apiDocCommit != "" { + if apiDocCommits != "" { commits = append(commits, &release.Commit{ Type: CommitApiDocument, Target: service, Release: releaseId, Key: CommitApiDocument, - Commit: apiDocCommit, + Commit: apiDocCommits, }) } - if serviceDocCommit != "" { + if serviceDocCommits != "" { commits = append(commits, &release.Commit{ Type: CommitServiceDoc, Target: service, Release: releaseId, Key: CommitServiceDoc, - Commit: serviceDocCommit, + Commit: serviceDocCommits, + }) + } + for key, value := range strategies { + commits = append(commits, &release.Commit{ + Type: CommitStrategy, + Target: key, + Release: releaseId, + Key: CommitStrategy, + Commit: value, }) } diff --git a/service/release/service.go b/service/release/service.go index b248d275..79aea897 100644 --- a/service/release/service.go +++ b/service/release/service.go @@ -14,7 +14,7 @@ type IReleaseService interface { // GetRelease 获取发布信息 GetRelease(ctx context.Context, id string) (*Release, error) // CreateRelease 创建发布 - CreateRelease(ctx context.Context, service string, version string, remark string, apiRequestCommit, apisProxyCommits map[string]string, apiDocCommits, serviceDocCommits string, upstreams map[string]map[string]string) (*Release, error) + CreateRelease(ctx context.Context, service, version, remark string, apiRequestCommit, apisProxyCommits map[string]string, apiDocCommits, serviceDocCommits string, upstreams map[string]map[string]string, strategies map[string]string) (*Release, error) // DeleteRelease 删除发布 DeleteRelease(ctx context.Context, id string) error List(ctx context.Context, service string) ([]*Release, error)