Skip to content

Commit 0e7f72d

Browse files
committed
feat!: Add apiKey support to API requests
- Introduced `apiKey` field for secure authentication in configuration and API requests. - Updated clear and task APIs to accept enhanced request objects. - Added required tests and assertions for `apiKey` handling across all request types. - Refactored HTTP operations to include `apiKey` in request headers. - Introduced new classes for managing authentication details. Fixes #187 Signed-off-by: Eric Deandrea <[email protected]>
1 parent 3abe88d commit 0e7f72d

36 files changed

+717
-142
lines changed
Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ai.docling.serve.api;
22

3-
import ai.docling.serve.api.clear.request.ClearRequest;
3+
import ai.docling.serve.api.clear.request.ClearConvertersRequest;
4+
import ai.docling.serve.api.clear.request.ClearResultsRequest;
45
import ai.docling.serve.api.clear.response.ClearResponse;
56

67
/**
@@ -11,23 +12,27 @@
1112
*/
1213
public interface DoclingServeClearApi {
1314
/**
14-
* Clears all registered converters associated with the API.
15-
* This method removes any previously configured or cached converters,
16-
* effectively resetting the converter state to an uninitialized state.
17-
* After invoking this method, no converters will be available until new ones are added or configured.
15+
* Clears all currently configured converters within the Docling Serve API.
16+
* This operation removes any registered converters, effectively resetting
17+
* the system to a state without active converter configurations.
18+
*
19+
* @param request an instance of {@link ClearConvertersRequest} containing
20+
* the authentication details required to authorize this operation.
21+
* @return a {@link ClearResponse} object indicating the status of the clear
22+
* operation, such as success or failure.
1823
*/
19-
ClearResponse clearConverters();
24+
ClearResponse clearConverters(ClearConvertersRequest request);
2025

2126
/**
22-
* Clears stored results based on the specified {@link ClearRequest}.
27+
* Clears stored results based on the specified {@link ClearResultsRequest}.
2328
* This method removes results that match the criteria provided in the
2429
* request, such as results older than a specified duration.
2530
*
26-
* @param request an instance of {@link ClearRequest} containing the criteria
31+
* @param request an instance of {@link ClearResultsRequest} containing the criteria
2732
* for clearing stored results, including the duration threshold
2833
* or other parameters.
2934
* @return a {@link ClearResponse} object indicating the status of the clear
3035
* operation, such as success or failure.
3136
*/
32-
ClearResponse clearResults(ClearRequest request);
37+
ClearResponse clearResults(ClearResultsRequest request);
3338
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package ai.docling.serve.api.auth;
2+
3+
/**
4+
* Represents a request that requires authentication for secure access to resources.
5+
*
6+
* Implementations of this interface define a contract for providing authentication
7+
* details associated with the request. This is used to ensure authorized interaction
8+
* with APIs or protected services.
9+
*
10+
* Methods:
11+
* - {@code getAuthentication()}: Retrieves the {@link Authentication} details
12+
* required to authorize the request.
13+
*/
14+
public interface AuthenticatedRequest {
15+
/**
16+
* Retrieves the authentication details associated with the request.
17+
*
18+
* This method provides the {@link Authentication} object required to authorize
19+
* interaction with secure resources or APIs. Implementations should ensure
20+
* the returned object contains the necessary credentials for successful
21+
* authentication.
22+
*
23+
* @return an {@link Authentication} instance containing the authentication
24+
* details required for the request, or {@code null} if authentication
25+
* is not applicable.
26+
*/
27+
Authentication getAuthentication();
28+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ai.docling.serve.api.auth;
2+
3+
import org.jspecify.annotations.Nullable;
4+
5+
/**
6+
* Represents authentication details required for secure API usage.
7+
*
8+
* The {@code Authentication} class encapsulates the necessary credentials
9+
* for accessing restricted resources, such as an API key. It is designed
10+
* to be immutable and thread-safe.
11+
*
12+
* This class uses Lombok annotations to provide a builder pattern, generate
13+
* a getter for its fields, and produce a string representation.
14+
*
15+
* Features:
16+
* - {@code apiKey}: Optional API key to authorize requests.
17+
*/
18+
@lombok.Builder(toBuilder = true)
19+
@lombok.Getter
20+
@lombok.ToString
21+
public class Authentication {
22+
/**
23+
* Represents an optional API key used to authenticate requests to a secure service.
24+
*
25+
* This field is nullable, indicating that the API key may not always be provided
26+
* or required, depending on the specific use case or configuration of the client.
27+
* When present, the API key is used to authorize access to restricted resources.
28+
*/
29+
@Nullable
30+
private String apiKey;
31+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@NullMarked
2+
package ai.docling.serve.api.auth;
3+
4+
import org.jspecify.annotations.NullMarked;

docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/chunk/request/HierarchicalChunkDocumentRequest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
import org.jspecify.annotations.Nullable;
66

7+
import com.fasterxml.jackson.annotation.JsonIgnore;
78
import com.fasterxml.jackson.annotation.JsonInclude;
89
import com.fasterxml.jackson.annotation.JsonProperty;
910
import com.fasterxml.jackson.annotation.JsonSetter;
1011
import com.fasterxml.jackson.annotation.Nulls;
1112

13+
import ai.docling.serve.api.auth.AuthenticatedRequest;
14+
import ai.docling.serve.api.auth.Authentication;
1215
import ai.docling.serve.api.chunk.request.options.HierarchicalChunkerOptions;
1316
import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions;
1417
import ai.docling.serve.api.convert.request.source.Source;
@@ -24,7 +27,7 @@
2427
@lombok.Builder(toBuilder = true)
2528
@lombok.Getter
2629
@lombok.ToString
27-
public class HierarchicalChunkDocumentRequest {
30+
public class HierarchicalChunkDocumentRequest implements AuthenticatedRequest {
2831

2932
@JsonProperty("sources")
3033
@JsonSetter(nulls = Nulls.AS_EMPTY)
@@ -48,6 +51,11 @@ public class HierarchicalChunkDocumentRequest {
4851
@lombok.Builder.Default
4952
private HierarchicalChunkerOptions chunkingOptions = HierarchicalChunkerOptions.builder().build();
5053

54+
@JsonIgnore
55+
@lombok.NonNull
56+
@lombok.Builder.Default
57+
private Authentication authentication = Authentication.builder().build();
58+
5159
@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
5260
public static class Builder { }
5361

docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/chunk/request/HybridChunkDocumentRequest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
import org.jspecify.annotations.Nullable;
66

7+
import com.fasterxml.jackson.annotation.JsonIgnore;
78
import com.fasterxml.jackson.annotation.JsonInclude;
89
import com.fasterxml.jackson.annotation.JsonProperty;
910
import com.fasterxml.jackson.annotation.JsonSetter;
1011
import com.fasterxml.jackson.annotation.Nulls;
1112

13+
import ai.docling.serve.api.auth.AuthenticatedRequest;
14+
import ai.docling.serve.api.auth.Authentication;
1215
import ai.docling.serve.api.chunk.request.options.HybridChunkerOptions;
1316
import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions;
1417
import ai.docling.serve.api.convert.request.source.Source;
@@ -24,7 +27,7 @@
2427
@lombok.Builder(toBuilder = true)
2528
@lombok.Getter
2629
@lombok.ToString
27-
public class HybridChunkDocumentRequest {
30+
public class HybridChunkDocumentRequest implements AuthenticatedRequest {
2831

2932
@JsonProperty("sources")
3033
@JsonSetter(nulls = Nulls.AS_EMPTY)
@@ -48,6 +51,11 @@ public class HybridChunkDocumentRequest {
4851
@lombok.Builder.Default
4952
private HybridChunkerOptions chunkingOptions = HybridChunkerOptions.builder().build();
5053

54+
@JsonIgnore
55+
@lombok.NonNull
56+
@lombok.Builder.Default
57+
private Authentication authentication = Authentication.builder().build();
58+
5159
@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
5260
public static class Builder { }
5361

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ai.docling.serve.api.clear.request;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
5+
import ai.docling.serve.api.auth.AuthenticatedRequest;
6+
import ai.docling.serve.api.auth.Authentication;
7+
8+
/**
9+
* Represents a request to clear or reset configured converters using the Docling Serve API.
10+
*
11+
* This class provides a mechanism to manage converter configurations through explicit
12+
* reset operations. It includes authentication information required to authorize the request.
13+
*
14+
* Features:
15+
* - {@code authentication}: Provides the authentication details needed to validate
16+
* and authorize the reset operation. A default authentication instance is used
17+
* when none is explicitly provided.
18+
*
19+
* This class is immutable and can be constructed or modified using a builder
20+
* that is generated via Lombok annotations.
21+
*/
22+
@lombok.Builder(toBuilder = true)
23+
@lombok.Getter
24+
@lombok.ToString
25+
public class ClearConvertersRequest implements AuthenticatedRequest {
26+
@JsonIgnore
27+
@lombok.NonNull
28+
@lombok.Builder.Default
29+
private Authentication authentication = Authentication.builder().build();
30+
}

docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/clear/request/ClearRequest.java renamed to docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/clear/request/ClearResultsRequest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
import java.time.Duration;
44

5+
import com.fasterxml.jackson.annotation.JsonIgnore;
6+
7+
import ai.docling.serve.api.auth.AuthenticatedRequest;
8+
import ai.docling.serve.api.auth.Authentication;
9+
510
/**
611
* Represents a request to clear stale data via the Docling Serve Clear API.
712
* This class provides a mechanism to specify a threshold duration, after which data
@@ -17,7 +22,7 @@
1722
@lombok.Builder(toBuilder = true)
1823
@lombok.Getter
1924
@lombok.ToString
20-
public class ClearRequest {
25+
public class ClearResultsRequest implements AuthenticatedRequest {
2126
/**
2227
* Represents the default duration used as a threshold for clearing stale results
2328
* or data in the Docling Serve Clear API. Results older than this duration
@@ -30,4 +35,9 @@ public class ClearRequest {
3035
@lombok.NonNull
3136
@lombok.Builder.Default
3237
private Duration olderThen = DEFAULT_OLDER_THAN;
38+
39+
@JsonIgnore
40+
@lombok.NonNull
41+
@lombok.Builder.Default
42+
private Authentication authentication = Authentication.builder().build();
3343
}

docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/request/ConvertDocumentRequest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
import org.jspecify.annotations.Nullable;
66

7+
import com.fasterxml.jackson.annotation.JsonIgnore;
78
import com.fasterxml.jackson.annotation.JsonInclude;
89
import com.fasterxml.jackson.annotation.JsonProperty;
910
import com.fasterxml.jackson.annotation.JsonSetter;
1011
import com.fasterxml.jackson.annotation.Nulls;
1112

13+
import ai.docling.serve.api.auth.AuthenticatedRequest;
14+
import ai.docling.serve.api.auth.Authentication;
1215
import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions;
1316
import ai.docling.serve.api.convert.request.source.Source;
1417
import ai.docling.serve.api.convert.request.target.Target;
@@ -27,7 +30,7 @@
2730
@lombok.Builder(toBuilder = true)
2831
@lombok.Getter
2932
@lombok.ToString
30-
public class ConvertDocumentRequest {
33+
public class ConvertDocumentRequest implements AuthenticatedRequest {
3134
@JsonProperty("sources")
3235
@JsonSetter(nulls = Nulls.AS_EMPTY)
3336
@lombok.Singular
@@ -42,6 +45,11 @@ public class ConvertDocumentRequest {
4245
@Nullable
4346
private Target target;
4447

48+
@JsonIgnore
49+
@lombok.NonNull
50+
@lombok.Builder.Default
51+
private Authentication authentication = Authentication.builder().build();
52+
4553
@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
4654
public static class Builder { }
4755
}

docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/task/request/TaskResultRequest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package ai.docling.serve.api.task.request;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
5+
import ai.docling.serve.api.auth.AuthenticatedRequest;
6+
import ai.docling.serve.api.auth.Authentication;
7+
38
/**
49
* Represents a request to retrieve the result of a task.
510
*
@@ -15,7 +20,12 @@
1520
@lombok.Builder(toBuilder = true)
1621
@lombok.Getter
1722
@lombok.ToString
18-
public class TaskResultRequest {
23+
public class TaskResultRequest implements AuthenticatedRequest {
1924
@lombok.NonNull
2025
private String taskId;
26+
27+
@JsonIgnore
28+
@lombok.NonNull
29+
@lombok.Builder.Default
30+
private Authentication authentication = Authentication.builder().build();
2131
}

0 commit comments

Comments
 (0)