Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

feat(user-service): Re-evaluate Spring Boot code generated by OpenAPI Generator #705

Merged
merged 64 commits into from
Sep 27, 2022
Merged
Changes from 1 commit
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
a496e22
Add auto-generated openapitools.json
tschaffter Sep 14, 2022
71f2ce9
Add yarn plugin `outdated`
tschaffter Sep 14, 2022
f9044b0
Generate API stub for Spring Boot
tschaffter Sep 14, 2022
cf8bfcb
Add generator configuration to openapitools.json
tschaffter Sep 15, 2022
93db484
Enable delegate pattern
tschaffter Sep 15, 2022
cc6a222
Set base and config package name
tschaffter Sep 15, 2022
f5a9256
Name generated files based on tag
tschaffter Sep 15, 2022
7700127
Add template for application class
tschaffter Sep 15, 2022
bb04f2b
Start API stub with Gradle
tschaffter Sep 16, 2022
3f3b52f
Disable testing of the user service for now
tschaffter Sep 16, 2022
cc12f69
Add files to .openapi-generator-ignore
tschaffter Sep 16, 2022
2630aed
Give more control over templates
tschaffter Sep 16, 2022
3068ea1
Update AUTHORS.md
tschaffter Sep 17, 2022
9563744
Upgrade to Spring Boot 2.7.3
tschaffter Sep 17, 2022
cfae750
Rename app class
tschaffter Sep 17, 2022
c7e347d
Review app class
tschaffter Sep 17, 2022
f0e4d92
Update fasterxml dependencies
tschaffter Sep 17, 2022
089c478
Merge `main`
tschaffter Sep 19, 2022
2009b44
Merge `main`
tschaffter Sep 20, 2022
2b117f2
Add project task `generate-code`
tschaffter Sep 20, 2022
efb7634
Move package version to `gradle.properties`
tschaffter Sep 20, 2022
2252e21
Update to spotless 6.11.0
tschaffter Sep 20, 2022
b373141
Remove server folder
tschaffter Sep 20, 2022
65f3ee5
Use application.yml
tschaffter Sep 21, 2022
e3eb019
Add Flyway dependencies
tschaffter Sep 21, 2022
324822f
Add exception package
tschaffter Sep 21, 2022
fa68d3f
Update openapi-generator-ignore
tschaffter Sep 21, 2022
de0454b
Rename tag to User
tschaffter Sep 21, 2022
2a68a3e
UserStatus has its own class
tschaffter Sep 21, 2022
3f20917
Fix DB seeding with Flyway
tschaffter Sep 21, 2022
38ed3ec
Add Flyway gradle plugin
tschaffter Sep 21, 2022
d659865
Fix table with flywaClean
tschaffter Sep 21, 2022
6aa5f2e
Rename project task to `openapi-generate`
tschaffter Sep 21, 2022
d02b178
Add `@lombok.Builder` to DTO classes
tschaffter Sep 21, 2022
c0c63e1
Add annotation `@lombok.Builder` to POJO
tschaffter Sep 22, 2022
5f1560f
Add repository package
tschaffter Sep 22, 2022
3721579
Add response models
tschaffter Sep 22, 2022
3f7b242
Add Keycloak configuration
tschaffter Sep 22, 2022
ab4ecff
Add KeycloakUserService
tschaffter Sep 22, 2022
1e9928c
Add Dto suffix
tschaffter Sep 22, 2022
df2d0bb
Set library to `spring-boot`
tschaffter Sep 22, 2022
36315a9
Restore hot reload for spring app
tschaffter Sep 22, 2022
2e8888d
Remove Dto model suffix to increase user-friendliness
tschaffter Sep 22, 2022
a83db98
Minor update
tschaffter Sep 22, 2022
afff64d
Find a solution to Pageable
tschaffter Sep 23, 2022
fabcf11
Specify app class in build.gradle
tschaffter Sep 23, 2022
c4ac5a2
Move spec to folder `api-spec`
tschaffter Sep 23, 2022
b07dab0
Update UserEntity
tschaffter Sep 23, 2022
b7bf7e6
Add Dto suffix to model
tschaffter Sep 23, 2022
2e22bdf
Minor update
tschaffter Sep 23, 2022
8b028b0
Refactor listUsers
tschaffter Sep 23, 2022
10c4e18
Can fetch list of all users! 🚀
tschaffter Sep 23, 2022
586a554
Cleanup
tschaffter Sep 23, 2022
4768946
Add script to pull raw openapi templates
tschaffter Sep 26, 2022
ca0a72f
Fix schema name (#732)
tschaffter Sep 26, 2022
f2bbb27
Update listUsers
tschaffter Sep 26, 2022
877e28c
Restore actuator
tschaffter Sep 26, 2022
f928d8a
Cleanup
tschaffter Sep 26, 2022
bca810f
Add method to get one user
tschaffter Sep 26, 2022
c201f36
Configure Eureka client
tschaffter Sep 26, 2022
6b45c08
Configure security but allow all requests for now
tschaffter Sep 26, 2022
c5e3d35
Can now register user
tschaffter Sep 27, 2022
1df2f6c
Rename session.sql
tschaffter Sep 27, 2022
8e0360a
Update `.gitignore`
tschaffter Sep 27, 2022
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
Prev Previous commit
Next Next commit
Enable delegate pattern
  • Loading branch information
tschaffter committed Sep 15, 2022
commit 93db4843b33631b33a0496f497372970c53d421a
8 changes: 7 additions & 1 deletion apps/challenge-user-service/openapitools.json
Original file line number Diff line number Diff line change
@@ -7,7 +7,13 @@
"challenge-user-service": {
"generatorName": "spring",
"output": "server",
"inputSpec": "openapi.yaml"
"inputSpec": "openapi.yaml",
"apiPackage": "org.sagebionetworks.challenge.api",
"modelPackage": "org.sagebionetworks.challenge.model.dto",
"templateDir": "templates",
"additionalProperties": {
"delegatePattern": true
}
}
}
}
11 changes: 6 additions & 5 deletions apps/challenge-user-service/server/.openapi-generator/FILES
Original file line number Diff line number Diff line change
@@ -3,13 +3,14 @@ README.md
pom.xml
src/main/java/org/openapitools/OpenApiGeneratorApplication.java
src/main/java/org/openapitools/RFC3339DateFormat.java
src/main/java/org/openapitools/api/ApiApi.java
src/main/java/org/openapitools/api/ApiApiController.java
src/main/java/org/openapitools/api/ApiUtil.java
src/main/java/org/openapitools/configuration/HomeController.java
src/main/java/org/openapitools/configuration/SpringDocConfiguration.java
src/main/java/org/openapitools/model/User.java
src/main/java/org/openapitools/model/UserUpdateRequest.java
src/main/java/org/sagebionetworks/challenge/api/ApiApi.java
src/main/java/org/sagebionetworks/challenge/api/ApiApiController.java
src/main/java/org/sagebionetworks/challenge/api/ApiApiDelegate.java
src/main/java/org/sagebionetworks/challenge/api/ApiUtil.java
src/main/java/org/sagebionetworks/challenge/model/dto/User.java
src/main/java/org/sagebionetworks/challenge/model/dto/UserUpdateRequest.java
src/main/resources/application.properties
src/main/resources/openapi.yaml
src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"org.openapitools", "org.openapitools.api" , "org.openapitools.configuration"})
@ComponentScan(basePackages = {"org.openapitools", "org.sagebionetworks.challenge.api" , "org.openapitools.configuration"})
public class OpenApiGeneratorApplication {

public static void main(String[] args) {
Original file line number Diff line number Diff line change
@@ -3,10 +3,10 @@
* https://openapi-generator.tech
* Do not edit the class manually.
*/
package org.openapitools.api;
package org.sagebionetworks.challenge.api;

import org.openapitools.model.User;
import org.openapitools.model.UserUpdateRequest;
import org.sagebionetworks.challenge.model.dto.User;
import org.sagebionetworks.challenge.model.dto.UserUpdateRequest;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
@@ -15,29 +15,25 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.annotation.Generated;

@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-14T23:46:16.887276700Z[Etc/UTC]")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-15T17:33:42.298982800Z[Etc/UTC]")
@Validated
@Tag(name = "api", description = "the api API")
@RequestMapping("${openapi.user.base-path:}")
public interface ApiApi {

default Optional<NativeWebRequest> getRequest() {
return Optional.empty();
default ApiApiDelegate getDelegate() {
return new ApiApiDelegate() {};
}

/**
@@ -64,17 +60,7 @@ default Optional<NativeWebRequest> getRequest() {
default ResponseEntity<User> createUser(
@Parameter(name = "User", description = "", required = true) @Valid @RequestBody User user
) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

return getDelegate().createUser(user);
}


@@ -101,17 +87,7 @@ default ResponseEntity<User> createUser(
default ResponseEntity<User> getUser(
@Parameter(name = "id", description = "", required = true) @PathVariable("id") Long id
) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

return getDelegate().getUser(id);
}


@@ -142,17 +118,7 @@ default ResponseEntity<List<User>> listUsers(
@Min(1) @Parameter(name = "size", description = "The size of the page to be returned") @Valid @RequestParam(value = "size", required = false, defaultValue = "20") Integer size,
@Parameter(name = "sort", description = "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.") @Valid @RequestParam(value = "sort", required = false) List<String> sort
) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

return getDelegate().listUsers(page, size, sort);
}


@@ -182,17 +148,7 @@ default ResponseEntity<User> updateUser(
@Parameter(name = "id", description = "", required = true) @PathVariable("id") Long id,
@Parameter(name = "UserUpdateRequest", description = "", required = true) @Valid @RequestBody UserUpdateRequest userUpdateRequest
) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

return getDelegate().updateUser(id, userUpdateRequest);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.openapitools.api;
package org.sagebionetworks.challenge.api;

import org.openapitools.model.User;
import org.openapitools.model.UserUpdateRequest;
import org.sagebionetworks.challenge.model.dto.User;
import org.sagebionetworks.challenge.model.dto.UserUpdateRequest;


import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +17,6 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.context.request.NativeWebRequest;

import javax.validation.constraints.*;
import javax.validation.Valid;
@@ -27,20 +26,19 @@
import java.util.Optional;
import javax.annotation.Generated;

@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-14T23:46:16.887276700Z[Etc/UTC]")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-15T17:33:42.298982800Z[Etc/UTC]")
@Controller
public class ApiApiController implements ApiApi {

private final NativeWebRequest request;
private final ApiApiDelegate delegate;

@Autowired
public ApiApiController(NativeWebRequest request) {
this.request = request;
public ApiApiController(@Autowired(required = false) ApiApiDelegate delegate) {
this.delegate = Optional.ofNullable(delegate).orElse(new ApiApiDelegate() {});
}

@Override
public Optional<NativeWebRequest> getRequest() {
return Optional.ofNullable(request);
public ApiApiDelegate getDelegate() {
return delegate;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package org.sagebionetworks.challenge.api;

import org.sagebionetworks.challenge.model.dto.User;
import org.sagebionetworks.challenge.model.dto.UserUpdateRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.annotation.Generated;

/**
* A delegate to be called by the {@link ApiApiController}}.
* Implement this interface with a {@link org.springframework.stereotype.Service} annotated class.
*/
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-15T17:33:42.298982800Z[Etc/UTC]")
public interface ApiApiDelegate {

default Optional<NativeWebRequest> getRequest() {
return Optional.empty();
}

/**
* POST /api/v1/users/register
*
* @param user (required)
* @return OK (status code 200)
* @see ApiApi#createUser
*/
default ResponseEntity<User> createUser(User user) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

}

/**
* GET /api/v1/users/{id}
*
* @param id (required)
* @return OK (status code 200)
* @see ApiApi#getUser
*/
default ResponseEntity<User> getUser(Long id) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

}

/**
* GET /api/v1/users/
*
* @param page Zero-based page index (0..N) (optional, default to 0)
* @param size The size of the page to be returned (optional, default to 20)
* @param sort Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported. (optional)
* @return OK (status code 200)
* @see ApiApi#listUsers
*/
default ResponseEntity<List<User>> listUsers(Integer page,
Integer size,
List<String> sort) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

}

/**
* PATCH /api/v1/users/{id}
*
* @param id (required)
* @param userUpdateRequest (required)
* @return OK (status code 200)
* @see ApiApi#updateUser
*/
default ResponseEntity<User> updateUser(Long id,
UserUpdateRequest userUpdateRequest) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) {
String exampleString = "{ \"password\" : \"password\", \"id\" : 0, \"email\" : \"email\", \"authId\" : \"authId\", \"username\" : \"username\", \"status\" : \"PENDING\" }";
ApiUtil.setExampleResponse(request, "*/*", exampleString);
break;
}
}
});
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.openapitools.api;
package org.sagebionetworks.challenge.api;

import org.springframework.web.context.request.NativeWebRequest;

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.openapitools.model;
package org.sagebionetworks.challenge.model.dto;

import java.net.URI;
import java.util.Objects;
@@ -19,7 +19,7 @@
* User
*/

@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-14T23:46:16.887276700Z[Etc/UTC]")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-15T17:33:42.298982800Z[Etc/UTC]")
public class User {

@JsonProperty("id")
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.openapitools.model;
package org.sagebionetworks.challenge.model.dto;

import java.net.URI;
import java.util.Objects;
@@ -19,7 +19,7 @@
* UserUpdateRequest
*/

@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-14T23:46:16.887276700Z[Etc/UTC]")
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-09-15T17:33:42.298982800Z[Etc/UTC]")
public class UserUpdateRequest {

/**