From d85773c2da3d1f6a6eebb14532b6364572b66561 Mon Sep 17 00:00:00 2001 From: Liujian <824010343@qq.com> Date: Sun, 1 Sep 2024 23:55:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E8=87=AA=E6=B5=8B=E5=AE=8C?= =?UTF-8?q?=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/catalogue/iml.go | 56 ++++++------ module/release/iml.go | 14 ++- service/api-doc/iml.go | 16 ++++ service/api-doc/service.go | 1 + service/release/iml.go | 131 +++++++++++++++++----------- service/release/model.go | 6 ++ service/release/service.go | 7 +- service/service-doc/iml.go | 16 +++- service/service-doc/service.go | 6 +- stores/universally/commit/commit.go | 2 +- 10 files changed, 165 insertions(+), 90 deletions(-) diff --git a/module/catalogue/iml.go b/module/catalogue/iml.go index 5720277c..08bcb2d4 100644 --- a/module/catalogue/iml.go +++ b/module/catalogue/iml.go @@ -118,11 +118,7 @@ func (i *imlCatalogueModule) Subscribe(ctx context.Context, subscribeInfo *catal // 当系统不可作为订阅方时,不可订阅 continue } - //info, err := i.subscribeApplyService.GetApply(ctx, subscribeInfo.Service, appId) - //if err != nil { - // if !errors.Is(err, gorm.ErrRecordNotFound) { - // return err - // } + err = i.subscribeApplyService.Create(ctx, &subscribe.CreateApply{ Uuid: uuid.New().String(), Service: subscribeInfo.Service, @@ -134,13 +130,6 @@ func (i *imlCatalogueModule) Subscribe(ctx context.Context, subscribeInfo *catal Applier: userId, }) - //} else { - // status := subscribe.ApplyStatusReview - // err = i.subscribeApplyService.Save(ctx, info.Id, &subscribe.EditApply{ - // Status: &status, - // Applier: &userId, - // }) - //} if err != nil { return err } @@ -203,23 +192,13 @@ func (i *imlCatalogueModule) ServiceDetail(ctx context.Context, sid string) (*ca if err != nil { return nil, fmt.Errorf("get service failed: %w", err) } - docStr := "" - doc, err := i.serviceDocService.Get(ctx, sid) - if err != nil { - if !errors.Is(err, gorm.ErrRecordNotFound) { - return nil, fmt.Errorf("get service doc failed: %w", err) - } - } else { - docStr = doc.Doc - } - r, err := i.releaseService.GetRunning(ctx, s.Id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return &catalogue_dto.ServiceDetail{ Name: s.Name, Description: s.Description, - Document: docStr, + Document: "", Basic: &catalogue_dto.ServiceBasic{ Team: auto.UUID(s.Team), ApiNum: 0, @@ -243,24 +222,33 @@ func (i *imlCatalogueModule) ServiceDetail(ctx context.Context, sid string) (*ca }, func(t *service_tag.Tag) bool { return t.Sid == sid }) - _, _, docCommits, _, err := i.releaseService.GetReleaseInfos(ctx, r.UUID) + _, _, apiDocCommit, _, serviceDocCommit, err := i.releaseService.GetReleaseInfos(ctx, r.UUID) if err != nil { return nil, fmt.Errorf("get release apis failed: %w", err) } var apiDoc string var apiNum int - if len(docCommits) > 0 { - commit, err := i.apiDocService.GetDocCommit(ctx, docCommits[0].Commit) + if apiDocCommit != nil { + commit, err := i.apiDocService.GetDocCommit(ctx, apiDocCommit.Commit) if err != nil { return nil, err } apiDoc = commit.Data.Content apiNum = int(commit.Data.APICount) } + + var serviceDoc string + if serviceDocCommit != nil { + commit, err := i.serviceDocService.GetDocCommit(ctx, serviceDocCommit.Commit) + if err != nil { + return nil, err + } + serviceDoc = commit.Data.Content + } return &catalogue_dto.ServiceDetail{ Name: s.Name, Description: s.Description, - Document: docStr, + Document: serviceDoc, Basic: &catalogue_dto.ServiceBasic{ Team: auto.UUID(s.Team), ApiNum: apiNum, @@ -299,12 +287,20 @@ func (i *imlCatalogueModule) Services(ctx context.Context, keyword string) ([]*c if len(serviceIds) < 1 { return nil, nil } - - // 获取服务API数量 - apiCountMap, err := i.apiDocService.LatestAPICountByServices(ctx, serviceIds...) + commits, err := i.releaseService.GetRunningApiDocCommits(ctx, serviceIds...) if err != nil { return nil, err } + apiCountMap, err := i.apiDocService.LatestAPICountByCommits(ctx, commits...) + if err != nil { + return nil, err + } + + //// 获取服务API数量 + //apiCountMap, err := i.apiDocService.LatestAPICountByServices(ctx, serviceIds...) + //if err != nil { + // return nil, err + //} subscriberCountMap, err := i.subscribeService.CountMapByService(ctx, subscribe.ApplyStatusSubscribe, serviceIds...) if err != nil { diff --git a/module/release/iml.go b/module/release/iml.go index 6ea163d3..a4e4769f 100644 --- a/module/release/iml.go +++ b/module/release/iml.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" api_doc "github.com/APIParkLab/APIPark/service/api-doc" + service_doc "github.com/APIParkLab/APIPark/service/service-doc" "github.com/APIParkLab/APIPark/service/cluster" "github.com/APIParkLab/APIPark/service/service" @@ -35,6 +36,7 @@ type imlReleaseModule struct { releaseService release.IReleaseService `autowired:""` apiService api.IAPIService `autowired:""` apiDocService api_doc.IAPIDocService `autowired:""` + serviceDocService service_doc.IDocService `autowired:""` upstreamService upstream.IUpstreamService `autowired:""` publishService publish.IPublishService `autowired:""` transaction store.ITransaction `autowired:""` @@ -132,9 +134,15 @@ func (m *imlReleaseModule) Create(ctx context.Context, serviceId string, input * if err != nil { return err } - docCommitMap := map[string]string{ - docCommit.Target: docCommit.UUID, + serviceDoc, err := m.serviceDocService.Get(ctx, serviceId) + if err != nil { + return err } + err = m.serviceDocService.CommitDoc(ctx, serviceId, serviceDoc) + if err != nil { + return err + } + serviceDocCommit, err := m.serviceDocService.LatestDocCommit(ctx, serviceId) if !m.releaseService.Completeness(utils.SliceToSlice(clusters, func(s *cluster.Cluster) string { return s.Uuid }), apiUUIDS, requestCommits, apiProxy, upstreams) { @@ -143,7 +151,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, docCommitMap, nil, upstreamCommitsForUKC) + newRelease, err = m.releaseService.CreateRelease(ctx, serviceId, input.Version, input.Remark, requestCommitMap, apiProxyCommits, docCommit.UUID, serviceDocCommit.UUID, upstreamCommitsForUKC) return err }) if err != nil { diff --git a/service/api-doc/iml.go b/service/api-doc/iml.go index df6b0bde..86e771cc 100644 --- a/service/api-doc/iml.go +++ b/service/api-doc/iml.go @@ -19,6 +19,22 @@ type imlAPIDocService struct { commitService commit.ICommitWithKeyService[DocCommit] `autowired:""` } +func (i *imlAPIDocService) LatestAPICountByCommits(ctx context.Context, commitIds ...string) (map[string]int64, error) { + commits, err := i.commitService.List(ctx, commitIds...) + if err != nil { + return nil, err + } + countMap := make(map[string]int64) + for _, c := range commits { + doc, err := NewDocLoader(c.Data.Content) + if err != nil { + return nil, err + } + countMap[c.Target] = doc.APICount() + } + return countMap, nil +} + func (i *imlAPIDocService) GetDocCommit(ctx context.Context, commitId string) (*commit.Commit[DocCommit], error) { return i.commitService.Get(ctx, commitId) } diff --git a/service/api-doc/service.go b/service/api-doc/service.go index 9baf9549..4bfcf336 100644 --- a/service/api-doc/service.go +++ b/service/api-doc/service.go @@ -25,6 +25,7 @@ type IAPIDocService interface { ListLatestDocCommit(ctx context.Context, serviceIds ...string) ([]*commit.Commit[DocCommit], error) ListDocCommit(ctx context.Context, commitIds ...string) ([]*commit.Commit[DocCommit], error) LatestAPICountByServices(ctx context.Context, serviceIds ...string) (map[string]int64, error) + LatestAPICountByCommits(ctx context.Context, commitIds ...string) (map[string]int64, error) } func init() { diff --git a/service/release/iml.go b/service/release/iml.go index 991bfa28..2b8705ba 100644 --- a/service/release/iml.go +++ b/service/release/iml.go @@ -28,6 +28,29 @@ type imlReleaseService struct { releaseRuntime release.IReleaseRuntime `autowired:""` } +func (s *imlReleaseService) GetRunningApiDocCommits(ctx context.Context, serviceIds ...string) ([]string, error) { + w := make(map[string]interface{}) + if len(serviceIds) > 0 { + w["service"] = serviceIds + } + runnings, err := s.releaseRuntime.List(ctx, w) + if err != nil { + return nil, err + } + apiDocCommits := make([]string, 0, len(runnings)) + for _, running := range runnings { + commits, err := s.getCommitByType(ctx, running.Release, CommitApiDocument, running.Service) + if err != nil { + return nil, err + } + if len(commits) == 0 { + continue + } + apiDocCommits = append(apiDocCommits, commits[0].Commit) + } + return apiDocCommits, nil +} + func (s *imlReleaseService) Completeness(partitions []string, apis []string, apiRequestCommits []*commit.Commit[api.Request], proxyCommits []*commit.Commit[api.Proxy], upstreamCommits []*commit.Commit[upstream.Config]) bool { requests := utils.SliceToMap(apiRequestCommits, func(o *commit.Commit[api.Request]) string { @@ -111,7 +134,7 @@ func (s *imlReleaseService) GetLabels(ctx context.Context, ids ...string) map[st } func (s *imlReleaseService) GetApiProxyCommit(ctx context.Context, id string, apiUUID string) (string, error) { - commits, err := s.getCommitByType(ctx, id, CommitApiProxy, apiUUID, CommitApiProxy) + commits, err := s.getCommitByType(ctx, id, CommitApiProxy, apiUUID) if err != nil { return "", err } @@ -122,43 +145,35 @@ func (s *imlReleaseService) GetApiProxyCommit(ctx context.Context, id string, ap return commits[0].Commit, nil } -func (s *imlReleaseService) getCommitByType(ctx context.Context, releaseId, t CommitType, target string, key string) ([]*release.Commit, error) { +func (s *imlReleaseService) getCommitByType(ctx context.Context, releaseId, t CommitType, target string) ([]*release.Commit, error) { where := "`release` = ? and `type` = ? and `target` = ?" args := []interface{}{releaseId, t, target} - if len(key) > 0 { - if len(key) == 1 { - where += " and `key` = ?" - args = append(args, key[0]) - } else { - where += " and `key` in ?" - args = append(args, key) - } - } return s.commitStore.ListQuery(ctx, where, args, "") } -func (s *imlReleaseService) GetApiDocCommit(ctx context.Context, id string, apiUUID string) (string, error) { - commits, err := s.getCommitByType(ctx, id, CommitApiDocument, apiUUID, CommitApiDocument) - if err != nil { - return "", err - } - if len(commits) == 0 { - return "", errors.New("not found") - } - return commits[0].Commit, nil -} +//func (s *imlReleaseService) GetApiDocCommit(ctx context.Context, id string, apiUUID string) (string, error) { +// commits, err := s.getCommitByType(ctx, id, CommitApiDocument, apiUUID, CommitApiDocument) +// if err != nil { +// return "", err +// } +// if len(commits) == 0 { +// return "", errors.New("not found") +// } +// +// return commits[0].Commit, nil +//} -func (s *imlReleaseService) GetRunningApiDocCommit(ctx context.Context, service string, apiUUID string) (string, error) { - running, err := s.releaseRuntime.First(ctx, map[string]interface{}{ - "service": service, - }) - if err != nil { - return "", err - } - return s.GetApiDocCommit(ctx, running.Release, apiUUID) - -} +//func (s *imlReleaseService) GetRunningApiDocCommit(ctx context.Context, service string, apiUUID string) (string, error) { +// running, err := s.releaseRuntime.First(ctx, map[string]interface{}{ +// "service": service, +// }) +// if err != nil { +// return "", err +// } +// return s.GetApiDocCommit(ctx, running.Release, apiUUID) +// +//} func (s *imlReleaseService) GetRunningApiProxyCommit(ctx context.Context, service string, apiUUID string) (string, error) { running, err := s.releaseRuntime.First(ctx, map[string]interface{}{ @@ -266,10 +281,10 @@ 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, apiDocCommits, serviceDocCommits map[string]string, upstreams map[string]map[string]string) (*Release, error) { +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) { operator := utils.UserId(ctx) releaseId := uuid.NewString() - commits := make([]*release.Commit, 0, len(apisProxyCommits)+len(apiDocCommits)+len(upstreams)) + commits := make([]*release.Commit, 0, len(apisProxyCommits)+len(upstreams)+2) for apiId, commitUUID := range apiRequestCommit { commits = append(commits, &release.Commit{ Type: CommitApiRequest, @@ -288,15 +303,7 @@ func (s *imlReleaseService) CreateRelease(ctx context.Context, service string, v Commit: commitUUID, }) } - for apiId, commitUUID := range apiDocCommits { - commits = append(commits, &release.Commit{ - Type: CommitApiDocument, - Target: apiId, - Release: releaseId, - Key: CommitApiDocument, - Commit: commitUUID, - }) - } + for upId, upstreamsByPartition := range upstreams { for partition, commitUUID := range upstreamsByPartition { commits = append(commits, &release.Commit{ @@ -308,6 +315,26 @@ func (s *imlReleaseService) CreateRelease(ctx context.Context, service string, v }) } } + if apiDocCommit != "" { + commits = append(commits, &release.Commit{ + Type: CommitApiDocument, + Target: service, + Release: releaseId, + Key: CommitApiDocument, + Commit: apiDocCommit, + }) + } + + if serviceDocCommit != "" { + commits = append(commits, &release.Commit{ + Type: CommitServiceDoc, + Target: service, + Release: releaseId, + Key: CommitServiceDoc, + Commit: serviceDocCommit, + }) + } + ev := &release.Release{ Id: 0, UUID: releaseId, @@ -416,18 +443,18 @@ func (s *imlReleaseService) List(ctx context.Context, service string) ([]*Releas return utils.SliceToSlice(list, FromEntity), nil } -func (s *imlReleaseService) GetReleaseInfos(ctx context.Context, id string) ([]*APICommit, []*APICommit, []*APICommit, []*UpstreamCommit, error) { +func (s *imlReleaseService) GetReleaseInfos(ctx context.Context, id string) ([]*APICommit, []*APICommit, *APICommit, []*UpstreamCommit, *ServiceCommit, error) { commits, err := s.commitStore.List(ctx, map[string]interface{}{ "release": id, }) if err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } apiRequestCommits := make([]*APICommit, 0, len(commits)) apiProxyCommits := make([]*APICommit, 0, len(commits)) - apiDocumentCommits := make([]*APICommit, 0, len(commits)) + var apiDocCommit *APICommit upstreamCommits := make([]*UpstreamCommit, 0, len(commits)) - + var serviceDocCommit *ServiceCommit for _, v := range commits { switch v.Type { case CommitApiRequest: @@ -444,11 +471,11 @@ func (s *imlReleaseService) GetReleaseInfos(ctx context.Context, id string) ([]* }) case CommitApiDocument: - apiDocumentCommits = append(apiDocumentCommits, &APICommit{ + apiDocCommit = &APICommit{ Release: v.Release, API: v.Target, Commit: v.Commit, - }) + } case CommitUpstream: upstreamCommits = append(upstreamCommits, &UpstreamCommit{ @@ -457,11 +484,17 @@ func (s *imlReleaseService) GetReleaseInfos(ctx context.Context, id string) ([]* Partition: v.Key, Commit: v.Commit, }) + case CommitServiceDoc: + serviceDocCommit = &ServiceCommit{ + Release: v.Release, + Service: v.Target, + Commit: v.Commit, + } } } - return apiRequestCommits, apiProxyCommits, apiDocumentCommits, upstreamCommits, nil + return apiRequestCommits, apiProxyCommits, apiDocCommit, upstreamCommits, serviceDocCommit, nil } func (s *imlReleaseService) GetRunning(ctx context.Context, service string) (*Release, error) { diff --git a/service/release/model.go b/service/release/model.go index 226d3eaa..2d93af74 100644 --- a/service/release/model.go +++ b/service/release/model.go @@ -32,6 +32,12 @@ type APICommit struct { Commit string } +type ServiceCommit struct { + Release string + Service string + Commit string +} + type UpstreamCommit struct { Release string Upstream string diff --git a/service/release/service.go b/service/release/service.go index a01e7955..b248d275 100644 --- a/service/release/service.go +++ b/service/release/service.go @@ -14,14 +14,13 @@ 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, apiDocCommits, serviceDocCommits map[string]string, upstreams map[string]map[string]string) (*Release, error) + 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) // DeleteRelease 删除发布 DeleteRelease(ctx context.Context, id string) error List(ctx context.Context, service string) ([]*Release, error) - GetReleaseInfos(ctx context.Context, id string) ([]*APICommit, []*APICommit, []*APICommit, []*UpstreamCommit, error) + GetReleaseInfos(ctx context.Context, id string) ([]*APICommit, []*APICommit, *APICommit, []*UpstreamCommit, *ServiceCommit, error) GetCommits(ctx context.Context, id string) ([]*ProjectCommits, error) - - GetRunningApiDocCommit(ctx context.Context, service string, apiUUID string) (string, error) + GetRunningApiDocCommits(ctx context.Context, serviceIds ...string) ([]string, error) GetRunningApiProxyCommit(ctx context.Context, service string, apiUUID string) (string, error) Completeness(partitions []string, apis []string, requestCommits []*commit.Commit[api.Request], proxyCommits []*commit.Commit[api.Proxy], upstreamCommits []*commit.Commit[upstream.Config]) bool diff --git a/service/service-doc/iml.go b/service/service-doc/iml.go index c3a119b6..ddfcf67a 100644 --- a/service/service-doc/iml.go +++ b/service/service-doc/iml.go @@ -19,12 +19,24 @@ type imlDocService struct { commitService commit.ICommitWithKeyService[DocCommit] `autowired:""` } +func (i *imlDocService) GetDocCommit(ctx context.Context, commitId string) (*commit.Commit[DocCommit], error) { + return i.commitService.Get(ctx, commitId) +} + +func (i *imlDocService) ListLatestDocCommit(ctx context.Context, serviceIds ...string) ([]*commit.Commit[DocCommit], error) { + return i.commitService.ListLatest(ctx, serviceIds...) +} + +func (i *imlDocService) ListDocCommit(ctx context.Context, commitIds ...string) ([]*commit.Commit[DocCommit], error) { + return i.commitService.List(ctx, commitIds...) +} + func (i *imlDocService) LatestDocCommit(ctx context.Context, serviceId string) (*commit.Commit[DocCommit], error) { return i.commitService.Latest(ctx, serviceId) } -func (i *imlDocService) CommitDoc(ctx context.Context, serviceId string, data *DocCommit) error { - return i.commitService.Save(ctx, serviceId, data) +func (i *imlDocService) CommitDoc(ctx context.Context, serviceId string, data *Doc) error { + return i.commitService.Save(ctx, serviceId, &DocCommit{Content: data.Doc}) } func (i *imlDocService) List(ctx context.Context, sids ...string) ([]*Doc, error) { diff --git a/service/service-doc/service.go b/service/service-doc/service.go index e08e4241..109bae1f 100644 --- a/service/service-doc/service.go +++ b/service/service-doc/service.go @@ -17,8 +17,12 @@ type IDocService interface { } type IDocCommitService interface { + CommitDoc(ctx context.Context, serviceId string, data *Doc) error + GetDocCommit(ctx context.Context, commitId string) (*commit.Commit[DocCommit], error) + // LatestDocCommit 获取最新文档 LatestDocCommit(ctx context.Context, serviceId string) (*commit.Commit[DocCommit], error) - CommitDoc(ctx context.Context, serviceId string, data *DocCommit) error + ListLatestDocCommit(ctx context.Context, serviceIds ...string) ([]*commit.Commit[DocCommit], error) + ListDocCommit(ctx context.Context, commitIds ...string) ([]*commit.Commit[DocCommit], error) } func init() { diff --git a/stores/universally/commit/commit.go b/stores/universally/commit/commit.go index 898e9a0f..3edfe664 100644 --- a/stores/universally/commit/commit.go +++ b/stores/universally/commit/commit.go @@ -7,7 +7,7 @@ type Commit[H any] struct { UUID string `gorm:"size:36;not null;column:uuid;comment:uuid;uniqueIndex:uuid;"` Target string `gorm:"column:target;type:varchar(36);NOT NULL;comment:目标id;index:target;"` Key string `gorm:"size:36;not null;column:key;comment:类型;index:key;"` - Data *H `gorm:"type:text;not null;column:data;comment:数据;serializer:json"` + Data *H `gorm:"type:text;not null;column:data;comment:数据;charset=utf8mb4;serializer:json"` CreateAt time.Time `gorm:"type:timestamp;NOT NULL;DEFAULT:CURRENT_TIMESTAMP;column:create_at;comment:创建时间"` Operator string `gorm:"size:36;not null;column:operator;comment:操作人;index:operator;"` }