diff --git a/apiserver/graph/generated/generated.go b/apiserver/graph/generated/generated.go index 075f4fefd..9e178de29 100644 --- a/apiserver/graph/generated/generated.go +++ b/apiserver/graph/generated/generated.go @@ -813,6 +813,7 @@ type ComplexityRoot struct { Filedetail struct { Count func(childComplexity int) int FileType func(childComplexity int) int + LatestVersion func(childComplexity int) int Path func(childComplexity int) int Phase func(childComplexity int) int Size func(childComplexity int) int @@ -4845,6 +4846,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Filedetail.FileType(childComplexity), true + case "filedetail.latestVersion": + if e.complexity.Filedetail.LatestVersion == nil { + break + } + + return e.complexity.Filedetail.LatestVersion(childComplexity), true + case "filedetail.path": if e.complexity.Filedetail.Path == nil { break @@ -6760,6 +6768,11 @@ type filedetail{ 文件版本,""或者"null"的情况表示是文件最新版本。 """ version: String! + + """ + 文件最新版本 + """ + latestVersion: String! } """ @@ -35704,6 +35717,50 @@ func (ec *executionContext) fieldContext_filedetail_version(ctx context.Context, return fc, nil } +func (ec *executionContext) _filedetail_latestVersion(ctx context.Context, field graphql.CollectedField, obj *Filedetail) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_filedetail_latestVersion(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.LatestVersion, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_filedetail_latestVersion(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "filedetail", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _filegroup_source(ctx context.Context, field graphql.CollectedField, obj *Filegroup) (ret graphql.Marshaler) { fc, err := ec.fieldContext_filegroup_source(ctx, field) if err != nil { @@ -35950,6 +36007,8 @@ func (ec *executionContext) fieldContext_filegroupdetail_filedetails(ctx context return ec.fieldContext_filedetail_phase(ctx, field) case "version": return ec.fieldContext_filedetail_version(ctx, field) + case "latestVersion": + return ec.fieldContext_filedetail_latestVersion(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type filedetail", field.Name) }, @@ -47808,6 +47867,11 @@ func (ec *executionContext) _filedetail(ctx context.Context, sel ast.SelectionSe if out.Values[i] == graphql.Null { out.Invalids++ } + case "latestVersion": + out.Values[i] = ec._filedetail_latestVersion(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } diff --git a/apiserver/graph/generated/models_gen.go b/apiserver/graph/generated/models_gen.go index 6306d5e26..7f4c6e10d 100644 --- a/apiserver/graph/generated/models_gen.go +++ b/apiserver/graph/generated/models_gen.go @@ -2152,6 +2152,8 @@ type Filedetail struct { Phase string `json:"phase"` // 文件版本,""或者"null"的情况表示是文件最新版本。 Version string `json:"version"` + // 文件最新版本 + LatestVersion string `json:"latestVersion"` } // 文件组 diff --git a/apiserver/graph/schema/knowledgebase.gql b/apiserver/graph/schema/knowledgebase.gql index a409bfad1..103bfd9f5 100644 --- a/apiserver/graph/schema/knowledgebase.gql +++ b/apiserver/graph/schema/knowledgebase.gql @@ -47,6 +47,7 @@ query listKnowledgeBases($input: ListKnowledgeBaseInput!){ updateTimestamp timeCost version + latestVersion } } } @@ -100,6 +101,7 @@ query getKnowledgeBase($name: String!, $namespace: String!) { updateTimestamp timeCost version + latestVersion } } } @@ -151,6 +153,7 @@ mutation createKnowledgeBase($input: CreateKnowledgeBaseInput!) { updateTimestamp timeCost version + latestVersion } } } @@ -202,6 +205,7 @@ mutation updateKnowledgeBase($input: UpdateKnowledgeBaseInput) { updateTimestamp timeCost version + latestVersion } } } diff --git a/apiserver/graph/schema/knowledgebase.graphqls b/apiserver/graph/schema/knowledgebase.graphqls index 0b6c3f91f..6d57acd35 100644 --- a/apiserver/graph/schema/knowledgebase.graphqls +++ b/apiserver/graph/schema/knowledgebase.graphqls @@ -62,6 +62,11 @@ type filedetail{ 文件版本,""或者"null"的情况表示是文件最新版本。 """ version: String! + + """ + 文件最新版本 + """ + latestVersion: String! } """ diff --git a/apiserver/pkg/knowledgebase/knowledgebase.go b/apiserver/pkg/knowledgebase/knowledgebase.go index 08478e704..b38c6a5af 100644 --- a/apiserver/pkg/knowledgebase/knowledgebase.go +++ b/apiserver/pkg/knowledgebase/knowledgebase.go @@ -20,8 +20,10 @@ import ( "context" "errors" "fmt" + "path/filepath" "time" + "github.com/minio/minio-go/v7" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/pointer" @@ -29,6 +31,7 @@ import ( "github.com/kubeagi/arcadia/api/base/v1alpha1" "github.com/kubeagi/arcadia/apiserver/graph/generated" + pkgclient "github.com/kubeagi/arcadia/apiserver/pkg/client" "github.com/kubeagi/arcadia/apiserver/pkg/common" graphqlutils "github.com/kubeagi/arcadia/apiserver/pkg/utils" "github.com/kubeagi/arcadia/pkg/config" @@ -97,12 +100,32 @@ func knowledgebase2model(ctx context.Context, c client.Client, knowledgebase *v1 }) } if len(knowledgebase.Status.FileGroupDetail) > 0 { + systemClient, _ := pkgclient.GetClient(nil) + oss, _ := common.SystemDatasourceOSS(ctx, systemClient) + for _, filegroupdetail := range knowledgebase.Status.FileGroupDetail { ns := knowledgebase.Namespace if filegroupdetail.Source.Namespace != nil { ns = *filegroupdetail.Source.Namespace } + var vsBasePath string + if filegroupdetail.Source.Kind == "VersionedDataset" { + versioneddataset := &v1alpha1.VersionedDataset{} + if err := c.Get(ctx, types.NamespacedName{Name: filegroupdetail.Source.Name, Namespace: ns}, versioneddataset); err == nil { + if versioneddataset.Spec.Dataset != nil && versioneddataset.Status.IsReady() { + vsBasePath = filepath.Join("dataset", versioneddataset.Spec.Dataset.Name, versioneddataset.Spec.Version) + } + } + } for _, detail := range filegroupdetail.FileDetails { + var detailStat minio.ObjectInfo + if vsBasePath != "" && oss != nil { + info := &v1alpha1.OSS{Bucket: ns, Object: filepath.Join(vsBasePath, detail.Path)} + detailInfo, err := oss.StatFile(ctx, info) + if err == nil { + detailStat, _ = detailInfo.(minio.ObjectInfo) + } + } key := fmt.Sprintf("%s/%s/%s", ns, filegroupdetail.Source.Name, detail.Path) if v, ok := cache[key]; ok { filegroupdetails[v[0]].Filedetails[v[1]] = &generated.Filedetail{ @@ -114,6 +137,7 @@ func knowledgebase2model(ctx context.Context, c client.Client, knowledgebase *v1 TimeCost: int(detail.TimeCost), UpdateTimestamp: new(time.Time), Version: detail.Version, + LatestVersion: detailStat.VersionID, } *filegroupdetails[v[0]].Filedetails[v[1]].UpdateTimestamp = detail.LastUpdateTime.Time }