SlackDtos.java

package no.nav.data.team.integration.slack.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.Value;
import no.nav.data.common.utils.JsonUtils;
import no.nav.data.team.contact.domain.SlackChannel;
import no.nav.data.team.contact.domain.SlackUser;
import org.springframework.util.Assert;
import tools.jackson.databind.JsonNode;

import java.util.List;

public class SlackDtos {

    @Value
    public static class PostMessageRequest {

        String channel;
        List<Block> blocks;

        @Value
        public static class Block {

            public static Block header(String text) {
                return new Block(BlockType.header, Text.plain(text));
            }

            public static Block text(String text) {
                return new Block(BlockType.section, Text.markdown(text));
            }

            public static Block divider() {
                return new Block(BlockType.divider, null);
            }

            /**
             * Create Block with text, keeping other properties
             */
            public Block withText(String newText) {
                Assert.isTrue(text != null, "this is not a text block");
                return new Block(type, new Text(text.type, newText));
            }

            public enum BlockType {
                header, section, divider
            }

            BlockType type;
            @JsonInclude(Include.NON_NULL)
            Text text;

            @Value
            public static class Text {

                enum TextType {mrkdwn, plain_text}

                TextType type;
                String text;

                public static Text plain(String text) {
                    return new Text(TextType.plain_text, text);
                }

                public static Text markdown(String text) {
                    return new Text(TextType.mrkdwn, text);

                }
            }
        }
    }

    @Data
    public static class PostMessageResponse implements Response {

        private boolean ok;
        private Double ts;
        private String error;
        @JsonProperty("response_metadata")
        private JsonNode responseMetadata;

        @Override
        public String getError() {
            return error + "\n" + JsonUtils.toJson(responseMetadata);
        }

    }

    @Value
    public static class CreateConversationRequest {

        List<String> users;

        public CreateConversationRequest(String userId) {
            this.users = List.of(userId);
        }
    }

    @Data
    public static class CreateConversationResponse implements Response {

        private boolean ok;
        private String error;
        private Channel channel;

    }

    @Data
    public static class Channel {

        private String id;
        private String name;
        @JsonProperty("num_members")
        private Integer numMembers;

        public SlackChannel toDomain() {
            return new SlackChannel(id, name, numMembers);
        }
    }

    @Data
    public static class UserResponse implements Response {

        private boolean ok;
        private String error;
        private User user;

        @Data
        public static class User {

            private String id;
            @JsonProperty("real_name")
            private String name;

            public SlackUser toDomain() {
                return new SlackUser(id, name);
            }

        }
    }

    @Data
    public static class ResponseMetadata {

        @JsonProperty("next_cursor")
        private String nextCursor;
    }

    @Data
    public static class ListChannelResponse implements Response {

        private boolean ok;
        private String error;
        private List<Channel> channels;
        @JsonProperty("response_metadata")
        private ResponseMetadata responseMetadata;
    }

    public interface Response {

        boolean isOk();

        String getError();

    }

}