Skip to content

Commit 2df1385

Browse files
committed
feat(spec): Parse securitySchemes + root security into Spec
1 parent 94100e8 commit 2df1385

3 files changed

Lines changed: 71 additions & 3 deletions

File tree

src/main/java/com/retailsvc/http/spec/Spec.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.retailsvc.http.spec.schema.Schema;
44
import com.retailsvc.http.spec.schema.SchemaParser;
5+
import com.retailsvc.http.spec.security.SecurityRequirement;
6+
import com.retailsvc.http.spec.security.SecurityScheme;
7+
import com.retailsvc.http.spec.security.SecuritySchemeParser;
58
import java.io.IOException;
69
import java.io.UncheckedIOException;
710
import java.lang.reflect.Method;
@@ -25,7 +28,9 @@ public record Spec(
2528
String basePath,
2629
Map<String, Schema> schemaRefIndex,
2730
Map<String, Parameter> parameterRefIndex,
28-
Map<String, Object> extensions) {
31+
Map<String, Object> extensions,
32+
Map<String, SecurityScheme> securitySchemes,
33+
List<SecurityRequirement> security) {
2934

3035
private static final String SCHEMA_KEY = "schema";
3136
private static final String SCHEMA_REF_PREFIX = "#/components/schemas/";
@@ -138,6 +143,15 @@ public static Spec from(Map<String, Object> raw) {
138143
List<Operation> operations =
139144
parseOperations(
140145
(Map<String, Object>) raw.getOrDefault("paths", Map.of()), componentParameters);
146+
Map<String, Object> rawSchemes =
147+
(Map<String, Object>) rawComponents.getOrDefault("securitySchemes", Map.of());
148+
Map<String, SecurityScheme> securitySchemes = new LinkedHashMap<>();
149+
for (var entry : rawSchemes.entrySet()) {
150+
securitySchemes.put(
151+
entry.getKey(), SecuritySchemeParser.parse((Map<String, Object>) entry.getValue()));
152+
}
153+
List<SecurityRequirement> rootSecurity =
154+
SecuritySchemeParser.parseRequirements((List<Object>) raw.get("security"));
141155
return new Spec(
142156
openapi,
143157
info,
@@ -148,7 +162,9 @@ public static Spec from(Map<String, Object> raw) {
148162
computeBasePath(servers),
149163
indexByRef(componentSchemas, SCHEMA_REF_PREFIX),
150164
indexByRef(componentParameters, PARAMETER_REF_PREFIX),
151-
extractExtensions(raw));
165+
extractExtensions(raw),
166+
Map.copyOf(securitySchemes),
167+
rootSecurity);
152168
}
153169

154170
private static String computeBasePath(List<Server> servers) {

src/test/java/com/retailsvc/http/internal/RequestPreparationFilterTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ private Spec specWith(Operation... ops) {
5858
"",
5959
Map.of(),
6060
Map.of(),
61-
Map.of());
61+
Map.of(),
62+
Map.of(),
63+
List.of());
6264
}
6365

6466
private Filter newFilter(Spec spec) {

src/test/java/com/retailsvc/http/spec/SpecTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,54 @@ void parsesExistingFixture() throws Exception {
7070
Spec spec = Spec.from(loadJson("openapi.json"));
7171
assertThat(spec.operations()).isNotEmpty();
7272
}
73+
74+
@Test
75+
void parsesSecuritySchemesFromComponents() {
76+
Map<String, Object> raw =
77+
Map.of(
78+
"openapi", "3.1.0",
79+
"info", Map.of("title", "T", "version", "1"),
80+
"servers", List.of(Map.of("url", "/v1")),
81+
"paths", Map.of(),
82+
"components",
83+
Map.of(
84+
"securitySchemes",
85+
Map.of(
86+
"apiKeyAuth",
87+
Map.of("type", "apiKey", "name", "X-API-Key", "in", "header"))));
88+
89+
Spec spec = Spec.from(raw);
90+
91+
assertThat(spec.securitySchemes()).containsKey("apiKeyAuth");
92+
}
93+
94+
@Test
95+
void parsesRootSecurity() {
96+
Map<String, Object> raw =
97+
Map.of(
98+
"openapi", "3.1.0",
99+
"info", Map.of("title", "T", "version", "1"),
100+
"servers", List.of(Map.of("url", "/v1")),
101+
"paths", Map.of(),
102+
"security", List.of(Map.of("bearerAuth", List.of())));
103+
104+
Spec spec = Spec.from(raw);
105+
106+
assertThat(spec.security()).hasSize(1);
107+
}
108+
109+
@Test
110+
void securitySchemesDefaultsEmpty() {
111+
Map<String, Object> raw =
112+
Map.of(
113+
"openapi", "3.1.0",
114+
"info", Map.of("title", "T", "version", "1"),
115+
"servers", List.of(Map.of("url", "/v1")),
116+
"paths", Map.of());
117+
118+
Spec spec = Spec.from(raw);
119+
120+
assertThat(spec.securitySchemes()).isEmpty();
121+
assertThat(spec.security()).isEmpty();
122+
}
73123
}

0 commit comments

Comments
 (0)