package uk.ac.cam.echo.server.resources;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import uk.ac.cam.echo.data.Conversation;
import uk.ac.cam.echo.data.Message;
import uk.ac.cam.echo.data.User;
import uk.ac.cam.echo.data.resources.MessageResource;
import uk.ac.cam.echo.server.HibernateUtil;
import uk.ac.cam.echo.server.models.MessageModel;
import javax.ws.rs.core.Response;
import java.util.Collections;
import java.util.Date;
import java.util.List;
public class MessageResourceImpl implements MessageResource {
private Conversation conversation;
public MessageResourceImpl(Conversation conversation) {
this.conversation = conversation;
}
public List<Message> getAll() {
return HibernateUtil.getTransaction().createCriteria(MessageModel.class)
.add(Restrictions.eq("conversation", conversation)).addOrder(Order.asc("timeStamp")).list();
}
public List<Message> getRecent(int n) {
List<Message> ret = HibernateUtil.getTransaction().createCriteria(MessageModel.class)
.add(Restrictions.eq("conversation", conversation)).addOrder(Order.desc("timeStamp")).setMaxResults(n).list();
Collections.reverse(ret);
return ret;
}
public Message get(long id) {
return (Message) HibernateUtil.getTransaction().get(MessageModel.class, id);
}
public Message create(String name, long user_id) {
User sender = new UserResourceImpl().get(user_id);
MessageModel message = new MessageModel();
message.setContents(name);
message.setTimeStamp(new Date().getTime());
message.setConversation(conversation);
message.setSender(sender);
message.setSenderName(sender.getDisplayName());
HibernateUtil.getTransaction().save(message);
ConversationResourceImpl.broadcastMessage(message);
return message;
}
public Response update(Message m) {
HibernateUtil.getTransaction().update(m);
return Response.ok().build();
}
@Override
public Message create(Message data) {
MessageModel msg = (MessageModel) data;
msg.setTimeStamp(new Date().getTime());
HibernateUtil.getTransaction().save(msg);
ConversationResourceImpl.broadcastMessage(msg);
return msg;
}
public Response delete(long id) {
Message u = get(id);
HibernateUtil.getTransaction().delete(u);
return Response.ok().build();
}
}