package com.minitwit.dao.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import com.minitwit.dao.MessageDao; import com.minitwit.model.Message; import com.minitwit.model.User; import com.minitwit.util.GravatarUtil; @Repository public class MessageDaoImpl implements MessageDao { private static final String GRAVATAR_DEFAULT_IMAGE_TYPE = "monsterid"; private static final int GRAVATAR_SIZE = 48; private NamedParameterJdbcTemplate template; @Autowired public MessageDaoImpl(DataSource ds) { template = new NamedParameterJdbcTemplate(ds); } @Override public List<Message> getUserTimelineMessages(User user) { Map<String, Object> params = new HashMap<String, Object>(); params.put("id", user.getId()); String sql = "select message.*, user.* from message, user where " + "user.user_id = message.author_id and user.user_id = :id " + "order by message.pub_date desc"; List<Message> result = template.query(sql, params, messageMapper); return result; } @Override public List<Message> getUserFullTimelineMessages(User user) { Map<String, Object> params = new HashMap<String, Object>(); params.put("id", user.getId()); String sql = "select message.*, user.* from message, user " + "where message.author_id = user.user_id and ( " + "user.user_id = :id or " + "user.user_id in (select followee_id from follower " + "where follower_id = :id))" + "order by message.pub_date desc"; List<Message> result = template.query(sql, params, messageMapper); return result; } @Override public List<Message> getPublicTimelineMessages() { Map<String, Object> params = new HashMap<String, Object>(); String sql = "select message.*, user.* from message, user " + "where message.author_id = user.user_id " + "order by message.pub_date desc"; List<Message> result = template.query(sql, params, messageMapper); return result; } @Override public void insertMessage(Message m) { Map<String, Object> params = new HashMap<String, Object>(); params.put("userId", m.getUserId()); params.put("text", m.getText()); params.put("pubDate", m.getPubDate()); String sql = "insert into message (author_id, text, pub_date) values (:userId, :text, :pubDate)"; template.update(sql, params); } private RowMapper<Message> messageMapper = (rs, rowNum) -> { Message m = new Message(); m.setId(rs.getInt("message_id")); m.setUserId(rs.getInt("author_id")); m.setUsername(rs.getString("username")); m.setText(rs.getString("text")); m.setPubDate(rs.getTimestamp("pub_date")); m.setGravatar(GravatarUtil.gravatarURL(rs.getString("email"), GRAVATAR_DEFAULT_IMAGE_TYPE, GRAVATAR_SIZE)); return m; }; }