From 0f3ac2061450d22cbc7ef01618ffb9fa9a828c36 Mon Sep 17 00:00:00 2001 From: Niclas Thobaben Date: Sun, 18 Jul 2021 15:25:15 +0200 Subject: [PATCH] added global header support for client --- .../v0/RegistryEventsApiClientConfig.java | 40 ++ .../v0/RegistryEventsServiceClient.java | 31 ++ .../nclazz/users/v0/UsersApiClientConfig.java | 22 +- .../nclazz/users/v0/UsersServiceClient.java | 43 ++ .../users/v0/client/HealthchecksResource.java | 95 ++++ .../nclazz/users/v0/client/RolesResource.java | 375 ++++++++++++++ .../users/v0/client/UserLoginsResource.java | 99 ++++ .../nclazz/users/v0/client/UsersResource.java | 464 ++++++++++++++++++ examples/example.json | 8 +- src/generators/java-client-generator.js | 7 + templates/jax-rs-config.java.mustache | 19 +- 11 files changed, 1198 insertions(+), 5 deletions(-) create mode 100644 examples/de/nclazz/registry/v0/RegistryEventsApiClientConfig.java create mode 100644 examples/de/nclazz/registry/v0/RegistryEventsServiceClient.java create mode 100644 examples/de/nclazz/users/v0/UsersServiceClient.java create mode 100644 examples/de/nclazz/users/v0/client/HealthchecksResource.java create mode 100644 examples/de/nclazz/users/v0/client/RolesResource.java create mode 100644 examples/de/nclazz/users/v0/client/UserLoginsResource.java create mode 100644 examples/de/nclazz/users/v0/client/UsersResource.java diff --git a/examples/de/nclazz/registry/v0/RegistryEventsApiClientConfig.java b/examples/de/nclazz/registry/v0/RegistryEventsApiClientConfig.java new file mode 100644 index 0000000..3f6c603 --- /dev/null +++ b/examples/de/nclazz/registry/v0/RegistryEventsApiClientConfig.java @@ -0,0 +1,40 @@ +/** + * Auto-generated from apibuilder.io service specification. + * apidoc-version : + * organisation : + * service-version : + * + * Documentation at: + * https://app.apibuilder.io/// + * +**/ +package de.nclazz.registry.v0.client; + +import lombok.*; +import org.glassfish.jersey.client.HttpUrlConnectorProvider; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientRequestContext; +import java.io.IOException; + +@Builder(toBuilder = true) +@With +@Getter +@EqualsAndHashCode +public class RegistryEventsApiClientConfig implements ClientRequestFilter { + + @NonNull + private final String baseUrl; + @Builder.Default + private final Client client = ClientBuilder.newClient() + .register(this) + .property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true); + + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + } + +} \ No newline at end of file diff --git a/examples/de/nclazz/registry/v0/RegistryEventsServiceClient.java b/examples/de/nclazz/registry/v0/RegistryEventsServiceClient.java new file mode 100644 index 0000000..c9991c6 --- /dev/null +++ b/examples/de/nclazz/registry/v0/RegistryEventsServiceClient.java @@ -0,0 +1,31 @@ +/** + * Auto-generated from apibuilder.io service spec. + * apidoc-version : + * organisation : + * service-version : + * + * Documentation at: + * https://app.apibuilder.io/// + * +**/ +package de.nclazz.registry.v0.client; + +import lombok.*; + +import de.nclazz.registry.v0.client.*; + +/** + * Client Lib for de.nclazz.registry.v0.registry_events API service spec. + * + * Registry Event Schema for Kafka Streams. +**/ +public class RegistryEventsServiceClient { + + private final RegistryEventsApiClientConfig config; + + public RegistryEventsServiceClient(@NonNull final RegistryEventsApiClientConfig config) { + this.config = config; + } + + +} \ No newline at end of file diff --git a/examples/de/nclazz/users/v0/UsersApiClientConfig.java b/examples/de/nclazz/users/v0/UsersApiClientConfig.java index 3a948a9..3ca5820 100644 --- a/examples/de/nclazz/users/v0/UsersApiClientConfig.java +++ b/examples/de/nclazz/users/v0/UsersApiClientConfig.java @@ -8,22 +8,38 @@ * https://app.apibuilder.io/// * **/ -package de.nclazz.users.v0; +package de.nclazz.users.v0.client; import lombok.*; +import org.glassfish.jersey.client.HttpUrlConnectorProvider; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientRequestContext; +import java.io.IOException; @Builder(toBuilder = true) @With @Getter @EqualsAndHashCode -public class UsersApiClientConfig { +public class UsersApiClientConfig implements ClientRequestFilter { @NonNull private final String baseUrl; @Builder.Default - private final Client client = ClientBuilder.newClient(); + private final Client client = ClientBuilder.newClient() + .register(this) + .property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true); + + /** Service for user management and authentication. + **/ + @NonNull + private String xSomething; + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + requestContext.getHeaders().add("x-something", this.xSomething); + } } \ No newline at end of file diff --git a/examples/de/nclazz/users/v0/UsersServiceClient.java b/examples/de/nclazz/users/v0/UsersServiceClient.java new file mode 100644 index 0000000..051a0c0 --- /dev/null +++ b/examples/de/nclazz/users/v0/UsersServiceClient.java @@ -0,0 +1,43 @@ +/** + * Auto-generated from apibuilder.io service spec. + * apidoc-version : + * organisation : + * service-version : + * + * Documentation at: + * https://app.apibuilder.io/// + * +**/ +package de.nclazz.users.v0.client; + +import lombok.*; + +import de.nclazz.users.v0.client.*; + +/** + * Client Lib for de.nclazz.users.v0.users API service spec. + * + * Service for user management and authentication. +**/ +public class UsersServiceClient { + + private final UsersApiClientConfig config; + + public UsersServiceClient(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public HealthchecksResource healthchecks() { + return new HealthchecksResource(this.config); + } + public RolesResource roles() { + return new RolesResource(this.config); + } + public UsersResource users() { + return new UsersResource(this.config); + } + public UserLoginsResource userLogins() { + return new UserLoginsResource(this.config); + } + +} \ No newline at end of file diff --git a/examples/de/nclazz/users/v0/client/HealthchecksResource.java b/examples/de/nclazz/users/v0/client/HealthchecksResource.java new file mode 100644 index 0000000..5b5c12e --- /dev/null +++ b/examples/de/nclazz/users/v0/client/HealthchecksResource.java @@ -0,0 +1,95 @@ +/** + * Auto-generated from apibuilder.io service spec. + * apidoc-version : 0.15.4 + * organisation : nclazz + * service-version : 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Documentation at: + * https://app.apibuilder.io/nclazz/users/0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * +**/ +package de.nclazz.users.v0.client; + +import de.nclazz.users.v0.client.UsersApiClientConfig; +import de.nclazz.users.v0.models.*; + +import de.nclazz.common.v0.models.Healthcheck; + +import lombok.*; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.*; +import java.net.URI; + + +/** + * Client for API resource de.nclazz.users.v0.HealthchecksResource + * version 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Simple healthcheck resource for monitoring purposes. +**/ +@RequiredArgsConstructor +public class HealthchecksResource { + + private final UsersApiClientConfig config; + + /** Simple healthcheck endpoint to test the status of the service. **/ + public Get get () { + return new Get(this.config); + } + + /** + * Simple healthcheck endpoint to test the status of the service. + **/ + public static class Get { + + private final UsersApiClientConfig config; + + public Get(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public GetResponse request() { + // /_internal_/healthcheck/healthcheck + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("_internal_") + .path("healthcheck") + .path("healthcheck") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("GET"); + int status = response.getStatus(); + switch(status) { + case 200: + + Healthcheck healthcheck200Resp = response.readEntity(Healthcheck.class); + return GetResponse.builder() + .status(status) + .headers(response.getHeaders()) + .healthcheck200(healthcheck200Resp) + .build(); + default: + return GetResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class GetResponse { + private Healthcheck healthcheck200; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + +} \ No newline at end of file diff --git a/examples/de/nclazz/users/v0/client/RolesResource.java b/examples/de/nclazz/users/v0/client/RolesResource.java new file mode 100644 index 0000000..6b696e4 --- /dev/null +++ b/examples/de/nclazz/users/v0/client/RolesResource.java @@ -0,0 +1,375 @@ +/** + * Auto-generated from apibuilder.io service spec. + * apidoc-version : 0.15.4 + * organisation : nclazz + * service-version : 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Documentation at: + * https://app.apibuilder.io/nclazz/users/0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * +**/ +package de.nclazz.users.v0.client; + +import de.nclazz.users.v0.client.UsersApiClientConfig; +import de.nclazz.users.v0.models.*; + +import java.util.UUID; +import de.nclazz.users.v0.models.RoleForm; +import de.nclazz.users.v0.models.UserStatusForm; +import de.nclazz.users.v0.models.Role; +import java.util.List; +import de.nclazz.users.v0.models.User; +import de.nclazz.errors.v0.models.GenericError; +import de.nclazz.users.v0.models.UserStatus; + +import lombok.*; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.*; +import java.net.URI; + + +/** + * Client for API resource de.nclazz.users.v0.RolesResource + * version 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Managing user roles. +**/ +@RequiredArgsConstructor +public class RolesResource { + + private final UsersApiClientConfig config; + + /** Get all defined user roles. **/ + public Get get () { + return new Get(this.config); + } + /** Get a user role for id. **/ + public GetByIdAndOther getByIdAndOther () { + return new GetByIdAndOther(this.config); + } + /** Create a new user role. **/ + public PostRoleForm postRoleForm () { + return new PostRoleForm(this.config); + } + /** Update the status of a user role. **/ + public PutUserStatusFormById putUserStatusFormById () { + return new PutUserStatusFormById(this.config); + } + /** Mark a user role as deleted. The user role cannot be accessed by the api, but will stay in the db for a while, before completely removed. **/ + public DeleteById deleteById () { + return new DeleteById(this.config); + } + + /** + * Get all defined user roles. + **/ + public static class Get { + + private final UsersApiClientConfig config; + + public Get(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public GetResponse request() { + // /roles/ + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("roles") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("GET"); + int status = response.getStatus(); + switch(status) { + case 200: + List role200Resp = response.readEntity(new GenericType>() {}); + + return GetResponse.builder() + .status(status) + .headers(response.getHeaders()) + .role200(role200Resp) + .build(); + case 401: + return GetResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return GetResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class GetResponse { + private List role200; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Get a user role for id. + **/ + public static class GetByIdAndOther { + + private final UsersApiClientConfig config; + + public GetByIdAndOther(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public GetByIdAndOtherResponse request(@NonNull UUID id, @NonNull String other) { + // /roles/:id/:other + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("roles") + .path(id.toString()) + .path(other.toString()) + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("GET"); + int status = response.getStatus(); + switch(status) { + case 200: + + Role role200Resp = response.readEntity(Role.class); + return GetByIdAndOtherResponse.builder() + .status(status) + .headers(response.getHeaders()) + .role200(role200Resp) + .build(); + case 401: + return GetByIdAndOtherResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 404: + return GetByIdAndOtherResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return GetByIdAndOtherResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class GetByIdAndOtherResponse { + private Role role200; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Create a new user role. + **/ + public static class PostRoleForm { + + private final UsersApiClientConfig config; + + public PostRoleForm(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public PostRoleFormResponse request(@NonNull RoleForm roleForm) { + // /roles/ + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("roles") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("POST", Entity.json(roleForm)); + int status = response.getStatus(); + switch(status) { + case 201: + + User user201Resp = response.readEntity(User.class); + return PostRoleFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .user201(user201Resp) + .build(); + case 400: + List genericError400Resp = response.readEntity(new GenericType>() {}); + + return PostRoleFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .genericError400(genericError400Resp) + .build(); + case 401: + return PostRoleFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return PostRoleFormResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class PostRoleFormResponse { + private User user201; + private List genericError400; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Update the status of a user role. + **/ + public static class PutUserStatusFormById { + + private final UsersApiClientConfig config; + + public PutUserStatusFormById(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public PutUserStatusFormByIdResponse request(@NonNull UUID id, @NonNull UserStatusForm userStatusForm) { + // /roles/:id/status + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("roles") + .path(id.toString()) + .path("status") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("PUT", Entity.json(userStatusForm)); + int status = response.getStatus(); + switch(status) { + case 200: + + UserStatus userStatus200Resp = response.readEntity(UserStatus.class); + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .userStatus200(userStatus200Resp) + .build(); + case 400: + List genericError400Resp = response.readEntity(new GenericType>() {}); + + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .genericError400(genericError400Resp) + .build(); + case 401: + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 404: + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return PutUserStatusFormByIdResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class PutUserStatusFormByIdResponse { + private UserStatus userStatus200; + private List genericError400; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Mark a user role as deleted. The user role cannot be accessed by the api, but will stay in the db for a while, before completely removed. + **/ + public static class DeleteById { + + private final UsersApiClientConfig config; + + public DeleteById(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public DeleteByIdResponse request(@NonNull UUID id) { + // /roles/:id + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("roles") + .path(id.toString()) + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("DELETE"); + int status = response.getStatus(); + switch(status) { + case 200: + return DeleteByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 401: + return DeleteByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 404: + return DeleteByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return DeleteByIdResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class DeleteByIdResponse { + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + +} \ No newline at end of file diff --git a/examples/de/nclazz/users/v0/client/UserLoginsResource.java b/examples/de/nclazz/users/v0/client/UserLoginsResource.java new file mode 100644 index 0000000..a92a6c4 --- /dev/null +++ b/examples/de/nclazz/users/v0/client/UserLoginsResource.java @@ -0,0 +1,99 @@ +/** + * Auto-generated from apibuilder.io service spec. + * apidoc-version : 0.15.4 + * organisation : nclazz + * service-version : 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Documentation at: + * https://app.apibuilder.io/nclazz/users/0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * +**/ +package de.nclazz.users.v0.client; + +import de.nclazz.users.v0.client.UsersApiClientConfig; +import de.nclazz.users.v0.models.*; + +import de.nclazz.users.v0.models.UserLoginForm; +import de.nclazz.users.v0.models.UserLogin; + +import lombok.*; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.*; +import java.net.URI; + + +/** + * Client for API resource de.nclazz.users.v0.UserLoginsResource + * version 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Resource for authenticating users. +**/ +@RequiredArgsConstructor +public class UserLoginsResource { + + private final UsersApiClientConfig config; + + /** Login user with username + password. **/ + public PostUserLoginForm postUserLoginForm () { + return new PostUserLoginForm(this.config); + } + + /** + * Login user with username + password. + **/ + public static class PostUserLoginForm { + + private final UsersApiClientConfig config; + + public PostUserLoginForm(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public PostUserLoginFormResponse request(@NonNull UserLoginForm userLoginForm) { + // /login/ + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("login") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("POST", Entity.json(userLoginForm)); + int status = response.getStatus(); + switch(status) { + case 200: + + UserLogin userLogin200Resp = response.readEntity(UserLogin.class); + return PostUserLoginFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .userLogin200(userLogin200Resp) + .build(); + case 401: + return PostUserLoginFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return PostUserLoginFormResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class PostUserLoginFormResponse { + private UserLogin userLogin200; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + +} \ No newline at end of file diff --git a/examples/de/nclazz/users/v0/client/UsersResource.java b/examples/de/nclazz/users/v0/client/UsersResource.java new file mode 100644 index 0000000..7eb3acc --- /dev/null +++ b/examples/de/nclazz/users/v0/client/UsersResource.java @@ -0,0 +1,464 @@ +/** + * Auto-generated from apibuilder.io service spec. + * apidoc-version : 0.15.4 + * organisation : nclazz + * service-version : 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Documentation at: + * https://app.apibuilder.io/nclazz/users/0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * +**/ +package de.nclazz.users.v0.client; + +import de.nclazz.users.v0.client.UsersApiClientConfig; +import de.nclazz.users.v0.models.*; + +import de.nclazz.users.v0.models.UserForm; +import de.nclazz.users.v0.models.UserStatusForm; +import de.nclazz.users.v0.models.User; +import java.util.List; +import de.nclazz.errors.v0.models.GenericError; +import de.nclazz.users.v0.models.UserStatus; + +import lombok.*; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.*; +import java.net.URI; + + +/** + * Client for API resource de.nclazz.users.v0.UsersResource + * version 0.0.0-dev-30-gbd50cdf-bd9390b2-staging + * + * Access to the user management. +**/ +@RequiredArgsConstructor +public class UsersResource { + + private final UsersApiClientConfig config; + + /** Get all users. **/ + public Get get () { + return new Get(this.config); + } + /** Get a user for given id. **/ + public GetById getById () { + return new GetById(this.config); + } + /** Create a new user. **/ + public PostUserForm postUserForm () { + return new PostUserForm(this.config); + } + /** Update user data. **/ + public PutUserFormById putUserFormById () { + return new PutUserFormById(this.config); + } + /** Update the status of the user. **/ + public PutUserStatusFormById putUserStatusFormById () { + return new PutUserStatusFormById(this.config); + } + /** Mark a user as deleted. The user cannot be accessed by the api, but will stay in the db for a while, before completely removed. **/ + public DeleteById deleteById () { + return new DeleteById(this.config); + } + + /** + * Get all users. + **/ + public static class Get { + + private final UsersApiClientConfig config; + @NonNull private String xAuthorization_header ; + private String xAgent_header ; + @Builder.Default private Integer limit_query = 200; + + public Get(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public GetResponse request() { + // /users/ + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("users") + .queryParam("limit", this.limit_query) + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .header("x-authorization", this.xAuthorization_header) + .header("x-agent", this.xAgent_header) + .method("GET"); + int status = response.getStatus(); + switch(status) { + case 200: + List user200Resp = response.readEntity(new GenericType>() {}); + + return GetResponse.builder() + .status(status) + .headers(response.getHeaders()) + .user200(user200Resp) + .build(); + case 401: + return GetResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return GetResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + public Get xAuthorization(String xAuthorization) { + this.xAuthorization_header = xAuthorization; + return this; + } + public Get xAgent(String xAgent) { + this.xAgent_header = xAgent; + return this; + } + public Get limit(Integer limit) { + this.limit_query = limit; + return this; + } + + @Builder + @Data + public static class GetResponse { + private List user200; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Get a user for given id. + **/ + public static class GetById { + + private final UsersApiClientConfig config; + + public GetById(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public GetByIdResponse request(@NonNull String id) { + // /users/:id + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("users") + .path(id.toString()) + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("GET"); + int status = response.getStatus(); + switch(status) { + case 200: + + User user200Resp = response.readEntity(User.class); + return GetByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .user200(user200Resp) + .build(); + case 404: + return GetByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 401: + return GetByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return GetByIdResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class GetByIdResponse { + private User user200; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Create a new user. + **/ + public static class PostUserForm { + + private final UsersApiClientConfig config; + + public PostUserForm(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public PostUserFormResponse request(@NonNull UserForm userForm) { + // /users/ + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("users") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("POST", Entity.json(userForm)); + int status = response.getStatus(); + switch(status) { + case 201: + + User user201Resp = response.readEntity(User.class); + return PostUserFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .user201(user201Resp) + .build(); + case 400: + List genericError400Resp = response.readEntity(new GenericType>() {}); + + return PostUserFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .genericError400(genericError400Resp) + .build(); + case 401: + return PostUserFormResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return PostUserFormResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class PostUserFormResponse { + private User user201; + private List genericError400; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Update user data. + **/ + public static class PutUserFormById { + + private final UsersApiClientConfig config; + + public PutUserFormById(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public PutUserFormByIdResponse request(@NonNull String id, @NonNull UserForm userForm) { + // /users/:id + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("users") + .path(id.toString()) + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("PUT", Entity.json(userForm)); + int status = response.getStatus(); + switch(status) { + case 200: + + User user200Resp = response.readEntity(User.class); + return PutUserFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .user200(user200Resp) + .build(); + case 400: + List genericError400Resp = response.readEntity(new GenericType>() {}); + + return PutUserFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .genericError400(genericError400Resp) + .build(); + case 401: + return PutUserFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 404: + return PutUserFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return PutUserFormByIdResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class PutUserFormByIdResponse { + private User user200; + private List genericError400; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Update the status of the user. + **/ + public static class PutUserStatusFormById { + + private final UsersApiClientConfig config; + + public PutUserStatusFormById(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public PutUserStatusFormByIdResponse request(@NonNull String id, @NonNull UserStatusForm userStatusForm) { + // /users/:id/status + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("users") + .path(id.toString()) + .path("status") + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("PUT", Entity.json(userStatusForm)); + int status = response.getStatus(); + switch(status) { + case 200: + + UserStatus userStatus200Resp = response.readEntity(UserStatus.class); + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .userStatus200(userStatus200Resp) + .build(); + case 400: + List genericError400Resp = response.readEntity(new GenericType>() {}); + + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .genericError400(genericError400Resp) + .build(); + case 401: + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 404: + return PutUserStatusFormByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return PutUserStatusFormByIdResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class PutUserStatusFormByIdResponse { + private UserStatus userStatus200; + private List genericError400; + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + /** + * Mark a user as deleted. The user cannot be accessed by the api, but will stay in the db for a while, before completely removed. + **/ + public static class DeleteById { + + private final UsersApiClientConfig config; + + public DeleteById(@NonNull final UsersApiClientConfig config) { + this.config = config; + } + + public DeleteByIdResponse request(@NonNull String id) { + // /users/:id + final URI uri = UriBuilder.fromUri(this.config.getBaseUrl()) + .path("users") + .path(id.toString()) + .build(); + + WebTarget target = config.getClient().target(uri); + Response response = target.request(MediaType.APPLICATION_JSON) + .method("DELETE"); + int status = response.getStatus(); + switch(status) { + case 200: + return DeleteByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 401: + return DeleteByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + case 404: + return DeleteByIdResponse.builder() + .status(status) + .headers(response.getHeaders()) + .build(); + default: + return DeleteByIdResponse.builder() + .status(status) + .unexpected(response.readEntity(String.class)) + .build(); + } + } + + + @Builder + @Data + public static class DeleteByIdResponse { + + private final int status; + private final MultivaluedMap headers; + private final String unexpected; + } + } + + +} \ No newline at end of file diff --git a/examples/example.json b/examples/example.json index 1b60c0d..c808701 100644 --- a/examples/example.json +++ b/examples/example.json @@ -18,7 +18,13 @@ "email": "info@nclazz.de" } }, - "headers": [], + "headers": [ + { + "name": "x-something", + "type": "string", + "required": true + } + ], "imports": [ { "uri": "https://app.apibuilder.io/nclazz/common/latest/service.json", diff --git a/src/generators/java-client-generator.js b/src/generators/java-client-generator.js index 1c70963..988c7e8 100644 --- a/src/generators/java-client-generator.js +++ b/src/generators/java-client-generator.js @@ -3,6 +3,7 @@ const Mustache = require('mustache') const fs = require('fs') const path = require('path') const utils = require('../utils') +const javaType = require('../java-type') const templateApiConfig = fs.readFileSync(path.resolve(path.join('templates', 'jax-rs-config.java.mustache')), 'utf-8') const templateApi = fs.readFileSync(path.resolve(path.join('templates', 'jax-rs-api.java.mustache')), 'utf-8') @@ -16,6 +17,12 @@ module.exports = (service) => { service.package = service.namespace const resources = javaClient.mapResources(service.resources, service.namespace) + service.headers = service.headers.map(header => { + header.type = javaType.mapJavaType(header.type, service.namespace) + header.label = utils.camelcase(header.name) + return header + }) + const files = resources.map(resource => { return { name: `${resource.name}.java`, diff --git a/templates/jax-rs-config.java.mustache b/templates/jax-rs-config.java.mustache index 9eca6cd..aa7d589 100644 --- a/templates/jax-rs-config.java.mustache +++ b/templates/jax-rs-config.java.mustache @@ -15,17 +15,34 @@ import org.glassfish.jersey.client.HttpUrlConnectorProvider; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientRequestContext; +import java.io.IOException; @Builder(toBuilder = true) @With @Getter @EqualsAndHashCode -public class {{configName}} { +public class {{configName}} implements ClientRequestFilter { @NonNull private final String baseUrl; @Builder.Default private final Client client = ClientBuilder.newClient() + .register(this) .property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true); + {{#headers}}/** {{#description}}{{.}} + {{/description}} **/{{#required}} + @NonNull{{/required}} + private {{{type.name}}} {{label}}; + {{/headers}} + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + {{#headers}} + requestContext.getHeaders().add("{{name}}", this.{{label}}); + {{/headers}} + } + } \ No newline at end of file