package com.juick.api; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.juick.Message; import com.juick.User; import com.juick.server.MessagesQueries; import com.juick.server.PushQueries; import com.juick.server.SubscriptionsQueries; import com.juick.server.UserQueries; import com.juick.server.helpers.TokensList; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.jdbc.core.JdbcTemplate; import spark.utils.IOUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; /** * Created by vitalyster on 24.10.2016. */ public class Notifications { JdbcTemplate jdbc; ObjectMapper mapper = new ObjectMapper(); public Notifications(JdbcTemplate jdbc) { this.jdbc = jdbc; } public void doGet(HttpServletRequest request, HttpServletResponse response, int vuid) throws IOException { User visitor = UserQueries.getUserByUID(jdbc, vuid).orElse(new User()); if ((visitor.getUid() == 0) || !(visitor.getName().equals("juick"))) { response.sendError(403); return; } String type = request.getParameter("type"); int uid = NumberUtils.toInt(request.getParameter("uid"), 0); int mid = NumberUtils.toInt(request.getParameter("mid"), 0); if (uid > 0) { switch (type) { case "gcm": List tokens = PushQueries.getAndroidRegID(jdbc, uid); Main.replyJSON(request, response, mapper.writeValueAsString(tokens)); break; case "apns": List apnsTokens = PushQueries.getAPNSToken(jdbc, uid); Main.replyJSON(request, response, mapper.writeValueAsString(apnsTokens)); break; case "mpns": List mpnsTokens = PushQueries.getWinPhoneURL(jdbc, uid); Main.replyJSON(request, response, mapper.writeValueAsString(mpnsTokens)); break; default: response.sendError(400); } } else { if (mid > 0) { Message msg = MessagesQueries.getMessage(jdbc, mid); if (msg != null) { List users; if (msg.getRid() > 0) { users = SubscriptionsQueries.getUsersSubscribedToComments(jdbc, mid, msg.getUser().getUid()); } else { users = SubscriptionsQueries.getSubscribedUsers(jdbc, msg.getUser().getUid(), mid); } List uids = users.stream().map(User::getUid).collect(Collectors.toList()); switch (type) { case "gcm": List tokens = PushQueries.getAndroidTokens(jdbc, uids); Main.replyJSON(request, response, mapper.writeValueAsString(tokens)); break; case "apns": List apnsTokens = PushQueries.getAPNSTokens(jdbc, uids); Main.replyJSON(request, response, mapper.writeValueAsString(apnsTokens)); break; case "mpns": List mpnsTokens = PushQueries.getWindowsTokens(jdbc, uids); Main.replyJSON(request, response, mapper.writeValueAsString(mpnsTokens)); break; default: response.sendError(400); } } } else { response.sendError(400); } } } public void doDelete(HttpServletRequest request, HttpServletResponse response, int vuid) throws IOException { User visitor = UserQueries.getUserByUID(jdbc, vuid).orElse(new User()); if ((visitor.getUid() == 0) || !(visitor.getName().equals("juick"))) { response.sendError(403); return; } ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); TokensList list = mapper.readValue(IOUtils.toString(request.getInputStream()), TokensList.class); list.getTokens().forEach(t -> PushQueries.deleteAPNSToken(jdbc, t)); } }