package com.juick.api; import com.juick.Tag; import com.juick.User; import com.juick.json.JSONSerializer; import com.juick.json.MessageSerializer; import com.juick.server.MessagesQueries; import com.juick.server.TagQueries; import com.juick.server.UserQueries; import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.StringUtils; import rocks.xmpp.addr.Jid; import rocks.xmpp.core.session.XmppSession; import rocks.xmpp.core.stanza.model.Message; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * @author ugnich */ public class Messages { private static final Logger logger = LoggerFactory.getLogger(Messages.class); JdbcTemplate sql; MessageSerializer messageSerializer = new MessageSerializer(); public Messages(JdbcTemplate sql) { this.sql = sql; } void feedMessages(HttpServletRequest request, HttpServletResponse response, List msgs) throws IOException { String requestScheme = request.getHeader("X-Scheme"); if (requestScheme != null) { if (Objects.equals(requestScheme, "https")) { messageSerializer.setUriScheme(JSONSerializer.URIScheme.Secure); } } String json = messageSerializer.serializeList(msgs); Main.replyJSON(request, response, json); } public void doGetHome(HttpServletRequest request, HttpServletResponse response, int vuid) throws ServletException, IOException { int before_mid = NumberUtils.toInt(request.getParameter("before_mid"), 0); List mids = MessagesQueries.getMyFeed(sql, vuid, before_mid); feedMessages(request, response, MessagesQueries.getMessages(sql, mids)); } public void doGet(HttpServletRequest request, HttpServletResponse response, int vuid) throws ServletException, IOException { int before_mid = NumberUtils.toInt(request.getParameter("before_mid"), 0); String uname = request.getParameter("uname"); String popular = request.getParameter("popular"); String media = request.getParameter("media"); String tag = request.getParameter("tag"); List mids = new ArrayList<>(); if (!StringUtils.isEmpty(uname)) { User user = UserQueries.getUserByName(sql, uname); if (user != null) { if (!StringUtils.isEmpty(media)) { mids = MessagesQueries.getUserPhotos(sql, user.getUid(), 0, before_mid); } else if (!StringUtils.isEmpty(tag)) { Tag tagObject = TagQueries.getTag(sql, tag, false); if (tagObject != null) { mids = MessagesQueries.getUserTag(sql, user.getUid(), tagObject.TID, 0, before_mid); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } else { mids = MessagesQueries.getUserBlog(sql, user.getUid(), 0, before_mid); } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } else { if (!StringUtils.isEmpty(popular)) { mids = MessagesQueries.getPopular(sql, vuid, before_mid); } else if (!StringUtils.isEmpty(media)) { mids = MessagesQueries.getPhotos(sql, vuid, before_mid); } else if (!StringUtils.isEmpty(tag)) { Tag tagObject = TagQueries.getTag(sql, tag, false); if (tagObject != null) { mids = MessagesQueries.getTag(sql, tagObject.TID, vuid, before_mid, 20); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } else { mids = MessagesQueries.getAll(sql, vuid, before_mid); } } feedMessages(request, response, MessagesQueries.getMessages(sql, mids)); } public void doThreadGet(HttpServletRequest request, HttpServletResponse response, int vuid) throws IOException { int mid = NumberUtils.toInt(request.getParameter("mid"), 0); com.juick.Message msg = MessagesQueries.getMessage(sql, mid); if (msg != null) { if (!MessagesQueries.canViewThread(sql, mid, vuid)) { response.sendError(HttpServletResponse.SC_FORBIDDEN); } else { List replies = MessagesQueries.getReplies(sql, mid); replies.add(0, msg); feedMessages(request, response, replies); } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } public void doGetRecommended(HttpServletRequest request, HttpServletResponse response, int vuid) throws ServletException, IOException { int before_mid = NumberUtils.toInt(request.getParameter("before_mid"), 0); List mids = MessagesQueries.getUserRecommendations(sql, vuid, before_mid); if (mids != null && !mids.isEmpty()) { List msgs = MessagesQueries.getMessages(sql, mids); if (msgs != null && !msgs.isEmpty()) { String json = messageSerializer.serializeList(msgs); Main.replyJSON(request, response, json); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } public void doSetPrivacy(HttpServletRequest request, HttpServletResponse response, XmppSession xmpp, int vuid) throws ServletException, IOException { int mid = NumberUtils.toInt(request.getParameter("mid"), 0); com.juick.User user = MessagesQueries.getMessageAuthor(sql, mid); if (user != null && user.getUid() == vuid && MessagesQueries.setMessagePrivacy(sql, mid)) { Main.replyJSON(request, response, "{\"status\":\"ok\"}"); } else { response.sendError(HttpServletResponse.SC_BAD_REQUEST); } } public void doSetPopular(HttpServletRequest request, HttpServletResponse response, XmppSession xmpp) throws ServletException, IOException { int mid = NumberUtils.toInt(request.getParameter("mid"), 0); int popular = NumberUtils.toInt(request.getParameter("popular"), 0); if (mid > 0) { boolean ret = MessagesQueries.setMessagePopular(sql, mid, popular); if (ret && popular == 2) { try { com.juick.Message m = MessagesQueries.getMessage(sql, mid); if (m != null) { Message msg = new Message(); msg.setFrom(Jid.of("juick@juick.com")); msg.setTo(Jid.of("crosspost.juick.com")); m.setUser(UserQueries.getUserByUID(sql, 11574).get()); msg.addExtension(m); msg.setTo(Jid.of("twitter@crosspost.juick.com")); xmpp.send(msg); msg.setTo(Jid.of("fb@crosspost.juick.com")); xmpp.send(msg); msg.setTo(Jid.of("vk@crosspost.juick.com")); xmpp.send(msg); } else { throw new Exception("Message not found"); } } catch (Exception e) { logger.error("SETPOPULAR ERROR", e); } } Main.replyJSON(request, response, "{\"status\":\"ok\"}"); } } }