MattermostService.java

package com.tdmconsult.ete.services.mattermost;

import com.tdmconsult.ete.documents.FinancialDocument;
import com.tdmconsult.ete.utils.DateUtils;
import java.time.LocalDate;
import java.util.List;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
@RequiredArgsConstructor
public class MattermostService {

    @Value("${tdm.baseurl-frontend}")
    private String baseurlFrontend;
    private final RestTemplate mattermostRestTemplate;

    private void sendPayload(final @NonNull MattermostPayload payload) {

        final var headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        final HttpEntity<MattermostPayload> request = new HttpEntity<>(payload, headers);

        try {
            mattermostRestTemplate.postForObject("", request, String.class);
        } catch (final RestClientException e) {
            log.error("Fehler beim Senden der Mattermost-Nachricht: {}", e.getMessage(), e);
        }
    }

    public void informAboutNewDocument(
            final String publicId,
            final String uploadBy,
            final FinancialDocument.TypeOfDocument typeOfDocument,
            final LocalDate dateReceived) {

        final var typeOfDocumentField = new MattermostPayload.Field()
                .setTitle("Dokumentenart")
                .setValue(typeOfDocument.getDisplayName()).setShortForm(true);

        final var uploadByField = new MattermostPayload.Field()
                .setTitle("Erfasser")
                .setValue("@%s".formatted(uploadBy)).setShortForm(true);

        final var dateReceivedField = new MattermostPayload.Field()
                .setTitle("Dokumenteneingang")
                .setValue(DateUtils.toDisplayString(dateReceived)).setShortForm(true);

        final var attachment = new MattermostPayload.Attachment()
                .setColor("#2ebd59")
                .setTitle("Neues Finanzdokument verfügbar")
                .setTitleLink("%s/ete-frontend/postoffice/documents/edit/%s".formatted(baseurlFrontend, publicId))
                .setText("Ein neues Finanzdokument mit der Dokumentennummer %s steht jetzt zur Bearbeitung bereit."
                        .formatted(publicId))
                .setFallback("Neues Finanzdokument verfügbar")
                .setFields(List.of(typeOfDocumentField, uploadByField, dateReceivedField));

        final var payload = new MattermostPayload()
                .setIconUrl("https://ete.tdm-consult.com/ete-frontend/favicon.svg")
                .setUsername(uploadBy)
                .setAttachments(List.of(attachment));

        sendPayload(payload);
    }
}