package com.syzton.sunread.service.message;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.syzton.sunread.dto.message.MessageDTO;
import com.syzton.sunread.exception.common.NotFoundException;
import com.syzton.sunread.model.message.Message;
import com.syzton.sunread.model.user.Student;
import com.syzton.sunread.model.user.User;
import com.syzton.sunread.repository.message.MessageCenterRepository;
import com.syzton.sunread.repository.user.StudentRepository;
import com.syzton.sunread.repository.user.UserRepository;
@Service
public class MessageCenterRepositoryService implements MessageCenterService {
private static final Logger LOGGER = LoggerFactory.getLogger(MessageCenterRepositoryService.class);
private MessageCenterRepository messageRepository;
private UserRepository userRepository;
private StudentRepository studentRepository;
@Autowired
public MessageCenterRepositoryService(MessageCenterRepository repository,UserRepository userRepository,StudentRepository studentRepository) {
this.messageRepository = repository;
this.userRepository = userRepository;
this.studentRepository = studentRepository;
}
@Override
public void sendMessage(long sendUserId,long receiveUseId,String message) {
this.checkUser(sendUserId);
this.checkUser(receiveUseId);
Message send = new Message();
send.setMessage(message);
send.setSendUserId(sendUserId);
send.setReceiveUserId(receiveUseId);
messageRepository.save(send);
}
@Override
@Transactional(rollbackFor = NotFoundException.class)
public void sendMessageToClass(long sendUserId, long classId, String message) {
this.checkUser(sendUserId);
List<Student> students = studentRepository.findByClazzId(classId);
if(students == null || students.size()==0){
throw new NotFoundException("no student found in class id ="+ classId);
}
for(Student student : students){
this.sendMessage(sendUserId,student.getId(),message);
}
}
private User checkUser(long userId) {
User user = userRepository.findOne(userId);
if(user == null){
throw new NotFoundException("user id = "+userId+ " not found...");
}
return user;
}
@Transactional(rollbackFor = {NotFoundException.class})
@Override
public Page<MessageDTO> findMessagesBySendUser(Pageable pageable,Long sendUserId) {
User sendUser = this.checkUser(sendUserId);
Page<Message> messagePage = messageRepository.findBySendUserId(pageable, sendUserId);
List<MessageDTO> messageDTOList = new ArrayList<>();
for (Message message : messagePage.getContent()){
MessageDTO messageDTO = new MessageDTO();
messageDTO.setId(message.getId());
messageDTO.setIsRead(message.getIsRead());
messageDTO.setMessage(message.getMessage());
messageDTO.setSendUserId(message.getSendUserId());
messageDTO.setSendUsername(sendUser.getUsername());
messageDTO.setReceiveUserId(message.getReceiveUserId());
User receiveUser = this.checkUser(message.getReceiveUserId());
messageDTO.setReceiveUserName(receiveUser.getUsername());
messageDTO.setCreationTime(message.getCreationTime());
messageDTOList.add(messageDTO);
}
Page<MessageDTO> messageDTOPage = new PageImpl<>(messageDTOList,pageable,messagePage.getTotalElements());
return messageDTOPage;
}
@Transactional(rollbackFor = {NotFoundException.class})
@Override
public Page<MessageDTO> findMessagesByReceiveUser(Pageable pageable, Long receiveUserId) {
User receiveUser = this.checkUser(receiveUserId);
Page<Message> messagePage = messageRepository.findByReceiveUserId(pageable, receiveUserId);
List<MessageDTO> messageDTOList = new ArrayList<>();
for (Message message : messagePage.getContent()){
MessageDTO messageDTO = new MessageDTO();
messageDTO.setId(message.getId());
messageDTO.setIsRead(message.getIsRead());
messageDTO.setMessage(message.getMessage());
messageDTO.setSendUserId(message.getSendUserId());
User sendUser = this.checkUser(message.getSendUserId());
messageDTO.setSendUsername(sendUser.getUsername());
messageDTO.setReceiveUserId(message.getReceiveUserId());
messageDTO.setReceiveUserName(receiveUser.getUsername());
messageDTO.setCreationTime(message.getCreationTime());
messageDTOList.add(messageDTO);
}
Page<MessageDTO> messageDTOPage = new PageImpl<>(messageDTOList,pageable,messagePage.getTotalElements());
return messageDTOPage;
}
@Transactional(rollbackFor = {NotFoundException.class})
@Override
public Message deleteById(Long id) throws NotFoundException {
Message deleted = findById(id);
messageRepository.delete(deleted);
return deleted;
}
@Override
public void readMessage(Long id) {
Message message = messageRepository.findOne(id);
if(message != null && !message.getIsRead()){
message.read();
messageRepository.save(message);
}
}
@Transactional(readOnly = true,rollbackFor = {NotFoundException.class})
private Message findById(Long id){
Message found = messageRepository.findOne(id);
if(found == null) {
throw new NotFoundException("No message found with id:"+id);
}
return found;
}
}