@@ -19,6 +19,7 @@ package restapi
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "log"
22
23
"path/filepath"
23
24
"regexp"
24
25
"strings"
@@ -29,6 +30,7 @@ import (
29
30
"github.com/minio/console/restapi/operations"
30
31
"github.com/minio/console/restapi/operations/user_api"
31
32
mc "github.com/minio/mc/cmd"
33
+ "github.com/minio/mc/pkg/probe"
32
34
"github.com/minio/minio-go/v7"
33
35
)
34
36
@@ -62,12 +64,16 @@ func getListObjectsResponse(session *models.Principal, params user_api.ListObjec
62
64
defer cancel ()
63
65
var prefix string
64
66
var recursive bool
67
+ var withVersions bool
65
68
if params .Prefix != nil {
66
69
prefix = * params .Prefix
67
70
}
68
71
if params .Recursive != nil {
69
72
recursive = * params .Recursive
70
73
}
74
+ if params .WithVersions != nil {
75
+ withVersions = * params .WithVersions
76
+ }
71
77
// bucket request needed to proceed
72
78
if params .BucketName == "" {
73
79
return nil , prepareError (errBucketNameNotInRequest )
@@ -80,7 +86,7 @@ func getListObjectsResponse(session *models.Principal, params user_api.ListObjec
80
86
// defining the client to be used
81
87
minioClient := minioClient {client : mClient }
82
88
83
- objs , err := listBucketObjects (ctx , minioClient , params .BucketName , prefix , recursive )
89
+ objs , err := listBucketObjects (ctx , minioClient , params .BucketName , prefix , recursive , withVersions )
84
90
if err != nil {
85
91
return nil , prepareError (err )
86
92
}
@@ -93,17 +99,50 @@ func getListObjectsResponse(session *models.Principal, params user_api.ListObjec
93
99
}
94
100
95
101
// listBucketObjects gets an array of objects in a bucket
96
- func listBucketObjects (ctx context.Context , client MinioClient , bucketName string , prefix string , recursive bool ) ([]* models.BucketObject , error ) {
102
+ func listBucketObjects (ctx context.Context , client MinioClient , bucketName string , prefix string , recursive , withVersions bool ) ([]* models.BucketObject , error ) {
97
103
var objects []* models.BucketObject
98
- for lsObj := range client .listObjects (ctx , bucketName , minio.ListObjectsOptions {Prefix : prefix , Recursive : recursive }) {
104
+ for lsObj := range client .listObjects (ctx , bucketName , minio.ListObjectsOptions {Prefix : prefix , Recursive : recursive , WithVersions : withVersions }) {
99
105
if lsObj .Err != nil {
100
106
return nil , lsObj .Err
101
107
}
102
108
obj := & models.BucketObject {
103
- Name : lsObj .Key ,
104
- Size : lsObj .Size ,
105
- LastModified : lsObj .LastModified .String (),
106
- ContentType : lsObj .ContentType ,
109
+ Name : lsObj .Key ,
110
+ Size : lsObj .Size ,
111
+ LastModified : lsObj .LastModified .String (),
112
+ ContentType : lsObj .ContentType ,
113
+ VersionID : lsObj .VersionID ,
114
+ IsLatest : lsObj .IsLatest ,
115
+ IsDeleteMarker : lsObj .IsDeleteMarker ,
116
+ UserTags : lsObj .UserTags ,
117
+ }
118
+ if ! lsObj .IsDeleteMarker {
119
+ // Add Legal Hold Status if available
120
+ legalHoldStatus , err := client .getObjectLegalHold (ctx , bucketName , lsObj .Key , minio.GetObjectLegalHoldOptions {VersionID : lsObj .VersionID })
121
+ if err != nil {
122
+ errResp := minio .ToErrorResponse (probe .NewError (err ).ToGoError ())
123
+ if errResp .Code != "NoSuchObjectLockConfiguration" {
124
+ log .Printf ("error getting legal hold status for %s : %s" , lsObj .VersionID , err )
125
+ }
126
+
127
+ } else {
128
+ if legalHoldStatus != nil {
129
+ obj .LegalHoldStatus = string (* legalHoldStatus )
130
+ }
131
+ }
132
+ // Add Retention Status if available
133
+ retention , retUntilDate , err := client .getObjectRetention (ctx , bucketName , lsObj .Key , lsObj .VersionID )
134
+ if err != nil {
135
+ errResp := minio .ToErrorResponse (probe .NewError (err ).ToGoError ())
136
+ if errResp .Code != "NoSuchObjectLockConfiguration" {
137
+ log .Printf ("error getting retention status for %s : %s" , lsObj .VersionID , err )
138
+ }
139
+ } else {
140
+ if retention != nil && retUntilDate != nil {
141
+ date := * retUntilDate
142
+ obj .RetentionMode = string (* retention )
143
+ obj .RetentionUntilDate = date .String ()
144
+ }
145
+ }
107
146
}
108
147
objects = append (objects , obj )
109
148
}
0 commit comments