package com.juick.api.controllers; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.juick.Message; import com.juick.User; import com.juick.api.util.HttpBadRequestException; import com.juick.api.util.HttpForbiddenException; import com.juick.server.helpers.Status; import com.juick.server.helpers.TokensList; import com.juick.service.MessagesService; import com.juick.service.PushQueriesService; import com.juick.service.SubscriptionService; import com.juick.service.UserService; import com.juick.util.UserUtils; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.inject.Inject; import java.io.IOException; import java.security.Principal; import java.util.List; import java.util.stream.Collectors; /** * Created by vitalyster on 24.10.2016. */ @Controller @ResponseBody public class Notifications { @Inject PushQueriesService pushQueriesService; @Inject UserService userService; @Inject MessagesService messagesService; @Inject SubscriptionService subscriptionService; @RequestMapping(value = "/notifications", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public ResponseEntity> doGet( Principal principal, @RequestParam String type, @RequestParam(required = false, defaultValue = "0") int uid, @RequestParam(required = false, defaultValue = "0") int mid) { String name = UserUtils.getUsername(principal, null); User visitor = userService.getUserByName(name); if ((visitor.getUid() == 0) || !(visitor.getName().equals("juick"))) { throw new HttpForbiddenException(); } if (uid > 0) { switch (type) { case "gcm": return ResponseEntity.ok(pushQueriesService.getAndroidRegID(uid)); case "apns": return ResponseEntity.ok(pushQueriesService.getAPNSToken(uid)); case "mpns": return ResponseEntity.ok(pushQueriesService.getWinPhoneURL(uid)); default: throw new HttpBadRequestException(); } } else { if (mid > 0) { Message msg = messagesService.getMessage(mid); if (msg != null) { List users; if (msg.getRid() > 0) { users = subscriptionService.getUsersSubscribedToComments(mid, msg.getUser().getUid()); } else { users = subscriptionService.getSubscribedUsers(msg.getUser().getUid(), mid); } List uids = users.stream().map(User::getUid).collect(Collectors.toList()); switch (type) { case "gcm": return ResponseEntity.ok(pushQueriesService.getAndroidTokens(uids)); case "apns": return ResponseEntity.ok(pushQueriesService.getAPNSTokens(uids)); case "mpns": return ResponseEntity.ok(pushQueriesService.getWindowsTokens(uids)); default: throw new HttpBadRequestException(); } } } } throw new HttpBadRequestException(); } @RequestMapping(value = "/notifications", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public Status doDelete( Principal principal, @RequestBody String requestBody) throws IOException { String name = UserUtils.getUsername(principal, null); User visitor = userService.getUserByName(name); if ((visitor.getUid() == 0) || !(visitor.getName().equals("juick"))) { throw new HttpForbiddenException(); } 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(requestBody, TokensList.class); list.getTokens().forEach(t -> pushQueriesService.deleteAPNSToken(t)); return Status.OK; } }