package cryptosky.me.tweets.service; import cryptosky.me.tweets.models.entities.BtcTweetModel; import cryptosky.me.tweets.models.repositories.BtcTweetRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.DateTimeException; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import static cryptosky.me.helpers.Utils.format; @Service public class BtcTweetService { private final BtcTweetRepository btcTweetRepository; public BtcTweetService(final BtcTweetRepository btcTweetRepository) { this.btcTweetRepository = btcTweetRepository; } @Transactional public BtcTweetModel createTweet(final String createdDate, final String rawTweet, final float sentimentScore, final float positiveScore, final float neutralScore, final float negativeScore, final float compoundScore ) { final BtcTweetModel tweetModel = new BtcTweetModel(); tweetModel.setTimestamp(format(createdDate).toString()); tweetModel.setRawTweet(rawTweet); tweetModel.setSentimentScore(sentimentScore); tweetModel.setPositiveScore(positiveScore); tweetModel.setNegativeScore(negativeScore); tweetModel.setNeutralScore(neutralScore); tweetModel.setCompoundScore(compoundScore); return this.btcTweetRepository.save(tweetModel); } @Transactional(readOnly = true) public Optional getCurrentTweet() { return this.btcTweetRepository.findAll().stream().findFirst(); } @Transactional(readOnly = true) public List getAllTweets( final int count ) { return this.btcTweetRepository.findAll().stream() .limit(count) .collect(Collectors.toList()); } @Transactional(readOnly = true) public List getTweetsForDay( final String startDate, final String endDate ) { LocalDateTime r_start = format(startDate); LocalDateTime r_end = format(endDate); r_start = r_start.toLocalDate().atStartOfDay(); r_end = r_end.toLocalDate().atTime(LocalTime.MAX); if ( r_end.isAfter(r_start) ) { if ( r_end.equals(r_start.toLocalDate().atTime(LocalTime.MAX))) { LocalDateTime finalR_end = r_end; LocalDateTime finalR_start = r_start; return this.btcTweetRepository.findAll().stream() .filter(createdDateList -> format(createdDateList.getTimestamp()).isBefore(finalR_end)) .filter(createdDateList -> format(createdDateList.getTimestamp()).isAfter(finalR_start)) .collect(Collectors.toList()); } else { // Logger throw new DateTimeException(r_start +" and "+ r_end +" are not on the same day"); } } else { // Logger throw new DateTimeException("End Date "+ r_end +" is not after "+ r_start); } } @Transactional(readOnly = true) public List getTweetsForPeriod( final String startDate, final String endDate ) { LocalDateTime r_start = format(startDate); LocalDateTime r_end = format(endDate); r_start = r_start.toLocalDate().atStartOfDay(); r_end = r_end.toLocalDate().atTime(LocalTime.MAX); if ( r_end.isAfter(r_start) ) { LocalDateTime finalR_end = r_end; LocalDateTime finalR_start = r_start; return this.btcTweetRepository.findAll().stream() .filter(createdDateList -> format(createdDateList.getTimestamp()).isBefore(finalR_end)) .filter(createdDateList -> format(createdDateList.getTimestamp()).isAfter(finalR_start)) .collect(Collectors.toList()); } else { // Logger throw new DateTimeException("End Date "+ r_end +" is not after "+ r_start); } } }