package org.kalipo.service;
import org.apache.commons.lang3.StringUtils;
import org.kalipo.aop.KalipoExceptionHandler;
import org.kalipo.aop.RateLimit;
import org.kalipo.config.ErrorCode;
import org.kalipo.domain.Feedback;
import org.kalipo.repository.FeedbackRepository;
import org.kalipo.security.SecurityUtils;
import org.kalipo.service.util.Asserts;
import org.kalipo.web.rest.KalipoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import java.util.List;
@SuppressWarnings("unused")
@Service
@KalipoExceptionHandler
public class FeedbackService {
private final Logger log = LoggerFactory.getLogger(FeedbackService.class);
@Inject
private UserService userService;
@Inject
private MailService mailService;
@Inject
private FeedbackRepository feedbackRepository;
@Inject
private Environment env;
@RateLimit
public Feedback create(Feedback feedback) throws KalipoException {
Asserts.isNull(feedback.getId(), "id");
return feedbackRepository.save(feedback);
}
public Feedback get(String id) throws KalipoException {
assertSupermodPrivilege();
return feedbackRepository.findOne(id);
}
public List<Feedback> getAll() throws KalipoException {
assertSupermodPrivilege();
return feedbackRepository.findAll();
}
public void delete(String id) throws KalipoException {
assertSupermodPrivilege();
feedbackRepository.delete(id);
}
// --
@Scheduled(cron = "0 * * * * ?") // hourly
public void mailFeedbacks() {
List<Feedback> list = feedbackRepository.findAll();
if (!list.isEmpty()) {
StringBuilder content = new StringBuilder(list.size() * 120);
for (Feedback feedback : list) {
if (StringUtils.isNotBlank(feedback.getName())) {
content.append("name: ").append(feedback.getName());
content.append("\n");
}
if (StringUtils.isNotBlank(feedback.getEmail())) {
content.append("email: ").append(feedback.getEmail());
content.append("\n");
}
content.append("ip: ").append(feedback.getIp());
content.append("\n");
content.append(feedback.getText());
content.append("\n\n--\n\n");
}
final String to = env.getProperty("mail.feedback.to");
final String subject = env.getProperty("mail.feedback.subject");
if (StringUtils.isBlank(to) || StringUtils.isBlank(subject)) {
log.warn(String.format("Cannot send feedback via mail. Invalid settings to: '%s', subject: '%s'", to, subject));
} else {
mailService.sendEmail(to, subject, content.toString(), false, false);
feedbackRepository.delete(list);
}
}
}
// --
private void assertSupermodPrivilege() throws KalipoException {
boolean isSuperMod = userService.isSuperMod(SecurityUtils.getCurrentLogin());
if (!isSuperMod) {
throw new KalipoException(ErrorCode.PERMISSION_DENIED);
}
}
}