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

dev.fitko.fitconnect.core.reply.ReplyApiService Maven / Gradle / Ivy

Go to download

Library that provides client access to the FIT-Connect api-endpoints for sending, subscribing and routing

There is a newer version: 2.3.5
Show newest version
package dev.fitko.fitconnect.core.reply;

import dev.fitko.fitconnect.api.domain.model.event.problems.Problem;
import dev.fitko.fitconnect.api.domain.model.reply.AcceptReply;
import dev.fitko.fitconnect.api.domain.model.reply.AnnounceReply;
import dev.fitko.fitconnect.api.domain.model.reply.CreatedReply;
import dev.fitko.fitconnect.api.domain.model.reply.RejectReply;
import dev.fitko.fitconnect.api.domain.model.reply.RepliesForPickup;
import dev.fitko.fitconnect.api.domain.model.reply.Reply;
import dev.fitko.fitconnect.api.domain.model.reply.SentReply;
import dev.fitko.fitconnect.api.domain.model.reply.SubmitReply;
import dev.fitko.fitconnect.api.exceptions.internal.RestApiException;
import dev.fitko.fitconnect.api.services.auth.OAuthService;
import dev.fitko.fitconnect.api.services.http.HttpClient;
import dev.fitko.fitconnect.api.services.reply.ReplyService;
import dev.fitko.fitconnect.core.http.HttpHeaders;
import dev.fitko.fitconnect.core.http.MimeTypes;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class ReplyApiService implements ReplyService {

    public static final String REPLIES_PATH = "/v1/replies";
    public static final String REPLY_PATH = "/v1/replies/%s";
    public static final String REPLY_ACCEPT_PATH = "/v1/replies/%s/accept";
    public static final String REPLY_REJECT_PATH = "/v1/replies/%s/reject";
    public static final String REPLY_ATTACHMENT_PATH = "/v1/replies/%s/attachments/%s";

    private final OAuthService authService;
    private final HttpClient httpClient;
    private final String baseUrl;

    public ReplyApiService(final OAuthService authService, final HttpClient httpClient, final String baseUrl) {
        this.authService = authService;
        this.httpClient = httpClient;
        this.baseUrl = baseUrl;
    }

    @Override
    public CreatedReply announceReply(final AnnounceReply announceReply) throws RestApiException {
        try {
            return httpClient.post(baseUrl + REPLIES_PATH, getHeaders(), announceReply, CreatedReply.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Could not announce reply for case " + announceReply.getCaseId(), e);
        }
    }

    @Override
    public SentReply submitReply(final UUID replyId, final SubmitReply submitReply) throws RestApiException {
        final String url = String.format(baseUrl + REPLY_PATH, replyId);
        try {
            return httpClient.put(url, getHeaders(), submitReply, SentReply.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Could not submit reply " + replyId, e);
        }
    }

    @Override
    public Reply getReply(final UUID replyId) throws RestApiException {
        try {
            return httpClient.get(String.format(baseUrl + REPLY_PATH, replyId), getHeaders(), Reply.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Reply with id " + replyId + " does not exist", e, e.getStatusCode());
        }
    }

    @Override
    public RepliesForPickup getAvailableReplies(final int limit, final int offset) throws RestApiException {
        final String urlWithQueryParams = baseUrl + REPLIES_PATH + "?limit=" + limit + "&offset=" + offset;
        try {
            return httpClient.get(urlWithQueryParams, getHeaders(), RepliesForPickup.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Polling for available replies failed", e);
        }
    }

    @Override
    public String acceptReply(final UUID replyId, final AcceptReply acceptReply) {
        final String url = String.format(baseUrl + REPLY_ACCEPT_PATH, replyId);
        try {
            return httpClient.put(url, getHeaders(), acceptReply, String.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Sending accept reply event failed", e);
        }
    }

    @Override
    public String rejectReply(final UUID replyId, final List problems) {
        final String url = String.format(baseUrl + REPLY_REJECT_PATH, replyId);
        try {
            return httpClient.put(url, getHeaders(), new RejectReply(problems), String.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Sending reject reply event failed", e);
        }
    }

    @Override
    public void uploadAttachment(final UUID replyId, final UUID attachmentId, final String encryptedAttachment) throws RestApiException {
        final String url = String.format(baseUrl + REPLY_ATTACHMENT_PATH, replyId, attachmentId);
        try {
            httpClient.put(url, getHeaders("application/jose"), encryptedAttachment, Void.class);
        } catch (final RestApiException e) {
            throw new RestApiException("Could not upload attachment for reply " + replyId, e);
        }
    }

    @Override
    public String getAttachment(final UUID replyId, final UUID attachmentId) throws RestApiException {
        final String url = String.format(baseUrl + REPLY_ATTACHMENT_PATH, replyId, attachmentId);
        try {
            return httpClient.get(url, getHeaders("application/jose"), String.class).getBody();
        } catch (final RestApiException e) {
            throw new RestApiException("Could not get attachment " + attachmentId + " for reply " + replyId, e);
        }
    }

    private Map getHeaders() {
        return getHeaders(MimeTypes.APPLICATION_JSON);
    }

    private Map getHeaders(final String mimeType) {
        return new HashMap<>(Map.of(
                HttpHeaders.AUTHORIZATION, "Bearer " + authService.getCurrentToken().getAccessToken(),
                HttpHeaders.CONTENT_TYPE, mimeType,
                HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.toString()
        ));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy