/*
* 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.server.api;
import com.juick.Message;
import com.juick.Status;
import com.juick.Tag;
import com.juick.User;
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));
}
@GetMapping("/messages/discussions")
public List getDiscussions(
@RequestParam(required = false, defaultValue = "0") Long to) {
return messagesService.getMessages(messagesService.getDiscussions(UserUtils.getCurrentUser().getUid(), to));
}
@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();
}
}