Skip to content

Commit 0543ee8

Browse files
authored
Merge pull request #11 from aboutbits/ab-253-extract-swagger-utilities-to-our-backend-lib
Ab 253 extract swagger utilities to our backend lib
2 parents 669ed8b + af7de53 commit 0543ee8

15 files changed

Lines changed: 304 additions & 7 deletions

File tree

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@
3636
<artifactId>spring-boot-starter-json</artifactId>
3737
</dependency>
3838

39+
<dependency>
40+
<groupId>org.springframework.security</groupId>
41+
<artifactId>spring-security-core</artifactId>
42+
</dependency>
43+
3944
<!-- Utilities -->
4045
<dependency>
4146
<groupId>org.projectlombok</groupId>

src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/swagger/RegisterCustomTypesWithSwagger.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package it.aboutbits.springboot.toolbox.autoconfiguration.swagger;
22

3-
import it.aboutbits.springboot.toolbox.swagger.CustomTypeModelConverter;
4-
import it.aboutbits.springboot.toolbox.swagger.CustomTypePropertyCustomizer;
3+
import it.aboutbits.springboot.toolbox.swagger.type.CustomTypeModelConverter;
4+
import it.aboutbits.springboot.toolbox.swagger.type.CustomTypePropertyCustomizer;
55
import org.springframework.context.annotation.Import;
66

77
import java.lang.annotation.ElementType;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package it.aboutbits.springboot.toolbox.mvc.response;
2+
3+
import org.springframework.lang.Nullable;
4+
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
public record ErrorResponse(
9+
@Nullable String message,
10+
@Nullable Map<String, List<String>> errors
11+
) {
12+
13+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package it.aboutbits.springboot.toolbox.mvc.response;
2+
3+
import lombok.NonNull;
4+
5+
public record ItemResponse<T>(@NonNull T data) {
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package it.aboutbits.springboot.toolbox.mvc.response;
2+
3+
import lombok.NonNull;
4+
5+
import java.util.List;
6+
7+
public record ListResponse<T>(@NonNull List<T> data) {
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package it.aboutbits.springboot.toolbox.mvc.response;
2+
3+
import lombok.NonNull;
4+
import org.springframework.data.domain.Page;
5+
6+
import java.util.List;
7+
8+
public record PagedResponse<T>(
9+
@NonNull
10+
List<T> data,
11+
@NonNull
12+
MetaWithPagination meta
13+
) {
14+
15+
public record MetaWithPagination(
16+
@NonNull
17+
Pagination pagination
18+
) {
19+
public record Pagination(long page, int size, long totalElements) {
20+
public static Pagination of(@NonNull Page<?> page) {
21+
return new Pagination(
22+
page.getNumber(),
23+
page.getSize(),
24+
page.getTotalElements()
25+
);
26+
}
27+
}
28+
}
29+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package it.aboutbits.springboot.toolbox.swagger.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.METHOD})
9+
@Retention(RetentionPolicy.RUNTIME)
10+
public @interface SwaggerScopedAuth {
11+
String value();
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package it.aboutbits.springboot.toolbox.swagger.customization.alphabetical_model_order;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import org.springdoc.core.customizers.OpenApiCustomizer;
5+
6+
import java.util.TreeMap;
7+
8+
public class OrderModelsCustomizer implements OpenApiCustomizer {
9+
@Override
10+
public void customise(OpenAPI openApi) {
11+
var components = openApi.getComponents();
12+
13+
components.schemas(new TreeMap<>(components.getSchemas()));
14+
}
15+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package it.aboutbits.springboot.toolbox.swagger.customization.authorization_docs;
2+
3+
import io.swagger.v3.oas.models.Operation;
4+
import it.aboutbits.springboot.toolbox.swagger.annotations.SwaggerScopedAuth;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springdoc.core.customizers.OperationCustomizer;
7+
import org.springframework.security.access.prepost.PreAuthorize;
8+
import org.springframework.web.method.HandlerMethod;
9+
10+
import java.util.ArrayList;
11+
import java.util.Optional;
12+
13+
@Slf4j
14+
public class AuthorizationDescriptor implements OperationCustomizer {
15+
@Override
16+
public Operation customize(Operation operation, HandlerMethod handlerMethod) {
17+
try {
18+
var additionalDescription = new ArrayList<String>();
19+
20+
var maybeAnnotation = Optional.ofNullable(handlerMethod.getMethodAnnotation(PreAuthorize.class));
21+
if (maybeAnnotation.isPresent()) {
22+
var annotation = maybeAnnotation.get();
23+
additionalDescription.add("<b>Authorization:</b> " + annotation.value());
24+
}
25+
26+
var maybeAnnotation2 = Optional.ofNullable(handlerMethod.getMethodAnnotation(SwaggerScopedAuth.class));
27+
if (maybeAnnotation2.isPresent()) {
28+
var annotation = maybeAnnotation2.get();
29+
additionalDescription.add("<b>Scoped Authorization:</b> " + annotation.value());
30+
}
31+
32+
if (!additionalDescription.isEmpty()) {
33+
34+
var currentDescription = Optional.ofNullable(operation.getDescription());
35+
36+
var description = String.join("<br />", additionalDescription);
37+
if (currentDescription.isPresent()) {
38+
description = "<p>" + description + "</p>" + currentDescription.get();
39+
}
40+
41+
operation.description(
42+
description
43+
);
44+
}
45+
} catch (Exception e) {
46+
log.error("Error when creating swagger documentation for authorities.", e);
47+
}
48+
return operation;
49+
}
50+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package it.aboutbits.springboot.toolbox.swagger.customization.default_not_null;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import io.swagger.v3.oas.models.media.Schema;
5+
import org.springdoc.core.customizers.OpenApiCustomizer;
6+
7+
import java.util.ArrayList;
8+
9+
public class NullableCustomizer implements OpenApiCustomizer {
10+
@Override
11+
@SuppressWarnings("unchecked")
12+
public void customise(OpenAPI openApi) {
13+
openApi.getComponents().getSchemas().values()
14+
.forEach(schema -> {
15+
var requiredProperties = new ArrayList<String>();
16+
((Schema<?>) schema).getProperties().forEach((propertyName, property) -> {
17+
if (property.getNullable() == null || !property.getNullable()) {
18+
requiredProperties.add(propertyName);
19+
}
20+
});
21+
schema.setRequired(requiredProperties);
22+
});
23+
}
24+
}

0 commit comments

Comments
 (0)