Skip to content

Commit

Permalink
feat: support recursive resource listing (#196)
Browse files Browse the repository at this point in the history
  • Loading branch information
artsiomkorzun authored Feb 6, 2024
1 parent 594c121 commit b600948
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,20 @@ protected Future<?> handle(ResourceDescription descriptor) {
private Future<?> getMetadata(ResourceDescription descriptor) {
String token;
int limit;
boolean recursive;

try {
token = context.getRequest().getParam("token");
limit = Integer.parseInt(context.getRequest().getParam("limit", "100"));
recursive = Boolean.parseBoolean(context.getRequest().getParam("recursive", "false"));
if (limit < 0 || limit > 1000) {
throw new IllegalArgumentException("Limit is out of allowed range");
}
} catch (Throwable error) {
return context.respond(HttpStatus.BAD_REQUEST, "Bad query parameters. Limit must be in [0, 1000] range");
return context.respond(HttpStatus.BAD_REQUEST, "Bad query parameters. Limit must be in [0, 1000] range. Recursive must be true/false");
}

return vertx.executeBlocking(() -> service.getMetadata(descriptor, token, limit))
return vertx.executeBlocking(() -> service.getMetadata(descriptor, token, limit, recursive))
.onSuccess(result -> {
if (result == null) {
context.respond(HttpStatus.NOT_FOUND, "Not found: " + descriptor.getUrl());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,15 @@ public void close() {
}

@Nullable
public MetadataBase getMetadata(ResourceDescription descriptor, String token, int limit) {
public MetadataBase getMetadata(ResourceDescription descriptor, String token, int limit, boolean recursive) {
return descriptor.isFolder()
? getFolderMetadata(descriptor, token, limit)
? getFolderMetadata(descriptor, token, limit, recursive)
: getItemMetadata(descriptor);
}

private ResourceFolderMetadata getFolderMetadata(ResourceDescription descriptor, String token, int limit) {
private ResourceFolderMetadata getFolderMetadata(ResourceDescription descriptor, String token, int limit, boolean recursive) {
String blobKey = blobKey(descriptor);
PageSet<? extends StorageMetadata> set = blobStore.list(blobKey, token, limit);
PageSet<? extends StorageMetadata> set = blobStore.list(blobKey, token, limit, recursive);

if (set.isEmpty() && !descriptor.isRootFolder()) {
return null;
Expand Down
11 changes: 8 additions & 3 deletions src/main/java/com/epam/aidial/core/storage/BlobStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,16 @@ public MetadataBase listMetadata(ResourceDescription resource) {
}
}

public PageSet<? extends StorageMetadata> list(String absoluteFilePath, String afterMarker, int maxResults) {
public PageSet<? extends StorageMetadata> list(String absoluteFilePath, String afterMarker, int maxResults, boolean recursive) {
ListContainerOptions options = new ListContainerOptions()
.prefix(absoluteFilePath)
.maxResults(maxResults)
.delimiter(BlobStorageUtil.PATH_SEPARATOR);
.maxResults(maxResults);

if (recursive) {
options.recursive();
} else {
options.delimiter(BlobStorageUtil.PATH_SEPARATOR);
}

if (afterMarker != null) {
options.afterMarker(afterMarker);
Expand Down
3 changes: 3 additions & 0 deletions src/test/java/com/epam/aidial/core/ResourceApiTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@ void testWorkflow() {
response = request(HttpMethod.PUT, "/folder/conversation", "12345");
verifyNotExact(response, 200, "\"url\":\"conversations/3CcedGxCx23EwiVbVmscVktScRyf46KypuBQ65miviST/folder/conversation\"");

response = metadata("/?recursive=true");
verifyNotExact(response, 200, "\"url\":\"conversations/3CcedGxCx23EwiVbVmscVktScRyf46KypuBQ65miviST/folder/conversation\"");

response = request(HttpMethod.PUT, "/folder/conversation", "12345", "if-none-match", "*");
verifyNotExact(response, 409, "Resource already exists: conversations/3CcedGxCx23EwiVbVmscVktScRyf46KypuBQ65miviST/folder/conversation");

Expand Down

0 comments on commit b600948

Please sign in to comment.