/* * Copyright (C) 2008-2017, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.api.controllers; import com.juick.Status; import com.juick.Tag; import com.juick.User; import com.juick.server.util.HttpBadRequestException; import com.juick.server.util.HttpForbiddenException; import com.juick.server.util.UserUtils; import com.juick.service.MessagesService; import com.juick.service.TagService; import com.juick.service.UserService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.inject.Inject; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Collections; import java.util.List; /** * @author ugnich */ @RestController @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class Messages { private static final ResponseEntity> NOT_FOUND = ResponseEntity .status(HttpStatus.NOT_FOUND) .body(Collections.emptyList()); private static final ResponseEntity> FORBIDDEN = ResponseEntity .status(HttpStatus.FORBIDDEN) .body(Collections.emptyList()); @Inject private MessagesService messagesService; @Inject private UserService userService; @Inject private TagService tagService; // TODO: serialize image urls @RequestMapping("/home") public ResponseEntity> getHome( @RequestParam(defaultValue = "0") int before_mid) { User visitor = UserUtils.getCurrentUser(); if (!visitor.isAnonymous()) { int vuid = visitor.getUid(); List mids = messagesService.getMyFeed(vuid, before_mid, true); if (!mids.isEmpty()) return ResponseEntity.ok(messagesService.getMessages(mids)); return NOT_FOUND; } return FORBIDDEN; } @RequestMapping("/messages") public ResponseEntity> getMessages( @RequestParam(required = false) String uname, @RequestParam(name = "before_mid", defaultValue = "0") Integer before, @RequestParam(required = false, defaultValue = "0") Integer daysback, @RequestParam(required = false) String withrecommended, @RequestParam(required = false) String popular, @RequestParam(required = false) String media, @RequestParam(required = false) String tag) { User visitor = UserUtils.getCurrentUser(); int vuid = visitor.getUid(); List mids; if (!StringUtils.isEmpty(uname)) { User user = userService.getUserByName(uname); if (user != null) { if (!StringUtils.isEmpty(media)) { mids = messagesService.getUserPhotos(user.getUid(), 0, before); } else if (!StringUtils.isEmpty(tag)) { Tag tagObject = tagService.getTag(tag, false); if (tagObject != null) { mids = messagesService.getUserTag(user.getUid(), tagObject.TID, 0, before); } else { return NOT_FOUND; } } else if (!StringUtils.isEmpty(withrecommended)) { mids = messagesService.getUserBlogWithRecommendations(user.getUid(), 0, before); } else if (daysback > 0) { mids = messagesService.getUserBlogAtDay(user.getUid(), 0, daysback); } else { mids = messagesService.getUserBlog(user.getUid(), 0, before); } } else { return NOT_FOUND; } } else { if (!StringUtils.isEmpty(popular)) { mids = messagesService.getPopular(vuid, before); } else if (!StringUtils.isEmpty(media)) { mids = messagesService.getPhotos(vuid, before); } else if (!StringUtils.isEmpty(tag)) { Tag tagObject = tagService.getTag(tag, false); if (tagObject != null) { mids = messagesService.getTag(tagObject.TID, vuid, before, 20); } else { return NOT_FOUND; } } else { mids = messagesService.getAll(vuid, before); } } return ResponseEntity.ok(messagesService.getMessages(mids)); } @GetMapping("/messages/notifications") public ResponseEntity> getNotifications( @RequestParam(required = false) Long before ) { User visitor = UserUtils.getCurrentUser(); LocalDateTime beforeTime = before != null ? LocalDateTime.ofInstant(Instant.ofEpochMilli(before), ZoneId.systemDefault()) : null; return ResponseEntity.ok(messagesService.getNotifications(visitor, beforeTime)); } @RequestMapping("/thread") public ResponseEntity> getThread( @RequestParam(defaultValue = "0") int mid) { User visitor = UserUtils.getCurrentUser(); int vuid = visitor.getUid(); com.juick.Message msg = messagesService.getMessage(mid); if (msg != null) { if (!messagesService.canViewThread(mid, vuid)) { return FORBIDDEN; } else { List replies = messagesService.getReplies(mid); replies.add(0, msg); return ResponseEntity.ok(replies); } } return NOT_FOUND; } @ApiIgnore @RequestMapping("/messages/set_privacy") @ResponseBody public ResponseEntity doSetPrivacy( @RequestParam(defaultValue = "0") int mid) { User visitor = UserUtils.getCurrentUser(); int vuid = visitor.getUid(); if (vuid == 0) { throw new HttpForbiddenException(); } com.juick.User user = messagesService.getMessageAuthor(mid); if (user != null && user.getUid() == vuid && messagesService.setMessagePrivacy(mid)) { return ResponseEntity.ok(Status.OK); } throw new HttpForbiddenException(); } @ApiIgnore @RequestMapping("/messages/set_popular") public Status doSetPopular( @RequestParam(defaultValue = "0") int mid, @RequestParam(defaultValue = "0") int popular) { if (mid > 0) { messagesService.setMessagePopular(mid, popular); return Status.OK; } throw new HttpBadRequestException(); } }