Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## [8.4.0] — 2026-08-29

### Added

- `delete(String id)` — deletes a previously processed file
(`DELETE /v2.2/files/{id}`). Returns `true` on success; its trace is unaffected.
- `deleteTrace(String id)` — deletes the processing trace separately
(`DELETE /v2.2/files/{id}/trace`). Returns `true` on success.

## [8.3.0] — 2026-08-14

### Changed
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ System.out.printf("findings: %s%n", result.getFindings());
| `processFromUrl(URI location)` | Synchronous remote-URL scan |
| `processFromUrl(URI location, Map<String,String> metadata)` | Remote-URL scan with metadata |
| `retrieve(String id)` | Retrieve previous scan result |
| `delete(String id)` | Delete a previous scan result |
| `deleteTrace(String id)` | Delete the processing trace for a previous scan result |
| `retrieveTrace(String id)` | Retrieve ordered processing events for a result (preview) |
| `fetch(String location)` | Server-side async fetch-and-scan of a remote URL |
| `ping()` | Health check |
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/scanii/ScaniiClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,24 @@ public interface ScaniiClient {
*/
Optional<ScaniiProcessingResult> retrieve(String id);

/**
* Deletes a previously processed file. Its processing trace is unaffected.
*
* @param id id of the previously processed content
* @return true when the resource was deleted
* @see <a href="https://scanii.github.io/openapi/v22/">spec</a>
*/
boolean delete(String id);

/**
* Deletes the processing trace for a previously processed file.
*
* @param id id of the previously processed content
* @return true when the trace was deleted
* @see <a href="https://scanii.github.io/openapi/v22/">spec</a>
*/
boolean deleteTrace(String id);

/**
* Retrieves the processing trace for a previously processed file.
* Returns an ordered list of events describing each stage of the processing pipeline.
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/com/scanii/internal/DefaultScaniiClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,36 @@ public Optional<ScaniiProcessingResult> retrieve(String id) {
return Optional.of(result);
}

@Override
public boolean delete(String id) {
Objects.requireNonNull(id, "resource id cannot be null");

HttpRequest req = newRequestBuilder(target.resolve("/v2.2/files/" + id))
.DELETE()
.build();
HttpResponse<String> response = send(req);

if (response.statusCode() != 204) {
parseAndThrowError(response);
}
return true;
}

@Override
public boolean deleteTrace(String id) {
Objects.requireNonNull(id, "resource id cannot be null");

HttpRequest req = newRequestBuilder(target.resolve("/v2.2/files/" + id + "/trace"))
.DELETE()
.build();
HttpResponse<String> response = send(req);

if (response.statusCode() != 204) {
parseAndThrowError(response);
}
return true;
}

@Override
public Optional<ScaniiTraceResult> retrieveTrace(String id) {
Objects.requireNonNull(id, "resource id cannot be null");
Expand Down
22 changes: 22 additions & 0 deletions src/test/java/com/scanii/ScaniiClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,28 @@ void testRetrieveTraceUnknownId() {
assertTrue(opt.isEmpty());
}

@Test
void testDelete() throws Exception {
ScaniiProcessingResult processed = client.process(Systems.randomFile(1024));
assertNotNull(processed.getResourceId());

assertTrue(client.delete(processed.getResourceId()));
assertTrue(client.retrieve(processed.getResourceId()).isEmpty());
assertTrue(client.retrieveTrace(processed.getResourceId()).isPresent());
assertTrue(client.deleteTrace(processed.getResourceId()));
assertTrue(client.retrieveTrace(processed.getResourceId()).isEmpty());
}

@Test
void testDeleteUnknownId() {
assertThrows(ScaniiException.class, () -> client.delete("doesnotexist"));
}

@Test
void testDeleteTraceUnknownId() {
assertThrows(ScaniiException.class, () -> client.deleteTrace("doesnotexist"));
}

@Test
void testProcessFromUrl() throws Exception {
// scanii-cli serves the EICAR file at this well-known path
Expand Down