diff --git a/controller/catalogue/iml.go b/controller/catalogue/iml.go index 56dfb0c1..f75e111d 100644 --- a/controller/catalogue/iml.go +++ b/controller/catalogue/iml.go @@ -3,6 +3,7 @@ package catalogue import ( "github.com/APIParkLab/APIPark/module/catalogue" catalogue_dto "github.com/APIParkLab/APIPark/module/catalogue/dto" + "github.com/APIParkLab/APIPark/module/service" "github.com/APIParkLab/APIPark/module/tag" tag_dto "github.com/APIParkLab/APIPark/module/tag/dto" "github.com/gin-gonic/gin" @@ -14,6 +15,7 @@ var ( type imlCatalogueController struct { catalogueModule catalogue.ICatalogueModule `autowired:""` + appModule service.IAppModule `autowired:""` tagModule tag.ITagModule `autowired:""` } @@ -26,7 +28,17 @@ func (i *imlCatalogueController) Subscribe(ctx *gin.Context, subscribeInfo *cata } func (i *imlCatalogueController) ServiceDetail(ctx *gin.Context, sid string) (*catalogue_dto.ServiceDetail, error) { - return i.catalogueModule.ServiceDetail(ctx, sid) + detail, err := i.catalogueModule.ServiceDetail(ctx, sid) + if err != nil { + return nil, err + } + _, canSubscribe, err := i.appModule.SearchCanSubscribe(ctx, sid) + if err != nil { + return nil, err + } + detail.CanSubscribe = canSubscribe + return detail, nil + } func (i *imlCatalogueController) Search(ctx *gin.Context, keyword string) ([]*catalogue_dto.Item, []*tag_dto.Item, error) { diff --git a/controller/service/iml.go b/controller/service/iml.go index 489d66e2..e912ac9f 100644 --- a/controller/service/iml.go +++ b/controller/service/iml.go @@ -542,8 +542,9 @@ type imlAppController struct { authModule application_authorization.IAuthorizationModule `autowired:""` } -func (i *imlAppController) SearchCanSubscribe(ctx *gin.Context, serviceId string) ([]*service_dto.SimpleAppItem, error) { - return i.module.SearchCanSubscribe(ctx, serviceId) +func (i *imlAppController) SearchCanSubscribe(ctx *gin.Context, serviceId string) ([]*service_dto.SubscribeAppItem, error) { + items, _, err := i.module.SearchCanSubscribe(ctx, serviceId) + return items, err } func (i *imlAppController) Search(ctx *gin.Context, teamId string, keyword string) ([]*service_dto.AppItem, error) { diff --git a/controller/service/service.go b/controller/service/service.go index e3be79f8..196d1bed 100644 --- a/controller/service/service.go +++ b/controller/service/service.go @@ -44,7 +44,7 @@ type IAppController interface { // SimpleApps 获取简易项目列表 SimpleApps(ctx *gin.Context, keyword string) ([]*service_dto.SimpleAppItem, error) MySimpleApps(ctx *gin.Context, keyword string) ([]*service_dto.SimpleAppItem, error) - SearchCanSubscribe(ctx *gin.Context, keyword string) ([]*service_dto.SimpleAppItem, error) + SearchCanSubscribe(ctx *gin.Context, serviceId string) ([]*service_dto.SubscribeAppItem, error) GetApp(ctx *gin.Context, appId string) (*service_dto.App, error) DeleteApp(ctx *gin.Context, appId string) error } diff --git a/module/catalogue/dto/output.go b/module/catalogue/dto/output.go index 7a050438..0f52d445 100644 --- a/module/catalogue/dto/output.go +++ b/module/catalogue/dto/output.go @@ -32,6 +32,7 @@ type ServiceDetail struct { OpenAPIAddress string `json:"openapi_address"` MCPServerAddress string `json:"mcp_server_address"` MCPAccessConfig string `json:"mcp_access_config"` + CanSubscribe bool `json:"can_subscribe"` } type ServiceBasic struct { diff --git a/module/service/dto/output.go b/module/service/dto/output.go index 35a80cbe..d4a8a68b 100644 --- a/module/service/dto/output.go +++ b/module/service/dto/output.go @@ -86,6 +86,12 @@ type SimpleAppItem struct { Description string `json:"description"` } +type SubscribeAppItem struct { + Id string `json:"id"` + Name string `json:"name"` + IsSubscribed bool `json:"is_subscribed"` +} + type Service struct { Id string `json:"id"` Name string `json:"name"` diff --git a/module/service/iml.go b/module/service/iml.go index 72d233dd..9ba88250 100644 --- a/module/service/iml.go +++ b/module/service/iml.go @@ -861,65 +861,70 @@ type imlAppModule struct { transaction store.ITransaction `autowired:""` } -func (i *imlAppModule) SearchCanSubscribe(ctx context.Context, serviceId string) ([]*service_dto.SimpleAppItem, error) { +func (i *imlAppModule) SearchCanSubscribe(ctx context.Context, serviceId string) ([]*service_dto.SubscribeAppItem, bool, error) { apps, err := i.searchMyApps(ctx, "", "") if err != nil { - return nil, err - } - list, err := i.roleService.ListByPermit(ctx, access.SystemWorkspaceApplicationManagerAll) - if err == nil && len(list) > 0 { - return utils.SliceToSlice(apps, func(p *service.Service) *service_dto.SimpleAppItem { - return &service_dto.SimpleAppItem{ - Id: p.Id, - Name: p.Name, - Description: p.Description, - Team: auto.UUID(p.Team), - } - }), nil - } - list, err = i.roleService.ListByPermit(ctx, access.TeamConsumerSubscriptionSubscribe) - if err != nil { - return nil, nil - } - roleIds := utils.SliceToSlice(list, func(p *role.RoleByPermit) string { - return p.Id - }) - members, err := i.roleMemberService.ListByRoleIds(ctx, utils.UserId(ctx), roleIds...) - if err != nil { - return nil, err - } - if len(members) == 0 { - return nil, nil + return nil, false, err } subscribes, err := i.subscribeService.ListByServices(ctx, serviceId) if err != nil { - return nil, err + return nil, false, err } subscribeMap := utils.SliceToMapO(subscribes, func(p *subscribe.Subscribe) (string, struct{}) { return p.Application, struct{}{} }, func(s *subscribe.Subscribe) bool { return s.ApplyStatus == subscribe.ApplyStatusSubscribe }) + canSubscribe := false + list, err := i.roleService.ListByPermit(ctx, access.SystemWorkspaceApplicationManagerAll) + if err == nil && len(list) > 0 { + return utils.SliceToSlice(apps, func(p *service.Service) *service_dto.SubscribeAppItem { + _, isSubscribed := subscribeMap[p.Id] + if !isSubscribed { + canSubscribe = true + } + return &service_dto.SubscribeAppItem{ + Id: p.Id, + Name: p.Name, + IsSubscribed: isSubscribed, + } + }), canSubscribe, nil + } + list, err = i.roleService.ListByPermit(ctx, access.TeamConsumerSubscriptionSubscribe) + if err != nil { + return nil, false, nil + } + roleIds := utils.SliceToSlice(list, func(p *role.RoleByPermit) string { + return p.Id + }) + members, err := i.roleMemberService.ListByRoleIds(ctx, utils.UserId(ctx), roleIds...) + if err != nil { + return nil, false, err + } + if len(members) == 0 { + return nil, false, nil + } + teamMap := utils.SliceToMapO(members, func(p *role.Member) (string, struct{}) { return role.TrimTeamTarget(p.Target), struct{}{} }) - result := make([]*service_dto.SimpleAppItem, 0, len(apps)) + result := make([]*service_dto.SubscribeAppItem, 0, len(apps)) for _, app := range apps { if _, ok := teamMap[app.Team]; !ok { continue } - if _, ok := subscribeMap[app.Id]; ok { - continue + _, isSubscribed := subscribeMap[app.Id] + if !isSubscribed { + canSubscribe = true } - result = append(result, &service_dto.SimpleAppItem{ - Id: app.Id, - Name: app.Name, - Description: app.Description, - Team: auto.UUID(app.Team), + result = append(result, &service_dto.SubscribeAppItem{ + Id: app.Id, + Name: app.Name, + IsSubscribed: isSubscribed, }) } - return result, nil + return result, canSubscribe, nil } func (i *imlAppModule) ExportAll(ctx context.Context) ([]*service_dto.ExportApp, error) { diff --git a/module/service/module.go b/module/service/module.go index 93fbcbf1..8f0c709c 100644 --- a/module/service/module.go +++ b/module/service/module.go @@ -51,7 +51,7 @@ type IAppModule interface { UpdateApp(ctx context.Context, appId string, input *service_dto.UpdateApp) (*service_dto.App, error) Search(ctx context.Context, teamId string, keyword string) ([]*service_dto.AppItem, error) SearchMyApps(ctx context.Context, teamId string, keyword string) ([]*service_dto.AppItem, error) - SearchCanSubscribe(ctx context.Context, serviceId string) ([]*service_dto.SimpleAppItem, error) + SearchCanSubscribe(ctx context.Context, serviceId string) ([]*service_dto.SubscribeAppItem, bool, error) // SimpleApps 获取简易项目列表 SimpleApps(ctx context.Context, keyword string) ([]*service_dto.SimpleAppItem, error) MySimpleApps(ctx context.Context, keyword string) ([]*service_dto.SimpleAppItem, error)