All Downloads are FREE. Search and download functionalities are using the official Maven repository.

systems.dennis.shared.servers.beans.ServerRequest Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
package systems.dennis.shared.servers.beans;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import systems.dennis.shared.annotations.NeverNullResponse;
import systems.dennis.shared.config.WebContext;
import systems.dennis.shared.servers.model.ServerConfig;
import systems.dennis.shared.servers.service.ServerConfigService;
import systems.dennis.shared.utils.Mapper;
import systems.dennis.shared.utils.Supplier;

import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class ServerRequest {
    @Getter
    private RestTemplate restTemplate;
    @Getter
    private WebContext context;

    @Getter
    private Map> onError = new HashMap<>();
    @Getter
    private T result;

    @Getter
    private String url;

    public  static String AUTH_TYPE_HEADER = "AUTH_TYPE";
    public  static String AUTH_SCOPE_HEADER = "AUTH_SCOPE";
    public static final String AUTH_TYPE_DEFAULT = "DEFAULT";
    public  static String AUTH_TYPE_VIRTUAL = "VIRTUAL";

    public ServerRequest(RestTemplate restTemplate, WebContext context) {
        this.restTemplate = restTemplate;

        this.context = context;
    }


    @Getter
    private final HttpHeaders headers = new HttpHeaders();

    private ServerConfig server;

    @NeverNullResponse
    public ServerRequest virtualAuth() {
        headers.set(AUTH_TYPE_HEADER, AUTH_TYPE_VIRTUAL);
        return this;
    }

    @NeverNullResponse
    public ServerRequest uri(String uri) {

        this.url = uri;
        return this;
    }

    @NeverNullResponse
    public ServerRequest server(Long type) {
        this.server = context.getBean(ServerConfigService.class).findByType(type, true);
        return this;
    }

    @NeverNullResponse
    public ServerRequest server(ServerConfig server) {
        this.server = context.getBean(ServerConfigService.class).findByIdOrThrow(server.getId());
        return this;
    }

    @NeverNullResponse
    public ServerRequest token(String token) {
        headers.setBearerAuth(token);
        return this;
    }

    @NeverNullResponse
    public ServerRequest scope() {
        headers.set(AUTH_SCOPE_HEADER, getCurrentScope());
        return this;
    }

    @NeverNullResponse
    public ServerRequest header(Map headerMap) {
        for (Map.Entry entry : headerMap.entrySet()) {
            headers.set(entry.getKey(), entry.getValue());
        }
        return this;
    }

    @NeverNullResponse
    public ServerRequest contentType(MediaType contentType) {
        headers.setContentType(contentType);
        return this;
    }

    @NeverNullResponse
    public ServerRequest onErrorStatusError(int status, Supplier e) {
        onError.put(status, e);
        return this;
    }

    @NeverNullResponse
    public ServerRequest onAnyErrorStatusError(Supplier e) {
        onError.put(-1, e);
        return this;
    }


    /**
     * @deprecated as normally default type doesn't require this header
     */
    @Deprecated
    @NeverNullResponse
    public ServerRequest defaultAuthType() {
        headers.set(AUTH_TYPE_HEADER, AUTH_TYPE_DEFAULT);
        return this;
    }


    public  T executePost(E object, Class tClass) {
        try {
            if (!this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
                this.headers.setContentType(MediaType.APPLICATION_JSON);
            }
            var el = new HttpEntity<>(object, this.headers);
            var resp = restTemplate.postForEntity(server.getRoot() + url, el, tClass);
            validateExceptions(resp);

            this.result = resp.getBody();
            return this.result;
        } catch (Exception e) {
            printRequest(e);
            throw e;
        }
    }

    public  T executePut(E object, Class tClass) {
        if (!this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
            this.headers.setContentType(MediaType.APPLICATION_JSON);
        }
        HttpEntity entity = new HttpEntity<>(object, this.headers);
        ResponseEntity response = restTemplate.exchange(server.getRoot() + url, HttpMethod.PUT, entity, tClass);
        validateExceptions(response);

        this.result = response.getBody();
        return this.result;
    }

    public  T executePatch(E object, Class tClass) {
        if (!this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
            this.headers.setContentType(MediaType.APPLICATION_JSON);
        }
        HttpEntity entity = new HttpEntity<>(object, this.headers);
        ResponseEntity response = restTemplate.exchange(server.getRoot() + url, HttpMethod.PATCH, entity, tClass);
        validateExceptions(response);

        this.result = response.getBody();
        return this.result;
    }

    private void validateExceptions(ResponseEntity resp) {
        printResponse(resp);
        var anyError = onError.get(-1);
        if (200 != resp.getStatusCode().value()) {
            this.onError.keySet().forEach((code) -> {
                if (code != -1) {
                    if (resp.getStatusCode().value() == code) {
                        onError.get(code).onNull(resp.getStatusCode().value());
                    }
                }
            });

            if (anyError != null) {
                anyError.onNull(resp.getStatusCode().value());
            }
        }


    }

    private void printResponse(ResponseEntity resp) {
        log.debug("Url: " + this.url);
        log.debug("code: " + resp.getStatusCode());
        if (resp.getBody() != null) {
            try {
                log.debug("message: " + Mapper.mapper.writeValueAsString(resp.getBody()));
            } catch (Exception e) {
                log.debug("message: " + resp.getBody());
            }
        } else {
            log.debug("message: null");
        }
    }

    private void printRequest(Exception e) {
        log.error("Url: " + this.url);
        log.error("exception", e);
    }

    public  T executeGet(Class tClass) {
        try {
            var el = new HttpEntity<>(this.headers);
            var resp = restTemplate.exchange(server.getRoot() + url, HttpMethod.GET, el, tClass);
            validateExceptions(resp);

            this.result = resp.getBody();
            return this.result;
        } catch (Exception e) {
            printRequest(e);
            throw e;
        }
    }
    public  T executeGet(ParameterizedTypeReference respType ) {
        try {
            var el = new HttpEntity<>(this.headers);
            var resp = restTemplate.exchange(server.getRoot() + url, HttpMethod.GET, el, respType);
            validateExceptions(resp);

            this.result = resp.getBody();
            return this.result;
        } catch (Exception e) {
            printRequest(e);
            throw e;
        }
    }

    public void executeDelete(Class tClass) {
        try {
            var requestEntity = new HttpEntity<>(this.headers);
            var resp = restTemplate.exchange(server.getRoot() + url, HttpMethod.DELETE, requestEntity, tClass);
            validateExceptions(resp);
        } catch (Exception e) {
            printRequest(e);
            throw e;
        }
    }

    private String getCurrentScope() {
        return context.getEnv("dennis.systems.security.scope.id", "Default");
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy