package com.juick.api.controllers; import com.juick.Message; import com.juick.Status; import com.juick.TokensList; import com.juick.User; import com.juick.server.util.HttpBadRequestException; import com.juick.server.util.HttpForbiddenException; import com.juick.service.MessagesService; import com.juick.service.PushQueriesService; import com.juick.service.SubscriptionService; import com.juick.util.UserUtils; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.inject.Inject; import java.io.IOException; import java.security.Principal; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * Created by vitalyster on 24.10.2016. */ @RestController public class Notifications { @Inject PushQueriesService pushQueriesService; @Inject MessagesService messagesService; @Inject SubscriptionService subscriptionService; @RequestMapping(value = "/notifications", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public ResponseEntity> doGet( @RequestParam(required = false, defaultValue = "0") int uid, @RequestParam(required = false, defaultValue = "0") int mid, @RequestParam(required = false, defaultValue = "0") int rid) { User visitor = UserUtils.getCurrentUser(); if ((visitor.getUid() == 0) || !(visitor.getName().equals("juick"))) { throw new HttpForbiddenException(); } List tokensLists = new ArrayList<>(); if (uid > 0 && mid == 0) { // PM TokensList gcmTokens = new TokensList(); gcmTokens.setType("gcm"); gcmTokens.setTokens(pushQueriesService.getGCMRegID(uid)); tokensLists.add(gcmTokens); TokensList apnsTokens = new TokensList(); apnsTokens.setType("apns"); apnsTokens.setTokens(pushQueriesService.getAPNSToken(uid)); tokensLists.add(apnsTokens); TokensList mpnsTokens = new TokensList(); mpnsTokens.setType("mpns"); mpnsTokens.setTokens(pushQueriesService.getMPNSURL(uid)); tokensLists.add(mpnsTokens); return ResponseEntity.ok(tokensLists); } else { if (mid > 0) { Message msg = messagesService.getMessage(mid); if (msg != null) { List users; if (rid > 0) { Message reply = messagesService.getReply(mid, rid); users = subscriptionService.getUsersSubscribedToComments(mid, reply.getUser().getUid()); } else { users = subscriptionService.getSubscribedUsers(msg.getUser().getUid(), mid); } List uids = users.stream().map(User::getUid).collect(Collectors.toList()); TokensList gcmTokens = new TokensList(); gcmTokens.setType("gcm"); gcmTokens.setTokens(pushQueriesService.getGCMTokens(uids)); tokensLists.add(gcmTokens); TokensList apnsTokens = new TokensList(); apnsTokens.setType("apns"); apnsTokens.setTokens(pushQueriesService.getAPNSTokens(uids)); tokensLists.add(apnsTokens); TokensList mpnsTokens = new TokensList(); mpnsTokens.setType("mpns"); mpnsTokens.setTokens(pushQueriesService.getMPNSTokens(uids)); tokensLists.add(mpnsTokens); return ResponseEntity.ok(tokensLists); } } } throw new HttpBadRequestException(); } @RequestMapping(value = "/notifications", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doDelete( @RequestBody TokensList list) throws IOException { User visitor = UserUtils.getCurrentUser(); // FIXME: it is possible to delete other user's tokens if ((visitor.getUid() == 0) || !(visitor.getName().equals("juick"))) { throw new HttpForbiddenException(); } switch (list.getType()) { case "gcm": list.getTokens().forEach(t -> pushQueriesService.deleteGCMToken(t)); break; case "apns": list.getTokens().forEach(t -> pushQueriesService.deleteAPNSToken(t)); break; case "mpns": list.getTokens().forEach(t -> pushQueriesService.deleteMPNSToken(t)); break; default: throw new HttpBadRequestException(); } return Status.OK; } @RequestMapping(value = "/notifications", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doPut( @RequestBody TokensList list) throws IOException { User visitor = UserUtils.getCurrentUser(); if (visitor.getUid() == 0) { throw new HttpForbiddenException(); } switch (list.getType()) { case "gcm": list.getTokens().forEach(t -> pushQueriesService.addGCMToken(visitor.getUid(), t)); break; case "apns": list.getTokens().forEach(t -> pushQueriesService.addAPNSToken(visitor.getUid(), t)); break; case "mpns": list.getTokens().forEach(t -> pushQueriesService.addMPNSToken(visitor.getUid(), t)); break; default: throw new HttpBadRequestException(); } return Status.OK; } @Deprecated @RequestMapping(value = "/android/register", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doAndroidRegister( @RequestParam(name = "regid") String regId) { User visitor = UserUtils.getCurrentUser(); if (visitor.getUid() == 0) { throw new HttpForbiddenException(); } pushQueriesService.addGCMToken(visitor.getUid(), regId); return Status.OK; } @Deprecated @RequestMapping(value = "/android/unregister", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doAndroidUnRegister(@RequestParam(name = "regid") String regId) { pushQueriesService.deleteGCMToken(regId); return Status.OK; } @Deprecated @RequestMapping(value = "/winphone/register", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doWinphoneRegister( Principal principal, @RequestParam(name = "url") String regId) { User visitor = UserUtils.getCurrentUser(); pushQueriesService.addMPNSToken(visitor.getUid(), regId); return Status.OK; } @Deprecated @RequestMapping(value = "/winphone/unregister", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doWinphoneUnRegister(@RequestParam(name = "url") String regId) { pushQueriesService.deleteMPNSToken(regId); return Status.OK; } }