/* * 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.User; import com.juick.model.AnonymousUser; import com.juick.model.ApplicationStatus; import com.juick.server.util.HttpNotFoundException; import com.juick.server.util.HttpUtils; import com.juick.server.util.UserUtils; import com.juick.server.util.WebUtils; import com.juick.server.www.WebApp; import com.juick.service.*; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.inject.Inject; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author ugnich */ @RestController public class Users { @Inject private UserService userService; @Inject private MessagesService messagesService; @Inject private CrosspostService crosspostService; @Inject private EmailService emailService; @Inject private WebApp webApp; @Inject private ImagesService imagesService; @Value("${upload_tmp_dir:#{systemEnvironment['TEMP'] ?: '/tmp'}}") private String tmpDir; @RequestMapping(value = "/api/auth", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String getAuthToken() { return userService.getHashByUID(UserUtils.getCurrentUser().getUid()); } @RequestMapping(value = "/api/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public List doGetUsers( @RequestParam(value = "uname", required = false) List unames) { List users = new ArrayList<>(); if (unames != null) { unames.removeIf(WebUtils::isNotUserName); if (!unames.isEmpty() && unames.size() < 20) users.addAll(userService.getUsersByName(unames)); } users.forEach(u -> u.setAvatar(webApp.getAvatarUrl(u))); if (!users.isEmpty()) return users; if (!UserUtils.getCurrentUser().isAnonymous()) { User visitor = UserUtils.getCurrentUser(); visitor.setAvatar(webApp.getAvatarUrl(visitor)); return Collections.singletonList(visitor); } throw new HttpNotFoundException(); } @GetMapping("/api/me") public SecureUser getMe() { User visitor = UserUtils.getCurrentUser(); SecureUser me = new SecureUser(); me.setUid(visitor.getUid()); me.setName(visitor.getName()); me.setAuthHash(getAuthToken()); List unread = messagesService.getUnread(visitor); me.setUnread(unread); me.setUnreadCount(unread.size()); me.setRead(userService.getUserFriends(visitor.getUid())); me.setReaders(userService.getUserReaders(visitor.getUid())); me.setAvatar(webApp.getAvatarUrl(visitor)); return (SecureUser)userService.getUserInfo(me); } @PostMapping("/api/me/upload") public void updateInfo(@RequestParam MultipartFile avatar) throws IOException { User visitor = UserUtils.getCurrentUser(); String avatarTmpPath = HttpUtils.receiveMultiPartFile(avatar, tmpDir).getHost(); if (StringUtils.isNotEmpty(avatarTmpPath)) { imagesService.saveAvatar(avatarTmpPath, visitor.getUid()); } } @RequestMapping(value = "/api/users/read", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public List doGetUserRead( @RequestParam String uname) { User visitor = UserUtils.getCurrentUser(); int uid = 0; if (uname == null) { uid = visitor.getUid(); } else { if (WebUtils.isUserName(uname)) { com.juick.User u = userService.getUserByName(uname); if (!u.isAnonymous()) { uid = u.getUid(); } } } if (uid > 0) { List friends = userService.getUserFriends(uid); friends.forEach(f -> f.setAvatar(webApp.getAvatarUrl(f))); return friends; } throw new HttpNotFoundException(); } @RequestMapping(value = "/api/users/readers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public List doGetUserReaders( @RequestParam String uname) { User visitor = UserUtils.getCurrentUser(); int uid = 0; if (uname == null) { uid = visitor.getUid(); } else { if (WebUtils.isUserName(uname)) { com.juick.User u = userService.getUserByName(uname); if (!u.isAnonymous()) { uid = u.getUid(); } } } if (uid > 0) { List readers = userService.getUserReaders(uid); readers.forEach(r -> r.setAvatar(webApp.getAvatarUrl(r))); return readers; } throw new HttpNotFoundException(); } @GetMapping("/api/info/{uname}") public User getUserInfo(@PathVariable String uname) { User user = userService.getUserByName(uname); if (!user.isBanned()) { user.setRead(doGetUserRead(uname)); user.setReaders(doGetUserReaders(uname)); user.setAvatar(webApp.getAvatarUrl(user)); return userService.getUserInfo(user); } throw new HttpNotFoundException(); } @Deprecated @GetMapping(value = "/api/avatar", produces = MediaType.IMAGE_PNG_VALUE) public byte[] getAvatarUrl( @RequestParam(required = false) String uname, @RequestParam(required = false) String jid) throws IOException { User user = AnonymousUser.INSTANCE; if (StringUtils.isNotEmpty(uname)) { user = userService.getUserByName(uname); } if (user.isAnonymous() && StringUtils.isNotEmpty(jid)) { user = userService.getUserByJID(jid); } return IOUtils.toByteArray(URI.create(webApp.getAvatarUrl(user))); } class SecureUser extends User { public String getHash() { return getAuthHash(); } public List getJIDs() { return userService.getAllJIDs(this); } public List getEmails() { return userService.getEmails(this); } public String getActiveEmail() { return emailService.getNotificationsEmail(this.getUid()); } public String getTwitterName() { return crosspostService.getTwitterName(this.getUid()); } public String getTelegramName() { return crosspostService.getTelegramName(this.getUid()); } public ApplicationStatus getFacebookStatus() { return crosspostService.getFbCrossPostStatus(this.getUid()); } } }