diff --git a/slack-archive/build.gradle b/slack-archive/build.gradle index 468a72c..2d1f0a7 100644 --- a/slack-archive/build.gradle +++ b/slack-archive/build.gradle @@ -49,6 +49,8 @@ dependencies { } compile 'org.springframework.boot:spring-boot-starter-jetty' compile 'org.springframework.boot:spring-boot-starter-data-mongodb' + compile 'org.apache.httpcomponents:httpclient:4.5.3' + compile group: 'org.apache.commons', name: 'commons-io', version: '1.3.2' compile 'org.projectlombok:lombok:1.16.10' compile 'javax.inject:javax.inject:1' testCompile 'net.javacrumbs.json-unit:json-unit-fluent:1.19.0' diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/SchedulerConfig.java b/slack-archive/src/main/java/juja/microservices/slack/archive/SchedulerConfig.java new file mode 100644 index 0000000..55384a9 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/SchedulerConfig.java @@ -0,0 +1,24 @@ +package juja.microservices.slack.archive; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +@Configuration +@EnableScheduling +public class SchedulerConfig implements SchedulingConfigurer { + + private final int POOL_SIZE = 2; + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + threadPoolTaskScheduler.setPoolSize(POOL_SIZE); + threadPoolTaskScheduler.setThreadNamePrefix("sheduled-get-slack-channels-task-pool-"); + threadPoolTaskScheduler.initialize(); + + scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/SlackArchiveApplication.java b/slack-archive/src/main/java/juja/microservices/slack/archive/SlackArchiveApplication.java index 82d4917..52773a1 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/SlackArchiveApplication.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/SlackArchiveApplication.java @@ -1,11 +1,42 @@ package juja.microservices.slack.archive; +import org.apache.http.impl.client.HttpClients; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; @SpringBootApplication public class SlackArchiveApplication { public static void main(String[] args) { SpringApplication.run(SlackArchiveApplication.class, args); } + + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(httpRequestFactory()); + restTemplate.setMessageConverters(getHttpMessageConverters()); + return restTemplate; + } + + private ClientHttpRequestFactory httpRequestFactory() { + return new HttpComponentsClientHttpRequestFactory(HttpClients.createDefault()); + } + + private List> getHttpMessageConverters() { + List> converters = new ArrayList<>(); + converters.add(new MappingJackson2HttpMessageConverter()); + converters.add(new StringHttpMessageConverter()); + return converters; + } } \ No newline at end of file diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/api/SlackApiClient.java b/slack-archive/src/main/java/juja/microservices/slack/archive/api/SlackApiClient.java new file mode 100644 index 0000000..f37b631 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/api/SlackApiClient.java @@ -0,0 +1,10 @@ +package juja.microservices.slack.archive.api; + +import juja.microservices.slack.archive.model.entity.RawChannel; + +import java.util.List; + +public interface SlackApiClient { + + List receiveRawChannelsList(); +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/api/SlackApiClientImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/api/SlackApiClientImpl.java new file mode 100644 index 0000000..8e453ee --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/api/SlackApiClientImpl.java @@ -0,0 +1,70 @@ +package juja.microservices.slack.archive.api; + +import juja.microservices.slack.archive.exceptions.ArchiveException; +import juja.microservices.slack.archive.model.dto.ChannelsRawSlackResponse; +import juja.microservices.slack.archive.model.entity.RawChannel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Repository; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +@Repository +@Slf4j +public class SlackApiClientImpl implements SlackApiClient { + + private final RestTemplate restTemplate; + + @Value("${slack.api.token}") + private String slackApiToken; + @Value("${slack.api.channels.urltemplate}") + private String slackApiChannelsUrlTemplate; + + public SlackApiClientImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public List receiveRawChannelsList() { + + UriComponentsBuilder builder = UriComponentsBuilder + .fromUriString(slackApiChannelsUrlTemplate) + .queryParam("token", slackApiToken); + + List result = new LinkedList<>(); + log.debug("Started request to slack api. Get channels list."); + + try { + String cursor = ""; + do { + ResponseEntity response = + this.restTemplate.getForEntity(builder.toUriString(), ChannelsRawSlackResponse.class); + ChannelsRawSlackResponse slackResponse = response.getBody(); + + List receivedChannels = slackResponse.getChannels() + .stream() + .map(channel -> new RawChannel(channel)) + .collect(Collectors.toList()); + + result.addAll(receivedChannels); + + if (slackResponse.getResponseMetadata() != null && slackResponse.getResponseMetadata().get("cursor") != null) { + cursor = (String) slackResponse.getResponseMetadata().get("cursor"); + } + builder.queryParam("cursor", cursor); + + } while (!cursor.equals("")); + } catch (HttpClientErrorException ex) { + throw new ArchiveException(ex.getMessage()); + } + + log.debug("Received channels : {}", result); + return result; + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/controller/ArchiveController.java b/slack-archive/src/main/java/juja/microservices/slack/archive/controller/ArchiveController.java index 0124ae3..912f74e 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/controller/ArchiveController.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/controller/ArchiveController.java @@ -1,8 +1,8 @@ package juja.microservices.slack.archive.controller; -import juja.microservices.slack.archive.model.ChannelDTO; -import juja.microservices.slack.archive.model.MessagesRequest; -import juja.microservices.slack.archive.service.ArchiveService; +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.model.dto.MessagesRequest; +import juja.microservices.slack.archive.service.ChannelService; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -27,7 +27,7 @@ public class ArchiveController { @Inject - private ArchiveService service; + private ChannelService service; @PostMapping(value = "/messages/", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public void archiveSlackMessage(@RequestParam("token") String token, diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/exceptions/ArchiveException.java b/slack-archive/src/main/java/juja/microservices/slack/archive/exceptions/ArchiveException.java index 44fad1c..2f4ef6a 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/exceptions/ArchiveException.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/exceptions/ArchiveException.java @@ -5,6 +5,11 @@ */ public class ArchiveException extends RuntimeException { + + public ArchiveException(String message, Throwable cause) { + super(message, cause); + } + public ArchiveException(String message) { super(message); } diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/ChannelDTO.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/ChannelDTO.java deleted file mode 100644 index 810ab5b..0000000 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/model/ChannelDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package juja.microservices.slack.archive.model; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -@Data -public class ChannelDTO { - @JsonProperty - private String id; - @JsonProperty - private String name; - - public ChannelDTO(String id, String name) { - this.id = id; - this.name = name; - } -} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelDTO.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelDTO.java new file mode 100644 index 0000000..8012100 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelDTO.java @@ -0,0 +1,21 @@ +package juja.microservices.slack.archive.model.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.*; + + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "id", + "name" +}) +@Data +@AllArgsConstructor +public class ChannelDTO { + @JsonProperty("id") + private String channelId; + @JsonProperty("name") + private String name; +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelSlackResponse.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelSlackResponse.java new file mode 100644 index 0000000..feb241b --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelSlackResponse.java @@ -0,0 +1,22 @@ + +package juja.microservices.slack.archive.model.dto; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Getter +@Setter +@ToString +public class ChannelSlackResponse { + + @JsonProperty("ok") + private Boolean ok; + @JsonProperty("channels") + private List channels; +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelsRawSlackResponse.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelsRawSlackResponse.java new file mode 100644 index 0000000..77bb97d --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/ChannelsRawSlackResponse.java @@ -0,0 +1,31 @@ +package juja.microservices.slack.archive.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ChannelsRawSlackResponse { + + @JsonProperty("ok") + private String ok; + + private List> channels; + + private Map responseMetadata; + + public void addChannels(List> channels) { + + if (this.channels == null) { + channels = new LinkedList<>(); + } + this.channels.addAll(channels); + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/MessagesRequest.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/MessagesRequest.java similarity index 89% rename from slack-archive/src/main/java/juja/microservices/slack/archive/model/MessagesRequest.java rename to slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/MessagesRequest.java index 39c91d7..7d5a5fe 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/model/MessagesRequest.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/dto/MessagesRequest.java @@ -1,4 +1,4 @@ -package juja.microservices.slack.archive.model; +package juja.microservices.slack.archive.model.dto; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -7,6 +7,7 @@ @Getter public class MessagesRequest { + @NonNull private String channel; @NonNull diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/Channel.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/Channel.java similarity index 77% rename from slack-archive/src/main/java/juja/microservices/slack/archive/model/Channel.java rename to slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/Channel.java index 04b256f..30856a9 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/model/Channel.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/Channel.java @@ -1,12 +1,15 @@ -package juja.microservices.slack.archive.model; +package juja.microservices.slack.archive.model.entity; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Getter; +import lombok.Data; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; -@Getter +@Data +@NoArgsConstructor public class Channel { + @Id private String id; private String channelId; diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/Message.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/Message.java similarity index 94% rename from slack-archive/src/main/java/juja/microservices/slack/archive/model/Message.java rename to slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/Message.java index f860336..d47495d 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/model/Message.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/Message.java @@ -1,4 +1,4 @@ -package juja.microservices.slack.archive.model; +package juja.microservices.slack.archive.model.entity; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -9,6 +9,7 @@ @Getter public class Message { + @Id private String id; private String channel; diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/RawChannel.java b/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/RawChannel.java new file mode 100644 index 0000000..87a55ac --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/model/entity/RawChannel.java @@ -0,0 +1,20 @@ +package juja.microservices.slack.archive.model.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; + +import java.util.Map; + +@Data +@NoArgsConstructor +public class RawChannel { + + @Id + private String id; + private Map channel; + + public RawChannel(Map channel) { + this.channel = channel; + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/ChannelRepository.java b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/ChannelRepository.java new file mode 100644 index 0000000..784f461 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/ChannelRepository.java @@ -0,0 +1,12 @@ +package juja.microservices.slack.archive.repository; + +import juja.microservices.slack.archive.model.entity.Channel; +import juja.microservices.slack.archive.model.entity.RawChannel; + +import java.util.List; + +public interface ChannelRepository { + List getChannels(); + + void saveRawChannels(List channels); +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/ArchiveRepository.java b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/MessageRepository.java similarity index 50% rename from slack-archive/src/main/java/juja/microservices/slack/archive/repository/ArchiveRepository.java rename to slack-archive/src/main/java/juja/microservices/slack/archive/repository/MessageRepository.java index 361db20..5ec0612 100644 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/ArchiveRepository.java +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/MessageRepository.java @@ -1,14 +1,12 @@ package juja.microservices.slack.archive.repository; -import juja.microservices.slack.archive.model.Channel; -import juja.microservices.slack.archive.model.Message; +import juja.microservices.slack.archive.model.entity.Message; import java.util.List; -public interface ArchiveRepository { - void saveMessage(Message message); +public interface MessageRepository { - List getChannels(); + void saveMessage(Message message); List getMessages(String channel, int number); } diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/ArchiveRepositoryImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/ArchiveRepositoryImpl.java deleted file mode 100644 index a3167ee..0000000 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/ArchiveRepositoryImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package juja.microservices.slack.archive.repository.impl; - -import juja.microservices.slack.archive.model.Channel; -import juja.microservices.slack.archive.model.Message; -import juja.microservices.slack.archive.repository.ArchiveRepository; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.stereotype.Repository; - -import javax.inject.Inject; -import java.util.List; - -@Repository -@Slf4j -public class ArchiveRepositoryImpl implements ArchiveRepository { - @Inject - private MongoTemplate mongoTemplate; - - @Value("${spring.data.mongodb.channels.collection}") - private String channelsCollectionName; - - @Override - public void saveMessage(Message message) { - //TODO Should be implemented - } - - @Override - public List getChannels() { - List channels = mongoTemplate.findAll(Channel.class, channelsCollectionName); - if (channels.isEmpty()) { - log.info("Channels collection is empty"); - } - return channels; - } - - @Override - public List getMessages(String channel, int number) { - //TODO Should be implemented - return null; - } -} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/ChannelRepositoryImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/ChannelRepositoryImpl.java new file mode 100644 index 0000000..6f63d7e --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/ChannelRepositoryImpl.java @@ -0,0 +1,40 @@ +package juja.microservices.slack.archive.repository.impl; + +import juja.microservices.slack.archive.model.entity.Channel; +import juja.microservices.slack.archive.model.entity.RawChannel; +import juja.microservices.slack.archive.repository.ChannelRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Repository; + +import javax.inject.Inject; +import java.util.List; + +@Repository +@Slf4j +public class ChannelRepositoryImpl implements ChannelRepository { + + @Inject + private MongoTemplate mongoTemplate; + + @Value("${spring.data.mongodb.raw.channels.collection}") + private String rawChannelsCollectionName; + + @Override + public List getChannels() { + List channels = mongoTemplate.findAll(Channel.class, rawChannelsCollectionName); + if (channels.isEmpty()) { + log.info("Channels collection is empty"); + } + return channels; + } + + @Override + public void saveRawChannels(List channels) { + mongoTemplate.remove(new Query(), rawChannelsCollectionName); + channels.stream() + .forEach(channel -> mongoTemplate.save(channel)); + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/MessageRepositoryImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/MessageRepositoryImpl.java new file mode 100644 index 0000000..c42ff2d --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/repository/impl/MessageRepositoryImpl.java @@ -0,0 +1,21 @@ +package juja.microservices.slack.archive.repository.impl; + +import juja.microservices.slack.archive.model.entity.Message; +import juja.microservices.slack.archive.repository.MessageRepository; + +import java.util.List; + +public class MessageRepositoryImpl implements MessageRepository { + + @Override + public void saveMessage(Message message) { + //TODO Should be implemented + } + + + @Override + public List getMessages(String channel, int number) { + //TODO Should be implemented + return null; + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/service/ArchiveService.java b/slack-archive/src/main/java/juja/microservices/slack/archive/service/ArchiveService.java deleted file mode 100644 index 3d5cdaa..0000000 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/service/ArchiveService.java +++ /dev/null @@ -1,15 +0,0 @@ -package juja.microservices.slack.archive.service; - -import juja.microservices.slack.archive.model.ChannelDTO; -import juja.microservices.slack.archive.model.Message; -import juja.microservices.slack.archive.model.MessagesRequest; - -import java.util.List; - -public interface ArchiveService { - List getMessages(MessagesRequest request); - - List getChannels(); - - void saveMessage(Message message); -} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/service/ChannelService.java b/slack-archive/src/main/java/juja/microservices/slack/archive/service/ChannelService.java new file mode 100644 index 0000000..1f3eaf0 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/service/ChannelService.java @@ -0,0 +1,13 @@ +package juja.microservices.slack.archive.service; + +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.model.entity.RawChannel; + +import java.util.List; + +public interface ChannelService { + + void saveRawChannels(List channels); + + List getChannels(); +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/service/MessageService.java b/slack-archive/src/main/java/juja/microservices/slack/archive/service/MessageService.java new file mode 100644 index 0000000..e82aedc --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/service/MessageService.java @@ -0,0 +1,13 @@ +package juja.microservices.slack.archive.service; + +import juja.microservices.slack.archive.model.dto.MessagesRequest; +import juja.microservices.slack.archive.model.entity.Message; + +import java.util.List; + +public interface MessageService { + + List getMessages(MessagesRequest request); + + void saveMessage(Message message); +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/ArchiveServiceImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/ArchiveServiceImpl.java deleted file mode 100644 index bf86b29..0000000 --- a/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/ArchiveServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package juja.microservices.slack.archive.service.impl; - -import juja.microservices.slack.archive.model.Channel; -import juja.microservices.slack.archive.model.ChannelDTO; -import juja.microservices.slack.archive.model.Message; -import juja.microservices.slack.archive.model.MessagesRequest; -import juja.microservices.slack.archive.repository.ArchiveRepository; -import juja.microservices.slack.archive.service.ArchiveService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.inject.Inject; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@Slf4j -public class ArchiveServiceImpl implements ArchiveService { - - private final ArchiveRepository repository; - - @Inject - public ArchiveServiceImpl(ArchiveRepository repository) { - this.repository = repository; - } - - @Override - public List getMessages(MessagesRequest request) { - //TODO Should be implemented - return null; - } - - @Override - public List getChannels() { - List channels = repository.getChannels().stream() - .map(this::convertChannelToChannelDTO) - .collect(Collectors.toList()); - log.debug("returned list of channels: {}", channels.toString()); - return channels; - } - - private ChannelDTO convertChannelToChannelDTO(Channel channel) { - return new ChannelDTO(channel.getChannelId(), channel.getChannelName()); - } - - @Override - public void saveMessage(Message message) { - //TODO Should be implemented - } -} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/ChannelServiceImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/ChannelServiceImpl.java new file mode 100644 index 0000000..d663d37 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/ChannelServiceImpl.java @@ -0,0 +1,50 @@ +package juja.microservices.slack.archive.service.impl; + +import juja.microservices.slack.archive.model.entity.Channel; +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.model.entity.RawChannel; +import juja.microservices.slack.archive.repository.ChannelRepository; +import juja.microservices.slack.archive.service.ChannelService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.inject.Inject; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class ChannelServiceImpl implements ChannelService { + + private final ChannelRepository repository; + + @Inject + public ChannelServiceImpl(ChannelRepository repository) { + this.repository = repository; + } + + @Override + public void saveRawChannels(List channels) { + repository.saveRawChannels(channels); + } + + @Override + public List getChannels() { + List channels = repository.getChannels().stream() + .map(this::convertChannelToChannelDTO) + .collect(Collectors.toList()); + log.debug("returned list of channels: {}", channels.toString()); + return channels; + } + + private ChannelDTO convertChannelToChannelDTO(Channel channel) { + return new ChannelDTO(channel.getChannelId(), channel.getChannelName()); + } + + private Channel convertChannelDTOToChannel(ChannelDTO channelDTO) { + Channel result = new Channel(); + result.setChannelName(channelDTO.getName()); + result.setChannelId(channelDTO.getChannelId()); + return result; + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/MessageServiceImpl.java b/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..da417e5 --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/service/impl/MessageServiceImpl.java @@ -0,0 +1,21 @@ +package juja.microservices.slack.archive.service.impl; + +import juja.microservices.slack.archive.model.dto.MessagesRequest; +import juja.microservices.slack.archive.model.entity.Message; +import juja.microservices.slack.archive.service.MessageService; + +import java.util.List; + +public class MessageServiceImpl implements MessageService { + + @Override + public List getMessages(MessagesRequest request) { + //TODO Should be implemented + return null; + } + + @Override + public void saveMessage(Message message) { + //TODO Should be implemented + } +} diff --git a/slack-archive/src/main/java/juja/microservices/slack/archive/sheduler/ScheduledTask.java b/slack-archive/src/main/java/juja/microservices/slack/archive/sheduler/ScheduledTask.java new file mode 100644 index 0000000..1c40e5c --- /dev/null +++ b/slack-archive/src/main/java/juja/microservices/slack/archive/sheduler/ScheduledTask.java @@ -0,0 +1,27 @@ +package juja.microservices.slack.archive.sheduler; + +import juja.microservices.slack.archive.api.SlackApiClient; +import juja.microservices.slack.archive.service.ChannelService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class ScheduledTask { + + private SlackApiClient slackApiClient; + private ChannelService channelService; + + public ScheduledTask(SlackApiClient slackApiClient, ChannelService channelService) { + this.slackApiClient = slackApiClient; + this.channelService = channelService; + } + + @Scheduled(fixedRate = 43200) + public void scheduleTaskWithFixedRate() { + log.debug("Scheduled task - receive channel list from slack start"); + channelService.saveRawChannels(slackApiClient.receiveRawChannelsList()); + log.debug("Sheduled task receive channel list from slack finish"); + } +} diff --git a/slack-archive/src/main/resources/application.properties b/slack-archive/src/main/resources/application.properties index f7bb214..22e6241 100644 --- a/slack-archive/src/main/resources/application.properties +++ b/slack-archive/src/main/resources/application.properties @@ -3,5 +3,8 @@ spring.output.ansi.enabled=ALWAYS #Mongo DB spring.data.mongodb.uri=mongodb://root:root@localhost:27017/slack-archive spring.data.mongodb.messages.collection=message-archive -spring.data.mongodb.channels.collection=channels -spring.data.mongodb.repositories.enabled=true \ No newline at end of file +spring.data.mongodb.raw.channels.collection=raw-channels +spring.data.mongodb.repositories.enabled=true +#Slack +slack.api.token = xoxp-149859256610-149859256690-289297509942-300c51167bfc18618fd1fcef1e0c9037 +slack.api.channels.urltemplate = https://slack.com/api/channels.list \ No newline at end of file diff --git a/slack-archive/src/test/java/juja/microservices/slack/archive/api/SlackApiClientImplTest.java b/slack-archive/src/test/java/juja/microservices/slack/archive/api/SlackApiClientImplTest.java new file mode 100644 index 0000000..fe871c6 --- /dev/null +++ b/slack-archive/src/test/java/juja/microservices/slack/archive/api/SlackApiClientImplTest.java @@ -0,0 +1,61 @@ +package juja.microservices.slack.archive.api; + +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.utils.Util; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.web.client.RestTemplate; + +import javax.inject.Inject; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SlackApiClientImplTest { + + @Inject + private RestTemplate restTemplate; + @Inject + private SlackApiClient slackApiClient; + private MockRestServiceServer mockServer; + @Value("${slack.api.token}") + private String slackApiToken; + @Value("${slack.api.channels.urltemplate}") + private String slackApiChannelsUrlTemplate; + + @Before + public void setUp() throws Exception { + mockServer = MockRestServiceServer.bindTo(restTemplate).build(); + } + + @Test + public void receiveChannelsList() throws Exception { + + List expectedChannels = Arrays.asList( + new ChannelDTO("C4EHT50DC", "commands"), + new ChannelDTO("C4D4H0ZCY", "general"), + new ChannelDTO("C4D4H0ZEU", "random")); + + String expectedUrlTemplate = slackApiChannelsUrlTemplate + slackApiToken; + mockServer.expect(requestTo(expectedUrlTemplate)) + .andExpect(method(HttpMethod.GET)) + .andRespond(withSuccess(Util.readStringFromFile("api/channels.json"), MediaType.APPLICATION_JSON)); + + List result = slackApiClient.receiveRawChannelsList(); + + assertEquals(expectedChannels, result); + } +} \ No newline at end of file diff --git a/slack-archive/src/test/java/juja/microservices/slack/archive/controller/ArchiveControllerTest.java b/slack-archive/src/test/java/juja/microservices/slack/archive/controller/ArchiveControllerTest.java index c17d640..690a04b 100644 --- a/slack-archive/src/test/java/juja/microservices/slack/archive/controller/ArchiveControllerTest.java +++ b/slack-archive/src/test/java/juja/microservices/slack/archive/controller/ArchiveControllerTest.java @@ -1,7 +1,7 @@ package juja.microservices.slack.archive.controller; -import juja.microservices.slack.archive.model.ChannelDTO; -import juja.microservices.slack.archive.service.ArchiveService; +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.service.ChannelService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -30,7 +30,7 @@ public class ArchiveControllerTest { private MockMvc mockMvc; @MockBean - private ArchiveService service; + private ChannelService service; @Test public void getChannelTest() throws Exception { diff --git a/slack-archive/src/test/java/juja/microservices/slack/archive/service/ArchiveServiceTest.java b/slack-archive/src/test/java/juja/microservices/slack/archive/service/ChannelServiceTest.java similarity index 56% rename from slack-archive/src/test/java/juja/microservices/slack/archive/service/ArchiveServiceTest.java rename to slack-archive/src/test/java/juja/microservices/slack/archive/service/ChannelServiceTest.java index fa12eda..94bdc21 100644 --- a/slack-archive/src/test/java/juja/microservices/slack/archive/service/ArchiveServiceTest.java +++ b/slack-archive/src/test/java/juja/microservices/slack/archive/service/ChannelServiceTest.java @@ -1,16 +1,17 @@ package juja.microservices.slack.archive.service; -import juja.microservices.slack.archive.model.Channel; -import juja.microservices.slack.archive.model.ChannelDTO; -import juja.microservices.slack.archive.repository.ArchiveRepository; -import juja.microservices.slack.archive.service.impl.ArchiveServiceImpl; +import juja.microservices.slack.archive.model.entity.Channel; +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.repository.ChannelRepository; +import juja.microservices.slack.archive.service.impl.ChannelServiceImpl; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; @@ -23,20 +24,21 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) -public class ArchiveServiceTest { +public class ChannelServiceTest { - private ArchiveService service; + private ChannelService service; @Rule final public ExpectedException expectedException = ExpectedException.none(); @Mock - private ArchiveRepository repository; + private ChannelRepository repository; + @Captor + ArgumentCaptor> channelsCaptor; @Before public void setUp() { - MockitoAnnotations.initMocks(this); - service = new ArchiveServiceImpl(repository); + service = new ChannelServiceImpl(repository); } @Test @@ -45,8 +47,23 @@ public void testMockCreation() { } @Test - public void saveMessageTest() { - //TODO Should be implemented + public void saveChannels() { + + List channelsDTO = new ArrayList<>(); + channelsDTO.add(new ChannelDTO("CHANONEID", "flood")); + channelsDTO.add(new ChannelDTO("CHANTWOID", "feedback")); + + + List expected = new ArrayList<>(); + expected.add(new Channel("CHANONEID", "flood")); + expected.add(new Channel("CHANTWOID", "feedback")); + + service.saveRawChannels(channelsDTO); + + verify(repository).saveRawChannels(channelsCaptor.capture()); + + assertEquals(expected, channelsCaptor.getValue()); + verifyNoMoreInteractions(repository); } @Test diff --git a/slack-archive/src/test/java/juja/microservices/slack/archive/sheduler/ScheduledTaskTest.java b/slack-archive/src/test/java/juja/microservices/slack/archive/sheduler/ScheduledTaskTest.java new file mode 100644 index 0000000..537663e --- /dev/null +++ b/slack-archive/src/test/java/juja/microservices/slack/archive/sheduler/ScheduledTaskTest.java @@ -0,0 +1,56 @@ +package juja.microservices.slack.archive.sheduler; + +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.service.ChannelService; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.internal.verification.VerificationModeFactory.times; + +@RunWith(MockitoJUnitRunner.class) +public class ScheduledTaskTest { + + @Mock + private SlackApiClientService slackApiClientService; + + @Mock + private ChannelService channelService; + + @Captor + private ArgumentCaptor> channelsDTOCaptor; + + private ScheduledTask scheduledTask; + + @Before + public void setUp() throws Exception { + scheduledTask = new ScheduledTask(slackApiClientService, channelService); + } + + @Test + public void scheduleTaskWithFixedRate() throws Exception { + + List channelsDTO = new ArrayList<>(); + channelsDTO.add(new ChannelDTO("CHANONEID", "flood")); + channelsDTO.add(new ChannelDTO("CHANTWOID", "feedback")); + + when(slackApiClientService.receiveRawChannels()).thenReturn(channelsDTO); + + scheduledTask.scheduleTaskWithFixedRate(); + + verify(channelService, times(1)).saveRawChannels(channelsDTOCaptor.capture()); + verify(slackApiClientService, times(1)).receiveRawChannels(); + assertEquals(channelsDTO, channelsDTOCaptor.getValue()); + } + +} \ No newline at end of file diff --git a/slack-archive/src/test/java/juja/microservices/slack/integration/ArchiveRepositoryTest.java b/slack-archive/src/test/java/juja/microservices/slack/integration/ArchiveRepositoryTest.java deleted file mode 100644 index 9523b54..0000000 --- a/slack-archive/src/test/java/juja/microservices/slack/integration/ArchiveRepositoryTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package juja.microservices.slack.integration; - -import com.lordofthejars.nosqlunit.annotation.UsingDataSet; -import juja.microservices.slack.archive.model.Channel; -import juja.microservices.slack.archive.repository.impl.ArchiveRepositoryImpl; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; - -import javax.inject.Inject; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@RunWith(SpringRunner.class) -public class ArchiveRepositoryTest extends BaseIntegrationTest { - - @Inject - private ArchiveRepositoryImpl repository; - - @Test - @UsingDataSet(locations = "/datasets/channels.json") - public void getChannelsTest() { - List channels = repository.getChannels(); - Channel channel = channels.get(0); - - assertNotNull(channels); - assertEquals(2, channels.size()); - assertEquals("CHANIDONE", channel.getChannelId()); - assertEquals("flood", channel.getChannelName()); - } -} diff --git a/slack-archive/src/test/java/juja/microservices/slack/integration/ChannelRepositoryTest.java b/slack-archive/src/test/java/juja/microservices/slack/integration/ChannelRepositoryTest.java new file mode 100644 index 0000000..af2bdc7 --- /dev/null +++ b/slack-archive/src/test/java/juja/microservices/slack/integration/ChannelRepositoryTest.java @@ -0,0 +1,122 @@ +package juja.microservices.slack.integration; + +import com.lordofthejars.nosqlunit.annotation.UsingDataSet; +import juja.microservices.slack.archive.model.entity.Channel; +import juja.microservices.slack.archive.repository.impl.ChannelRepositoryImpl; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringRunner.class) +public class ChannelRepositoryTest extends BaseIntegrationTest { + + @Inject + private ChannelRepositoryImpl repository; + + @Test + @UsingDataSet(locations = "/datasets/channels.json") + public void getChannelsTest() { + List channels = repository.getChannels(); + Channel channel = channels.get(0); + + assertNotNull(channels); + assertEquals(2, channels.size()); + assertEquals("CHANIDONE", channel.getChannelId()); + assertEquals("flood", channel.getChannelName()); + } + + @Test + @UsingDataSet(locations = "/datasets/channels.json") + public void saveChannelsTest() { + + final String theChannelId = "newChannelId" ; + final String theChannelName = "newChannelName"; + + Channel channelForSave = new Channel(theChannelId, theChannelName); + List channels = new ArrayList<>(); + channels.add(channelForSave); + + repository.saveRawChannels(channels); + + List actualChannelList = repository.getChannels(); + + assertEquals(findChannels(actualChannelList, theChannelId, theChannelName).size(), 1); + } + + @Test + @UsingDataSet(locations = "/datasets/channels.json") + public void saveChannelsToEmptyCollection() { + + final String theChannelId1 = "newChannelId1" ; + final String theChannelName1 = "newChannelName1"; + + final String theChannelId2 = "newChannelId2"; + final String theChannelName2 = "newChannelName2"; + + Channel channelForSave1 = new Channel(theChannelId1, theChannelName1); + Channel channelForSave2 = new Channel(theChannelId2, theChannelName2); + List channels = new ArrayList<>(); + channels.add(channelForSave1); + channels.add(channelForSave2); + + repository.saveRawChannels(channels); + + List actualChannelList = repository.getChannels(); + + assertEquals(findChannels(actualChannelList, theChannelId1, theChannelName1).size(), 1); + assertEquals(findChannels(actualChannelList, theChannelId2, theChannelName2).size(), 1); + } + + @Test + @UsingDataSet(locations = "/datasets/channels.json") + public void updateChannelName() { + + final String theChannelId1 = "CHANIDONE" ; + final String theChannelName1 = "newChannelName1"; + + Channel channelForSave1 = new Channel(theChannelId1, theChannelName1); + + List channels = new ArrayList<>(); + channels.add(channelForSave1); + + repository.saveRawChannels(channels); + + List actualChannelList = repository.getChannels(); + + assertEquals(findChannels(actualChannelList, theChannelId1, theChannelName1).size(), 1); + } + + @Test + @UsingDataSet(locations = "/datasets/channels.json") + public void ifAddExistChannel() { + + final String theChannelId1 = "CHANIDONE" ; + final String theChannelName1 = "flood"; + + Channel channelForSave1 = new Channel(theChannelId1, theChannelName1); + + List channels = new ArrayList<>(); + channels.add(channelForSave1); + + repository.saveRawChannels(channels); + + List actualChannelList = repository.getChannels(); + + assertEquals(actualChannelList.size(), 2); + } + + private List findChannels(List channels, String channelId, String channelName){ + return channels.stream() + .filter(channel -> channel.getChannelId().equals(channelId)) + .filter(channel -> channel.getChannelName().equals(channelName)) + .collect(Collectors.toList()); + } +} diff --git a/slack-archive/src/test/java/juja/microservices/slack/integration/ArchiveServiceIntegrationTest.java b/slack-archive/src/test/java/juja/microservices/slack/integration/ChannelServiceIntegrationTest.java similarity index 77% rename from slack-archive/src/test/java/juja/microservices/slack/integration/ArchiveServiceIntegrationTest.java rename to slack-archive/src/test/java/juja/microservices/slack/integration/ChannelServiceIntegrationTest.java index 30ee0fe..3e86df8 100644 --- a/slack-archive/src/test/java/juja/microservices/slack/integration/ArchiveServiceIntegrationTest.java +++ b/slack-archive/src/test/java/juja/microservices/slack/integration/ChannelServiceIntegrationTest.java @@ -1,9 +1,9 @@ package juja.microservices.slack.integration; import com.lordofthejars.nosqlunit.annotation.UsingDataSet; -import juja.microservices.slack.archive.model.ChannelDTO; -import juja.microservices.slack.archive.repository.impl.ArchiveRepositoryImpl; -import juja.microservices.slack.archive.service.impl.ArchiveServiceImpl; +import juja.microservices.slack.archive.model.dto.ChannelDTO; +import juja.microservices.slack.archive.repository.impl.ChannelRepositoryImpl; +import juja.microservices.slack.archive.service.impl.ChannelServiceImpl; import org.hamcrest.collection.IsIterableContainingInAnyOrder; import org.junit.Rule; import org.junit.Test; @@ -19,16 +19,16 @@ import static org.junit.Assert.assertNotNull; @RunWith(SpringRunner.class) -public class ArchiveServiceIntegrationTest extends BaseIntegrationTest { +public class ChannelServiceIntegrationTest extends BaseIntegrationTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @Inject - private ArchiveRepositoryImpl repository; + private ChannelRepositoryImpl repository; @Inject - private ArchiveServiceImpl service; + private ChannelServiceImpl service; @Test @UsingDataSet(locations = "/datasets/channels.json") diff --git a/slack-archive/src/test/java/juja/microservices/slack/utils/Util.java b/slack-archive/src/test/java/juja/microservices/slack/utils/Util.java new file mode 100644 index 0000000..02255f0 --- /dev/null +++ b/slack-archive/src/test/java/juja/microservices/slack/utils/Util.java @@ -0,0 +1,23 @@ +package juja.microservices.slack.utils; + +import org.apache.commons.io.IOUtils; + +import java.io.IOException; + +public class Util { + + public static String readStringFromFile(String fileName){ + + String result = ""; + + Foo foo = new Foo(); + ClassLoader classLoader = foo.getClass().getClassLoader(); + try { + result = IOUtils.toString(classLoader.getResourceAsStream(fileName)); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + static class Foo{} +} diff --git a/slack-archive/src/test/resources/api/channels.json b/slack-archive/src/test/resources/api/channels.json new file mode 100644 index 0000000..d5cf933 --- /dev/null +++ b/slack-archive/src/test/resources/api/channels.json @@ -0,0 +1,98 @@ +{ + "ok": true, + "channels": [ + { + "id": "C4EHT50DC", + "name": "commands", + "is_channel": true, + "created": 1488741851, + "is_archived": false, + "is_general": false, + "unlinked": 0, + "creator": "U4DR97JLA", + "name_normalized": "commands", + "is_shared": false, + "is_org_shared": false, + "is_member": true, + "is_private": false, + "is_mpim": false, + "members": [ + "U4DR97JLA" + ], + "topic": { + "value": "", + "creator": "", + "last_set": 0 + }, + "purpose": { + "value": "", + "creator": "", + "last_set": 0 + }, + "previous_names": [], + "num_members": 1 + }, + { + "id": "C4D4H0ZCY", + "name": "general", + "is_channel": true, + "created": 1488704895, + "is_archived": false, + "is_general": true, + "unlinked": 0, + "creator": "U4DR97JLA", + "name_normalized": "general", + "is_shared": false, + "is_org_shared": false, + "is_member": true, + "is_private": false, + "is_mpim": false, + "members": [ + "U4DR97JLA" + ], + "topic": { + "value": "Company-wide announcements and work-based matters", + "creator": "", + "last_set": 0 + }, + "purpose": { + "value": "This channel is for team-wide communication and announcements. All team members are in this channel.", + "creator": "", + "last_set": 0 + }, + "previous_names": [], + "num_members": 1 + }, + { + "id": "C4D4H0ZEU", + "name": "random", + "is_channel": true, + "created": 1488704895, + "is_archived": false, + "is_general": false, + "unlinked": 0, + "creator": "U4DR97JLA", + "name_normalized": "random", + "is_shared": false, + "is_org_shared": false, + "is_member": true, + "is_private": false, + "is_mpim": false, + "members": [ + "U4DR97JLA" + ], + "topic": { + "value": "Non-work banter and water cooler conversation", + "creator": "", + "last_set": 0 + }, + "purpose": { + "value": "A place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber you'd prefer to keep out of more focused work-related channels.", + "creator": "", + "last_set": 0 + }, + "previous_names": [], + "num_members": 1 + } + ] +} \ No newline at end of file diff --git a/slack-archive/src/test/resources/datasets/channelsEmpty.json b/slack-archive/src/test/resources/datasets/channelsEmpty.json new file mode 100644 index 0000000..24001de --- /dev/null +++ b/slack-archive/src/test/resources/datasets/channelsEmpty.json @@ -0,0 +1,5 @@ +{ + "channels": [ + + ] +} \ No newline at end of file