ContactMessage.java

package no.nav.data.team.contact.domain;

import lombok.Value;
import no.nav.data.team.contact.domain.ContactMessage.Paragraph.VarselUrl;
import no.nav.data.team.integration.slack.dto.SlackDtos.PostMessageRequest.Block;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static no.nav.data.common.utils.StreamUtils.convert;
import static no.nav.data.team.contact.domain.ContactMessage.Paragraph.VarselUrl.url;

@Value
public class ContactMessage {

    String title;
    String sourceName;
    List<Paragraph> paragraphs = new ArrayList<>();

    public ContactMessage spacing() {
        return paragraph(" ");
    }

    public ContactMessage paragraph(String val) {
        Assert.isTrue(val != null && val.length() > 0, "cannot be empty");
        paragraphs.add(new Paragraph(val, sourceName, List.of()));
        return this;
    }

    public ContactMessage paragraph(String val, VarselUrl... urls) {
        paragraphs.add(new Paragraph(val, sourceName, Arrays.asList(urls)));
        return this;
    }

    public ContactMessage footer(String baseUrl) {
        return spacing()
                .paragraph("%s - mvh %s", url(baseUrl, "Teamkatalog"), url("slack://channel?team=T5LNAMWNA&id=CG2S8D25D", "teamkatalogen"));
    }

    @Value
    public static class Paragraph {

        String val;
        String sourceName;
        List<VarselUrl> urls;

        private String toSlack() {
            var urlsFormatted = convert(urls, u -> "<%s%s|%s>".formatted(u.url, source(u), u.name));
            return val.formatted(urlsFormatted.toArray());
        }

        private String toHtml() {
            var urlsFormatted = convert(urls, u -> "<a href=\"%s%s\">%s</a>".formatted(u.url, source(u), u.name));
            return val.formatted(urlsFormatted.toArray());
        }

        private String source(VarselUrl u) {
            return (u.url.contains("?") ? "&" : "?") + "source=" + sourceName;
        }

        @Value
        public static class VarselUrl {

            String url;
            String name;

            public static VarselUrl url(String url, String name) {
                return new VarselUrl(url, name);
            }
        }

    }

    public List<Block> toSlack() {
        var blocks = new ArrayList<Block>();
        blocks.add(Block.header(title));

        paragraphs.forEach(p -> blocks.add(Block.text(p.toSlack())));

        return blocks;
    }

    public String toHtml() {
        return "<h1>%s</h1>".formatted(title) +
                String.join("\n", convert(paragraphs, p -> "<p>%s</p>".formatted(p.toHtml())));
    }

}