@@ -18,6 +18,7 @@ import (
1818 "path"
1919 "regexp"
2020 "strings"
21+ "path/filepath"
2122
2223 "github.com/Tencent/bk-bcs/bcs-common/pkg/odm/operator"
2324 "github.com/feiin/go-xss"
@@ -214,6 +215,69 @@ func (t *TemplateAction) List(ctx context.Context, templateSpaceID string) ([]ma
214215 return m , nil
215216}
216217
218+ // ListTemplateMetadataVersions 通过模板文件夹 ID 获取模板文件列表(含版本 ID 和版本号)
219+ func (t * TemplateAction ) ListTemplateMetadataVersions (ctx context.Context , spaceID string ) (
220+ []map [string ]interface {}, error ) {
221+ if err := t .checkAccess (ctx ); err != nil {
222+ return nil , err
223+ }
224+
225+ p , err := project .FromContext (ctx )
226+ if err != nil {
227+ return nil , err
228+ }
229+
230+ templateSpace , err := t .model .GetTemplateSpace (ctx , spaceID )
231+ if err != nil {
232+ return nil , err
233+ }
234+
235+ // 权限校验
236+ if templateSpace .ProjectCode != p .Code {
237+ return nil , errorx .New (errcode .NoPerm , i18n .GetMsg (ctx , "无权限访问" ))
238+ }
239+
240+ // 通过项目编码、文件夹名称检索模板元数据
241+ cond := operator .NewLeafCondition (operator .Eq , operator.M {
242+ entity .FieldKeyProjectCode : p .Code ,
243+ entity .FieldKeyTemplateSpace : templateSpace .Name ,
244+ })
245+ templates , err := t .model .ListTemplate (ctx , cond )
246+ if err != nil {
247+ return nil , err
248+ }
249+
250+ // 获取该文件夹下所有版本信息
251+ versions , err := t .model .ListTemplateVersion (ctx , operator .NewLeafCondition (operator .Eq , operator.M {
252+ entity .FieldKeyProjectCode : p .Code ,
253+ entity .FieldKeyTemplateSpace : templateSpace .Name ,
254+ }))
255+ if err != nil {
256+ return nil , err
257+ }
258+
259+ // 存放模板文件,及版本号列表
260+ m := make ([]map [string ]interface {}, 0 )
261+ for _ , value := range templates {
262+ mm := map [string ]interface {}{
263+ "templateName" : filepath .Join (templateSpace .Name , value .Name ),
264+ "latestVersion" : value .Version ,
265+ "versionList" : []map [string ]interface {}{},
266+ }
267+ // 匹配当前模板的版本信息,填充 versionID 和 version
268+ for _ , v := range versions {
269+ if v .TemplateName == value .Name {
270+ mm ["versionList" ] = append (mm ["versionList" ].([]map [string ]interface {}), map [string ]interface {}{
271+ "version" : v .Version ,
272+ "versionID" : v .ID .Hex (),
273+ })
274+ }
275+ }
276+ m = append (m , mm )
277+ }
278+ return m , nil
279+ }
280+
217281// Create xxx
218282// nolint:funlen
219283func (t * TemplateAction ) Create (ctx context.Context , req * clusterRes.CreateTemplateMetadataReq ) (
0 commit comments