From 8a0fbbd35c13054a947ea0d27ca117542bc452b9 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Fri, 18 May 2018 15:33:38 +0300 Subject: JPA WIP --- .../java/com/juick/server/CommandsManager.java | 11 +- .../java/com/juick/service/CrosspostService.java | 33 ++- .../main/java/com/juick/service/EmailService.java | 16 +- .../java/com/juick/service/MessagesService.java | 3 +- .../java/com/juick/service/PMQueriesService.java | 18 +- .../java/com/juick/service/TelegramService.java | 2 +- .../main/java/com/juick/service/UserService.java | 18 +- .../security/HashParamAuthenticationFilter.java | 2 +- .../service/security/JuickUserDetailsService.java | 2 +- .../CookieSimpleHashRememberMeServices.java | 12 +- juick-server/build.gradle | 2 +- .../main/java/com/juick/server/EmailManager.java | 10 +- .../java/com/juick/server/TelegramBotManager.java | 20 +- .../main/java/com/juick/server/TwitterManager.java | 4 +- .../main/java/com/juick/server/XMPPConnection.java | 21 +- .../src/main/java/com/juick/server/api/PM.java | 12 +- .../java/com/juick/server/api/SocialLogin.java | 33 ++- .../src/main/java/com/juick/server/api/Users.java | 2 +- .../com/juick/service/CrosspostServiceImpl.java | 84 +++--- .../java/com/juick/service/EmailServiceImpl.java | 35 +-- .../main/java/com/juick/service/EntityUtils.java | 22 ++ .../com/juick/service/MessagesServiceImpl.java | 39 +-- .../com/juick/service/PMQueriesServiceImpl.java | 48 ++- .../com/juick/service/TelegramServiceImpl.java | 14 +- .../java/com/juick/service/UserServiceImpl.java | 245 ++++------------ .../com/juick/service/data/MessagesRepository.java | 7 + .../com/juick/service/data/TextRepository.java | 7 + .../com/juick/service/data/UsersRepository.java | 23 ++ .../data/entities/BaseMessagePropertyEntity.java | 20 ++ .../data/entities/BaseUserPropertyEntity.java | 20 ++ .../juick/service/data/entities/EmailEntity.java | 20 ++ .../service/data/entities/FacebookEntity.java | 20 ++ .../juick/service/data/entities/LoginEntity.java | 19 ++ .../juick/service/data/entities/MessageEntity.java | 81 ++++++ .../juick/service/data/entities/ReplyEntity.java | 31 ++ .../com/juick/service/data/entities/TagEntity.java | 15 + .../juick/service/data/entities/TagNameEntity.java | 30 ++ .../service/data/entities/TelegramEntity.java | 20 ++ .../juick/service/data/entities/TextEntity.java | 42 +++ .../juick/service/data/entities/UserEntity.java | 109 +++++++ .../com/juick/service/data/entities/VKEntity.java | 20 ++ juick-server/src/main/resources/schema.sql | 15 +- .../java/com/juick/server/tests/ServerTests.java | 322 ++++++++++----------- juick-server/src/test/resources/data.sql | 1 + .../main/java/com/juick/www/controllers/Login.java | 2 +- .../com/juick/www/controllers/MessagesWWW.java | 6 +- .../java/com/juick/www/controllers/NewMessage.java | 6 +- .../java/com/juick/www/controllers/Settings.java | 28 +- .../java/com/juick/www/controllers/SignUp.java | 35 +-- juick-www/src/test/java/com/juick/WebAppTests.java | 38 +-- 50 files changed, 1000 insertions(+), 645 deletions(-) create mode 100644 juick-server/src/main/java/com/juick/service/EntityUtils.java create mode 100644 juick-server/src/main/java/com/juick/service/data/MessagesRepository.java create mode 100644 juick-server/src/main/java/com/juick/service/data/TextRepository.java create mode 100644 juick-server/src/main/java/com/juick/service/data/UsersRepository.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/BaseMessagePropertyEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/BaseUserPropertyEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/EmailEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/FacebookEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/LoginEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/MessageEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/ReplyEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/TagEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/TagNameEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/TelegramEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/TextEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/UserEntity.java create mode 100644 juick-server/src/main/java/com/juick/service/data/entities/VKEntity.java diff --git a/juick-common/src/main/java/com/juick/server/CommandsManager.java b/juick-common/src/main/java/com/juick/server/CommandsManager.java index 7dd372b1..a5484f75 100644 --- a/juick-common/src/main/java/com/juick/server/CommandsManager.java +++ b/juick-common/src/main/java/com/juick/server/CommandsManager.java @@ -114,13 +114,12 @@ public class CommandsManager { : HttpUtils.downloadImage(attachment.toURL(), tmpDir).getHost(); attachmentType = attachmentFName.substring(attachmentFName.length() - 3); } - int mid = messagesService.createMessage(user.getUid(), body, attachmentType, tags); - subscriptionService.subscribeMessage(messagesService.getMessage(mid), user); + com.juick.Message msg = messagesService.createMessage(user, body, attachmentType, tags); + subscriptionService.subscribeMessage(msg, user); if (haveAttachment) { - String fname = String.format("%d.%s", mid, attachmentType); + String fname = String.format("%d.%s", msg.getMid(), attachmentType); imagesService.saveImageWithPreviews(attachmentFName, fname); } - com.juick.Message msg = messagesService.getMessage(mid); applicationEventPublisher.publishEvent(new MessageReadEvent(this, user, msg)); applicationEventPublisher.publishEvent(new MessageEvent(this, msg, subscriptionService.getSubscribedUsers(msg.getUser().getUid(), msg.getMid()))); return CommandResult.build(msg, "New message posted.\n#" + msg.getMid() + " https://juick.com/m/" + msg.getMid(), String.format("[New message](%s) posted", PlainTextFormatter.formatUrl(msg))); @@ -145,7 +144,7 @@ public class CommandsManager { @UserCommand(pattern = "^login$", patternFlags = Pattern.CASE_INSENSITIVE, help = "LOGIN - log in to Juick website") public CommandResult commandLogin(User user_from, URI attachment, String[] input) { - return CommandResult.fromString("http://juick.com/login?hash=" + userService.getHashByUID(user_from.getUid())); + return CommandResult.fromString("http://juick.com/login?hash=" + userService.getHashForUser(user_from)); } @UserCommand(pattern = "^\\@(\\S+)\\s+([\\s\\S]+)$", help = "@username message - send PM to username") public CommandResult commandPM(User user_from, URI attachment, String... arguments) { @@ -155,7 +154,7 @@ public class CommandsManager { if (!user_to.isAnonymous()) { if (!userService.isInBLAny(user_to.getUid(), user_from.getUid())) { - if (pmQueriesService.createPM(user_from.getUid(), user_to.getUid(), body)) { + if (pmQueriesService.createPM(user_from, user_to, body)) { com.juick.Message jmsg = new com.juick.Message(); jmsg.setUser(user_from); jmsg.setTo(user_to); diff --git a/juick-common/src/main/java/com/juick/service/CrosspostService.java b/juick-common/src/main/java/com/juick/service/CrosspostService.java index 38481d72..20f12681 100644 --- a/juick-common/src/main/java/com/juick/service/CrosspostService.java +++ b/juick-common/src/main/java/com/juick/service/CrosspostService.java @@ -18,6 +18,7 @@ package com.juick.service; import com.juick.ExternalToken; +import com.juick.User; import com.juick.server.helpers.ApplicationStatus; import org.apache.commons.lang3.tuple.Pair; @@ -29,9 +30,9 @@ import java.util.Optional; */ public interface CrosspostService { - Optional getTwitterToken(int uid); + Optional getTwitterToken(User user); - boolean deleteTwitterToken(Integer uid); + boolean deleteTwitterToken(User user); void addFacebookState(String state, String redirectUri); @@ -41,30 +42,30 @@ public interface CrosspostService { String verifyVKState(String state); - Optional> getFacebookTokens(int uid); + Optional> getFacebookTokens(User user); - ApplicationStatus getFbCrossPostStatus(int uid); + ApplicationStatus getFbCrossPostStatus(User user); - boolean enableFBCrosspost(Integer uid); + boolean enableFBCrosspost(User user); - void disableFBCrosspost(Integer uid); + void disableFBCrosspost(User user); @Nonnull - String getTwitterName(int uid); + String getTwitterName(User user); - String getTelegramName(int uid); + String getTelegramName(User user); - Optional> getVkTokens(int uid); + Optional> getVkTokens(User user); - void deleteVKUser(Integer uid); + void deleteVKUser(User user); - int getUIDbyFBID(long fbID); + Optional getUserByFBID(long fbID); boolean createFacebookUser(long fbID, String loginhash, String token, String fbName, String fbLink); boolean updateFacebookUser(long fbID, String token, String fbName, String fbLink); - int getUIDbyVKID(long vkID); + Optional getUserByVKID(long vkID); boolean createVKUser(long vkID, String loginhash, String token, String vkName, String vkLink); @@ -72,15 +73,15 @@ public interface CrosspostService { String getTelegramNameByHash(String hash); - boolean setFacebookUser(String hash, int uid); + boolean setFacebookUser(String hash, User user); String getVKNameByHash(String hash); - boolean setVKUser(String hash, int uid); + boolean setVKUser(String hash, User user); - boolean setTelegramUser(String hash, int uid); + boolean setTelegramUser(String hash, User user); String getJIDByHash(String hash); - boolean setJIDUser(String hash, int uid); + boolean setJIDUser(String hash, User user); } diff --git a/juick-common/src/main/java/com/juick/service/EmailService.java b/juick-common/src/main/java/com/juick/service/EmailService.java index 2440bcb4..74ca7c71 100644 --- a/juick-common/src/main/java/com/juick/service/EmailService.java +++ b/juick-common/src/main/java/com/juick/service/EmailService.java @@ -17,17 +17,19 @@ package com.juick.service; +import com.juick.User; + import java.util.List; /** * Created by vitalyster on 09.12.2016. */ public interface EmailService { - boolean verifyAddressByCode(Integer userId, String code); - boolean addVerificationCode(Integer userId, String account, String code); - boolean addEmail(Integer userId, String email); - boolean deleteEmail(Integer userId, String account); - String getNotificationsEmail(Integer userId); - boolean setNotificationsEmail(Integer userId, String account); - List getEmails(Integer userId, boolean active); + boolean verifyAddressByCode(User user, String code); + boolean addVerificationCode(User user, String account, String code); + boolean addEmail(User user, String email); + boolean deleteEmail(User user, String account); + String getNotificationsEmail(User user); + boolean setNotificationsEmail(User user, String account); + List getEmails(User user, boolean active); } diff --git a/juick-common/src/main/java/com/juick/service/MessagesService.java b/juick-common/src/main/java/com/juick/service/MessagesService.java index 30719cc6..4e6477d3 100644 --- a/juick-common/src/main/java/com/juick/service/MessagesService.java +++ b/juick-common/src/main/java/com/juick/service/MessagesService.java @@ -17,6 +17,7 @@ package com.juick.service; +import com.juick.Message; import com.juick.Reaction; import com.juick.User; import com.juick.server.helpers.ResponseReply; @@ -30,7 +31,7 @@ import java.util.Set; * Created by aalexeev on 11/13/16. */ public interface MessagesService { - int createMessage(int uid, String txt, String attachment, Collection tags); + Message createMessage(User user, String txt, String attachment, Collection tags); int createReply(int mid, int rid, User user, String txt, String attachment); diff --git a/juick-common/src/main/java/com/juick/service/PMQueriesService.java b/juick-common/src/main/java/com/juick/service/PMQueriesService.java index 4c70eece..45d6754e 100644 --- a/juick-common/src/main/java/com/juick/service/PMQueriesService.java +++ b/juick-common/src/main/java/com/juick/service/PMQueriesService.java @@ -25,21 +25,19 @@ import java.util.List; * Created by aalexeev on 11/13/16. */ public interface PMQueriesService { - boolean createPM(int uidFrom, int uid_to, String body); + boolean createPM(User me, User to, String body); - boolean addPMinRoster(int uid, String jid); + boolean addPMinRoster(User me, String jid); - boolean removePMinRoster(int uid, String jid); + boolean removePMinRoster(User me, String jid); - boolean havePMinRoster(int uid, String jid); + boolean havePMinRoster(User me, String jid); - String getLastView(int uidFrom, int uidTo); + List getPMLastConversationsUsers(User me, int cnt); - List getPMLastConversationsUsers(int uid, int cnt); + List getPMMessages(User me, User to); - List getPMMessages(int uid, int uidTo); + List getLastPMInbox(User me); - List getLastPMInbox(int uid); - - List getLastPMSent(int uid); + List getLastPMSent(User me); } diff --git a/juick-common/src/main/java/com/juick/service/TelegramService.java b/juick-common/src/main/java/com/juick/service/TelegramService.java index 7786ca9f..4323df35 100644 --- a/juick-common/src/main/java/com/juick/service/TelegramService.java +++ b/juick-common/src/main/java/com/juick/service/TelegramService.java @@ -31,7 +31,7 @@ public interface TelegramService { List getChats(); - int getUser(long tgId); + User getUser(long tgId); boolean createTelegramUser(long tgID, String tgName); diff --git a/juick-common/src/main/java/com/juick/service/UserService.java b/juick-common/src/main/java/com/juick/service/UserService.java index df62f0ef..de856adf 100644 --- a/juick-common/src/main/java/com/juick/service/UserService.java +++ b/juick-common/src/main/java/com/juick/service/UserService.java @@ -39,7 +39,7 @@ public interface UserService { String getSignUpHashByTelegramID(Long telegramId, String username); - int createUser(String username, String password); + User createUser(String username, String password); Optional getUserByUID(int uid); @@ -49,8 +49,6 @@ public interface UserService { User getUserByEmail(String email); - List getFullyUsersByNames(Collection usernames); - User getUserByJID(String jid); List getUsersByName(Collection unames); @@ -59,17 +57,11 @@ public interface UserService { List getJIDsbyUID(int uid); - int getUIDbyJID(String jid); - - int getUIDbyName(String uname); - - int getUIDbyHash(String hash); - com.juick.User getUserByHash(String hash); - String getHashByUID(int uid); + String getHashForUser(User user); - int checkPassword(String username, String password); + User checkPassword(String username, String password); boolean updatePassword(User user, String newPassword); @@ -81,8 +73,6 @@ public interface UserService { boolean updateUserInfo(User user, UserInfo info); - boolean getCanMedia(int uid); - boolean isInWL(int uid, int check); boolean isInBL(int uid, int check); @@ -117,7 +107,7 @@ public interface UserService { List getAuthCodes(User user); - List getEmails(User user); + Collection getEmails(User user); String getEmailHash(User user); diff --git a/juick-common/src/main/java/com/juick/service/security/HashParamAuthenticationFilter.java b/juick-common/src/main/java/com/juick/service/security/HashParamAuthenticationFilter.java index b56b98c8..9bf83f86 100644 --- a/juick-common/src/main/java/com/juick/service/security/HashParamAuthenticationFilter.java +++ b/juick-common/src/main/java/com/juick/service/security/HashParamAuthenticationFilter.java @@ -70,7 +70,7 @@ public class HashParamAuthenticationFilter extends OncePerRequestFilter { if (!user.isAnonymous()) { User userWithPassword = userService.getFullyUserByName(user.getName()); - userWithPassword.setAuthHash(userService.getHashByUID(userWithPassword.getUid())); + userWithPassword.setAuthHash(userService.getHashForUser(userWithPassword)); Authentication authentication = new RememberMeAuthenticationToken( ((AbstractRememberMeServices)rememberMeServices).getKey(), new JuickUser(userWithPassword), JuickUser.USER_AUTHORITY); diff --git a/juick-common/src/main/java/com/juick/service/security/JuickUserDetailsService.java b/juick-common/src/main/java/com/juick/service/security/JuickUserDetailsService.java index f6ae8909..78293f38 100644 --- a/juick-common/src/main/java/com/juick/service/security/JuickUserDetailsService.java +++ b/juick-common/src/main/java/com/juick/service/security/JuickUserDetailsService.java @@ -44,7 +44,7 @@ public class JuickUserDetailsService implements UserDetailsService { com.juick.User user = userService.getFullyUserByName(username); if (user != null) { - user.setAuthHash(userService.getHashByUID(user.getUid())); + user.setAuthHash(userService.getHashForUser(user)); return new JuickUser(user); } diff --git a/juick-common/src/main/java/com/juick/service/security/deprecated/CookieSimpleHashRememberMeServices.java b/juick-common/src/main/java/com/juick/service/security/deprecated/CookieSimpleHashRememberMeServices.java index b658e16f..019ee502 100644 --- a/juick-common/src/main/java/com/juick/service/security/deprecated/CookieSimpleHashRememberMeServices.java +++ b/juick-common/src/main/java/com/juick/service/security/deprecated/CookieSimpleHashRememberMeServices.java @@ -80,13 +80,13 @@ public class CookieSimpleHashRememberMeServices extends AbstractRememberMeServic logger.debug("Creating new persistent login for user {}", username); try { - int uid = userService.getUIDbyName(username); + User user = userService.getUserByName(username); - Assert.isTrue(uid > 0); + Assert.isTrue(user.getUid() > 0); String hash = RandomStringUtils.randomAlphanumeric(16).toUpperCase(); - userService.setLoginForUser(uid, hash); + userService.setLoginForUser(user.getUid(), hash); setCookie(new String[]{hash}, getTokenValiditySeconds(), request, response); } catch (Exception e) { @@ -107,11 +107,11 @@ public class CookieSimpleHashRememberMeServices extends AbstractRememberMeServic throw new InvalidCookieException("Cookie is invalid and hash parameter not found"); } - int uid = userService.getUIDbyHash(hash); - if (uid <= 0) + User user = userService.getUserByHash(hash); + if (user.getUid() <= 0) throw new UsernameNotFoundException("User not found by hash, cookies" + cookieTokens); - Optional userOptional = userService.getUserByUID(uid); + Optional userOptional = userService.getUserByUID(user.getUid()); Assert.isTrue(userOptional.isPresent()); diff --git a/juick-server/build.gradle b/juick-server/build.gradle index a28f6efa..7258b3c1 100644 --- a/juick-server/build.gradle +++ b/juick-server/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'org.springframework.boot' dependencies { compile project(':juick-common') compile ('org.springframework.boot:spring-boot-starter-security') - compile ('org.springframework.boot:spring-boot-starter-jdbc') + compile ('org.springframework.boot:spring-boot-starter-data-jpa') providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") providedRuntime 'com.h2database:h2:1.4.196' diff --git a/juick-server/src/main/java/com/juick/server/EmailManager.java b/juick-server/src/main/java/com/juick/server/EmailManager.java index 66e84358..8e07f7d3 100644 --- a/juick-server/src/main/java/com/juick/server/EmailManager.java +++ b/juick-server/src/main/java/com/juick/server/EmailManager.java @@ -50,19 +50,19 @@ public class EmailManager implements ApplicationListener { } if (MessageUtils.isPM(msg)) { String subject = String.format("Private message from %s", msg.getUser().getName()); - emailService.getEmails(msg.getTo().getUid(), true).forEach(email -> { + emailService.getEmails(msg.getTo(), true).forEach(email -> { emailNotify(email, subject, msg); }); } else if (MessageUtils.isReply(msg)) { Message originalMessage = messagesService.getMessage(msg.getMid()); String subject = String.format("New reply to %s", originalMessage.getUser().getName()); subscribedUsers.stream() - .flatMap(user -> emailService.getEmails(user.getUid(), true).stream()) + .flatMap(user -> emailService.getEmails(user, true).stream()) .forEach(email -> emailNotify(email, subject, msg)); } else { String subject = String.format("New message from %s", msg.getUser().getName()); subscribedUsers - .forEach(user -> emailService.getEmails(user.getUid(), true) + .forEach(user -> emailService.getEmails(user, true) .forEach(email -> emailNotify(email, subject, msg))); } } @@ -96,7 +96,7 @@ public class EmailManager implements ApplicationListener { ", discussion or tag. Reply to this email directly or view it on Juick: %s.", formatPost(msg), formatUrl(msg)); MimeBodyPart textBodyPart = new MimeBodyPart(); - String hash = userService.getHashByUID(userService.getUserByEmail(email).getUid()); + String hash = userService.getHashForUser(userService.getUserByEmail(email)); textBodyPart.setContent(plainText, "text/plain; charset=UTF-8"); String htmlText = String.format("%s

--
You are receiving this because you are subscribed to this user" + ", discussion or tag. Reply to this email directly or view it on Juick." + @@ -110,7 +110,7 @@ public class EmailManager implements ApplicationListener { multipart.addBodyPart(htmlBodyPart); message.setContent(multipart); message.setHeader("List-Unsubscribe", String.format("https://juick.com/settings?hash=%s", - userService.getHashByUID(userService.getUserByEmail(email).getUid()))); + userService.getHashForUser(userService.getUserByEmail(email)))); message.saveChanges(); transport.connect(); transport.sendMessage(message, message.getAllRecipients()); diff --git a/juick-server/src/main/java/com/juick/server/TelegramBotManager.java b/juick-server/src/main/java/com/juick/server/TelegramBotManager.java index 3c3fbc9f..c47493b4 100644 --- a/juick-server/src/main/java/com/juick/server/TelegramBotManager.java +++ b/juick-server/src/main/java/com/juick/server/TelegramBotManager.java @@ -112,7 +112,7 @@ public class TelegramBotManager implements NotificationListener { return; } } - User user_from = userService.getUserByUID(telegramService.getUser(message.chat().id())).orElse(AnonymousUser.INSTANCE); + User user_from = telegramService.getUser(message.chat().id()); logger.info("Found juick user {}", user_from.getUid()); List chats = telegramService.getChats(); @@ -161,7 +161,7 @@ public class TelegramBotManager implements NotificationListener { || text.equalsIgnoreCase("/logout") || text.equalsIgnoreCase("/start") || text.equalsIgnoreCase("/help")) { - String msgUrl = "http://juick.com/login?hash=" + userService.getHashByUID(user_from.getUid()); + String msgUrl = "http://juick.com/login?hash=" + userService.getHashForUser(user_from); String msg = String.format("Hi, %s!\nYou can post messages and images to Juick there.\n" + "Tap to [log into website](%s) to get more info", user_from.getName(), msgUrl); telegramNotify(message.from().id().longValue(), msg, new com.juick.Message()); @@ -275,7 +275,7 @@ public class TelegramBotManager implements NotificationListener { } private void processTelegramResponse(Long chatId, SendResponse response, com.juick.Message source) { - int userId = telegramService.getUser(chatId); + User user = telegramService.getUser(chatId); if (!response.isOk()) { if (response.errorCode() == 403) { // remove from anonymous chat @@ -285,11 +285,9 @@ public class TelegramBotManager implements NotificationListener { logger.info("deleted {} chat", d); } ); - if (userId > 0) { - User userToDelete = userService.getUserByUID(userId) - .orElseThrow(IllegalStateException::new); - boolean status = telegramService.deleteTelegramUser(userToDelete.getUid()); - logger.info("deleting telegram id of @{} : {}", userToDelete.getName(), status); + if (!user.isAnonymous()) { + boolean status = telegramService.deleteTelegramUser(user.getUid()); + logger.info("deleting telegram id of @{} : {}", user.getName(), status); boolean chatStatus = telegramService.deleteChat(chatId); logger.info("deleting telegram chat {} : {}", chatId, chatStatus); } @@ -299,9 +297,7 @@ public class TelegramBotManager implements NotificationListener { } } else { if (MessageUtils.isReply(source)) { - messagesService.setLastReadComment(userService.getUserByUID(userId) - .orElseThrow(IllegalStateException::new), source.getMid(), source.getRid()); - User user = userService.getUserByUID(userId).orElseThrow(IllegalStateException::new); + messagesService.setLastReadComment(user, source.getMid(), source.getRid()); applicationEventPublisher.publishEvent(new MessageReadEvent(this, user, source)); } } @@ -350,7 +346,7 @@ public class TelegramBotManager implements NotificationListener { users.forEach(c -> telegramNotify(c, msg, jmsg)); // anonymous - chats.stream().filter(u -> telegramService.getUser(u) == 0).forEach(c -> telegramNotify(c, msg, jmsg)); + chats.stream().filter(u -> telegramService.getUser(u).isAnonymous()).forEach(c -> telegramNotify(c, msg, jmsg)); } } @Override diff --git a/juick-server/src/main/java/com/juick/server/TwitterManager.java b/juick-server/src/main/java/com/juick/server/TwitterManager.java index 9b83b197..1f958313 100644 --- a/juick-server/src/main/java/com/juick/server/TwitterManager.java +++ b/juick-server/src/main/java/com/juick/server/TwitterManager.java @@ -50,7 +50,7 @@ public class TwitterManager implements NotificationListener { private String twitter_consumer_secret; void twitterPost(final com.juick.Message jmsg) { - crosspostService.getTwitterToken(jmsg.getUser().getUid()).ifPresent(t -> { + crosspostService.getTwitterToken(jmsg.getUser()).ifPresent(t -> { String status = MessageUtils.getMessageHashTags(jmsg) + StringUtils.defaultString(jmsg.getText()); if (status.length() > 253) { status = status.substring(0, 252) + "…"; @@ -77,7 +77,7 @@ public class TwitterManager implements NotificationListener { if (MessageUtils.isPM(msg) || MessageUtils.isReply(msg) || msg.isService()) { return; } - if (StringUtils.isNotEmpty(crosspostService.getTwitterName(msg.getUser().getUid()))) { + if (StringUtils.isNotEmpty(crosspostService.getTwitterName(msg.getUser()))) { if (msg.getTags().stream().noneMatch(t -> t.getName().equals("notwitter"))) { twitterPost(msg); } diff --git a/juick-server/src/main/java/com/juick/server/XMPPConnection.java b/juick-server/src/main/java/com/juick/server/XMPPConnection.java index 12e66d40..32b5a552 100644 --- a/juick-server/src/main/java/com/juick/server/XMPPConnection.java +++ b/juick-server/src/main/java/com/juick/server/XMPPConnection.java @@ -363,7 +363,7 @@ public class XMPPConnection implements StanzaListener, NotificationListener { Message mm = new Message(); mm.setTo(Jid.of(userJid)); mm.setType(Message.Type.CHAT); - boolean inroster = pmQueriesService.havePMinRoster(msg.getUser().getUid(), userJid); + boolean inroster = pmQueriesService.havePMinRoster(msg.getUser(), userJid); if (inroster) { mm.setFrom(Jid.of(msg.getUser().getName(), "juick.com", "Juick")); mm.setBody(msg.getText()); @@ -463,7 +463,7 @@ public class XMPPConnection implements StanzaListener, NotificationListener { private void incomingPresence(Presence p) { final String username = p.getTo().getLocal(); final boolean toJuick = username.equals(jid.getLocal()); - + User toUser = userService.getUserByName(username); if (p.getType() == null) { Presence reply = new Presence(); reply.setFrom(p.getTo().asBareJid()); @@ -471,12 +471,7 @@ public class XMPPConnection implements StanzaListener, NotificationListener { reply.setType(Presence.Type.UNSUBSCRIBE); router.send(ClientPresence.from(reply)); } else if (p.getType().equals(Presence.Type.PROBE)) { - int uid_to = 0; - if (!toJuick) { - uid_to = userService.getUIDbyName(username); - } - - if (toJuick || uid_to > 0) { + if (toJuick || !toUser.isAnonymous()) { Presence reply = new Presence(); reply.setFrom(p.getTo().withResource(jid.getResource())); reply.setTo(p.getFrom()); @@ -499,9 +494,8 @@ public class XMPPConnection implements StanzaListener, NotificationListener { if (toJuick) { canSubscribe = true; } else { - int uid_to = userService.getUIDbyName(username); - if (uid_to > 0) { - pmQueriesService.addPMinRoster(uid_to, p.getFrom().asBareJid().toEscapedString()); + if (!toUser.isAnonymous()) { + pmQueriesService.addPMinRoster(toUser, p.getFrom().asBareJid().toEscapedString()); canSubscribe = true; } } @@ -527,9 +521,8 @@ public class XMPPConnection implements StanzaListener, NotificationListener { } } else if (p.getType().equals(Presence.Type.UNSUBSCRIBE)) { if (!toJuick) { - int uid_to = userService.getUIDbyName(username); - if (uid_to > 0) { - pmQueriesService.removePMinRoster(uid_to, p.getFrom().asBareJid().toEscapedString()); + if (!toUser.isAnonymous()) { + pmQueriesService.removePMinRoster(toUser, p.getFrom().asBareJid().toEscapedString()); } } diff --git a/juick-server/src/main/java/com/juick/server/api/PM.java b/juick-server/src/main/java/com/juick/server/api/PM.java index cbd70bed..0985e7c4 100644 --- a/juick-server/src/main/java/com/juick/server/api/PM.java +++ b/juick-server/src/main/java/com/juick/server/api/PM.java @@ -54,16 +54,16 @@ public class PM { if (visitor.isAnonymous()) { throw new HttpForbiddenException(); } - int uid = 0; + User user = AnonymousUser.INSTANCE; if (uname != null && uname.matches("^[a-zA-Z0-9\\-]{2,16}$")) { - uid = userService.getUIDbyName(uname); + user = userService.getUserByName(uname); } - if (uid == 0) { + if (user.getUid() == 0) { throw new HttpBadRequestException(); } - return pmQueriesService.getPMMessages(visitor.getUid(), uid); + return pmQueriesService.getPMMessages(visitor, user); } @RequestMapping(value = "/pm", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @@ -87,7 +87,7 @@ public class PM { throw new HttpForbiddenException(); } - if (pmQueriesService.createPM(visitor.getUid(), userTo.getUid(), body)) { + if (pmQueriesService.createPM(visitor, userTo, body)) { com.juick.Message jmsg = new com.juick.Message(); jmsg.setUser(visitor); jmsg.setText(body); @@ -112,7 +112,7 @@ public class PM { cnt = 10; } - List lastconv = pmQueriesService.getPMLastConversationsUsers(visitor.getUid(), cnt); + List lastconv = pmQueriesService.getPMLastConversationsUsers(visitor, cnt); PrivateChats pms = new PrivateChats(); pms.setUsers(lastconv); return pms; diff --git a/juick-server/src/main/java/com/juick/server/api/SocialLogin.java b/juick-server/src/main/java/com/juick/server/api/SocialLogin.java index dc7425e1..195d1217 100644 --- a/juick-server/src/main/java/com/juick/server/api/SocialLogin.java +++ b/juick-server/src/main/java/com/juick/server/api/SocialLogin.java @@ -25,6 +25,7 @@ import com.github.scribejava.core.model.OAuthRequest; import com.github.scribejava.core.model.Verb; import com.github.scribejava.core.oauth.OAuth20Service; import com.juick.facebook.User; +import com.juick.server.helpers.AnonymousUser; import com.juick.server.util.HttpBadRequestException; import com.juick.service.CrosspostService; import com.juick.service.EmailService; @@ -44,6 +45,8 @@ import org.springframework.web.util.UriComponentsBuilder; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.io.IOException; +import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -137,22 +140,22 @@ public class SocialLogin { throw new HttpBadRequestException(); } - int uid = crosspostService.getUIDbyFBID(fbID); - if (uid > 0) { + com.juick.User user = crosspostService.getUserByFBID(fbID).orElse(AnonymousUser.INSTANCE); + if (!user.isAnonymous()) { if (!crosspostService.updateFacebookUser(fbID, token.getAccessToken(), fb.getName(), fb.getLink())) { logger.error("error updating facebook user, id: {}, token: {}", fbID, token.getAccessToken()); throw new HttpBadRequestException(); } UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(redirectUrl); - uriComponentsBuilder.queryParam("hash", userService.getHashByUID(uid)); + uriComponentsBuilder.queryParam("hash", userService.getHashForUser(user)); return "redirect:" + uriComponentsBuilder.build().toUriString(); } else if (fb.getVerified()) { if (!crosspostService.createFacebookUser(fbID, state, token.getAccessToken(), fb.getName(), fb.getLink())) { if (StringUtils.isNotEmpty(fb.getEmail())) { logger.info("found {} for facebook user {}", fb.getEmail(), fb.getLink()); - Integer userId = crosspostService.getUIDbyFBID(fbID); - if (!emailService.getEmails(userId, false).contains(fb.getEmail())) { - emailService.addEmail(userId, fb.getEmail()); + user = crosspostService.getUserByFBID(fbID).orElse(AnonymousUser.INSTANCE); + if (!emailService.getEmails(user, false).contains(fb.getEmail())) { + emailService.addEmail(user, fb.getEmail()); } } logger.info("email not found for facebook user {}", fb.getLink()); @@ -254,10 +257,10 @@ public class SocialLogin { } Long vkID = NumberUtils.toLong(jsonUser.getId(), 0); - int uid = crosspostService.getUIDbyVKID(vkID); - if (uid > 0) { + com.juick.User vkUser = crosspostService.getUserByVKID(vkID).orElse(AnonymousUser.INSTANCE); + if (!vkUser.isAnonymous()) { UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(redirectUrl); - uriComponentsBuilder.queryParam("hash", userService.getHashByUID(uid)); + uriComponentsBuilder.queryParam("hash", userService.getHashForUser(vkUser)); return "redirect:" + uriComponentsBuilder.build().toUriString(); } else { String loginhash = UUID.randomUUID().toString(); @@ -282,17 +285,17 @@ public class SocialLogin { byte[] secretKey = DigestUtils.sha256(telegramToken); String resultString = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey).hmacHex(dataCheckString); if (hash.equals(resultString)) { - Long tgUser = Long.valueOf(params.get("id")); - int uid = telegramService.getUser(tgUser); - if (uid > 0) { - Cookie c = new Cookie("hash", userService.getHashByUID(uid)); + Long tgUserId = Long.valueOf(params.get("id")); + com.juick.User tgUser = telegramService.getUser(tgUserId); + if (!tgUser.isAnonymous()) { + Cookie c = new Cookie("hash", userService.getHashForUser(tgUser)); c.setMaxAge(50 * 24 * 60 * 60); response.addCookie(c); return Utils.getPreviousPageByRequest(request).orElse("redirect:/"); } else { String username = StringUtils.defaultString(params.get("username"), params.get("first_name")); - telegramService.createTelegramUser(tgUser, username); - return "redirect:/signup?type=durov&hash=" + userService.getSignUpHashByTelegramID(tgUser, username); + telegramService.createTelegramUser(tgUserId, username); + return "redirect:/signup?type=durov&hash=" + userService.getSignUpHashByTelegramID(tgUserId, username); } } else { logger.warn("invalid tg hash {} for {}", resultString, hash); diff --git a/juick-server/src/main/java/com/juick/server/api/Users.java b/juick-server/src/main/java/com/juick/server/api/Users.java index 41deddb8..53d49e5b 100644 --- a/juick-server/src/main/java/com/juick/server/api/Users.java +++ b/juick-server/src/main/java/com/juick/server/api/Users.java @@ -46,7 +46,7 @@ public class Users { @ApiOperation(value = "This returns user token", notes = "Pass login and password using HTTP Basic") @RequestMapping(value = "/auth", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String getAuthToken() { - return userService.getHashByUID(UserUtils.getCurrentUser().getUid()); + return userService.getHashForUser(UserUtils.getCurrentUser()); } @RequestMapping(value = "/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) diff --git a/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java b/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java index 14bdc7e2..e4dd50f9 100644 --- a/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java @@ -18,6 +18,8 @@ package com.juick.service; import com.juick.ExternalToken; +import com.juick.User; +import com.juick.service.data.UsersRepository; import com.juick.server.helpers.ApplicationStatus; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -25,6 +27,7 @@ import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import javax.inject.Inject; import java.util.List; import java.util.Optional; @@ -33,15 +36,17 @@ import java.util.Optional; */ @Repository public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostService { + @Inject + UsersRepository usersRepository; @Transactional(readOnly = true) @Override - public Optional getTwitterToken(final int uid) { + public Optional getTwitterToken(final User user) { List list = getJdbcTemplate().query( "SELECT uname, access_token, access_token_secret FROM twitter WHERE user_id = ? AND crosspost = 1", (rs, num) -> new ExternalToken(rs.getString(1), "twitter", rs.getString(2), rs.getString(3)), - uid); + user.getUid()); return list.isEmpty() ? Optional.empty() : Optional.of(list.get(0)); @@ -49,9 +54,9 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional @Override - public boolean deleteTwitterToken(Integer uid) { - return getJdbcTemplate().update("DELETE FROM twitter WHERE user_id=?", uid) > 0 - && getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=1741", uid) > 0; + public boolean deleteTwitterToken(User user) { + return getJdbcTemplate().update("DELETE FROM twitter WHERE user_id=?", user.getUid()) > 0 + && getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=1741", user.getUid()) > 0; } @Override @@ -86,18 +91,18 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional(readOnly = true) @Override - public Optional> getFacebookTokens(final int uid) { + public Optional> getFacebookTokens(final User user) { List>> list = getJdbcTemplate().query( "SELECT fb_id, access_token FROM facebook WHERE user_id = ? AND access_token IS NOT NULL AND crosspost = 1", (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), - uid); + user.getUid()); return list.isEmpty() ? Optional.empty() : list.get(0); } @Transactional(readOnly = true) @Override - public ApplicationStatus getFbCrossPostStatus(final int uid) { + public ApplicationStatus getFbCrossPostStatus(final User user) { List list = getJdbcTemplate().query( "SELECT 1, crosspost FROM facebook WHERE user_id = ? LIMIT 1", (rs, num) -> { @@ -108,7 +113,7 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe return status; }, - uid); + user.getUid()); return list.isEmpty() ? new ApplicationStatus() : list.get(0); @@ -116,28 +121,28 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional @Override - public boolean enableFBCrosspost(Integer uid) { - return getJdbcTemplate().update("UPDATE facebook SET crosspost=1 WHERE user_id=?", uid) > 0 + public boolean enableFBCrosspost(User user) { + return getJdbcTemplate().update("UPDATE facebook SET crosspost=1 WHERE user_id=?", user.getUid()) > 0 && getJdbcTemplate().update( "INSERT INTO subscr_users(user_id,suser_id,jid,active) VALUES (?,5863,'juick@facebook.juick.com',1)", - uid) > 0; + user.getUid()) > 0; } @Transactional @Override - public void disableFBCrosspost(Integer uid) { - getJdbcTemplate().update("UPDATE facebook SET crosspost=0 WHERE user_id=?", uid); + public void disableFBCrosspost(User user) { + getJdbcTemplate().update("UPDATE facebook SET crosspost=0 WHERE user_id=?", user.getUid()); // TODO: stop using magic numbers for system users - getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=5863", uid); + getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=5863", user.getUid()); } @Transactional(readOnly = true) @Override - public String getTwitterName(final int uid) { + public String getTwitterName(final User user) { List list = getJdbcTemplate().queryForList( "SELECT uname FROM twitter WHERE user_id = ?", String.class, - uid); + user.getUid()); return list.isEmpty() ? StringUtils.EMPTY : list.get(0); @@ -145,11 +150,11 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional(readOnly = true) @Override - public String getTelegramName(final int uid) { + public String getTelegramName(final User user) { List list = getJdbcTemplate().queryForList( "SELECT tg_name FROM telegram WHERE user_id = ?", String.class, - uid); + user.getUid()); return list.isEmpty() ? StringUtils.EMPTY : list.get(0); @@ -157,11 +162,11 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional(readOnly = true) @Override - public Optional> getVkTokens(final int uid) { + public Optional> getVkTokens(final User user) { List>> list = getJdbcTemplate().query( "SELECT vk_id, access_token FROM vk WHERE user_id = ? AND crosspost = 1", (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), - uid); + user.getUid()); return list.isEmpty() ? Optional.empty() : list.get(0); @@ -169,19 +174,14 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional @Override - public void deleteVKUser(Integer uid) { - getJdbcTemplate().update("DELETE FROM vk WHERE user_id=?", uid); + public void deleteVKUser(User user) { + getJdbcTemplate().update("DELETE FROM vk WHERE user_id=?", user.getUid()); } @Transactional(readOnly = true) @Override - public int getUIDbyFBID(long fbID) { - try { - return getJdbcTemplate().queryForObject("SELECT user_id FROM facebook WHERE fb_id=? AND user_id IS NOT NULL", - Integer.class, fbID); - } catch (EmptyResultDataAccessException e) { - return 0; - } + public Optional getUserByFBID(long fbID) { + return usersRepository.findByFacebookIds_FacebookId(fbID).map(EntityUtils::entityToUser); } @Transactional @@ -200,12 +200,8 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional(readOnly = true) @Override - public int getUIDbyVKID(long vkID) { - try { - return getJdbcTemplate().queryForObject("SELECT user_id FROM vk WHERE vk_id=? AND user_id IS NOT NULL", Integer.class, vkID); - } catch (EmptyResultDataAccessException e) { - return 0; - } + public Optional getUserByVKID(long vkID) { + return usersRepository.findByVkIds_VkId(vkID).map(EntityUtils::entityToUser); } @Transactional @@ -243,8 +239,8 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional @Override - public boolean setFacebookUser(String hash, int uid) { - return getJdbcTemplate().update("UPDATE facebook SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0; + public boolean setFacebookUser(String hash, User user) { + return getJdbcTemplate().update("UPDATE facebook SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), hash) > 0; } @Transactional @@ -260,14 +256,14 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional @Override - public boolean setVKUser(String hash, int uid) { - return getJdbcTemplate().update("UPDATE vk SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0; + public boolean setVKUser(String hash, User user) { + return getJdbcTemplate().update("UPDATE vk SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), hash) > 0; } @Transactional @Override - public boolean setTelegramUser(String hash, int uid) { - return getJdbcTemplate().update("UPDATE telegram SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0; + public boolean setTelegramUser(String hash, User user) { + return getJdbcTemplate().update("UPDATE telegram SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), hash) > 0; } @Transactional(readOnly = true) @@ -282,7 +278,7 @@ public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostSe @Transactional @Override - public boolean setJIDUser(String hash, int uid) { - return getJdbcTemplate().update("UPDATE jids SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0; + public boolean setJIDUser(String hash, User user) { + return getJdbcTemplate().update("UPDATE jids SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), hash) > 0; } } diff --git a/juick-server/src/main/java/com/juick/service/EmailServiceImpl.java b/juick-server/src/main/java/com/juick/service/EmailServiceImpl.java index 0cccc915..47d1efe5 100644 --- a/juick-server/src/main/java/com/juick/service/EmailServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/EmailServiceImpl.java @@ -17,6 +17,7 @@ package com.juick.service; +import com.juick.User; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -35,12 +36,12 @@ import java.util.List; public class EmailServiceImpl extends BaseJdbcService implements EmailService { @Override - public boolean verifyAddressByCode(Integer userId, String code) { + public boolean verifyAddressByCode(User user, String code) { try { String address = getJdbcTemplate().queryForObject("SELECT account FROM auth WHERE user_id=? AND protocol='email' AND authcode=?", - String.class, userId, code); - addEmail(userId, address); - getJdbcTemplate().update("DELETE FROM auth WHERE user_id=? AND authcode=?", userId, code); + String.class, user.getUid(), code); + addEmail(user, address); + getJdbcTemplate().update("DELETE FROM auth WHERE user_id=? AND authcode=?", user.getUid(), code); } catch (EmptyResultDataAccessException e) { return false; } @@ -48,45 +49,45 @@ public class EmailServiceImpl extends BaseJdbcService implements EmailService { } @Override - public boolean addVerificationCode(Integer userId, String account, String code) { + public boolean addVerificationCode(User user, String account, String code) { return getJdbcTemplate().update("INSERT INTO auth(user_id,protocol,account,authcode) VALUES (?,'email',?,?)", - userId, account, code) > 0; + user.getUid(), account, code) > 0; } @Override - public boolean addEmail(Integer userId, String email) { - return getJdbcTemplate().update("INSERT INTO emails(user_id,email) VALUES (?,?)", userId, email) > 0; + public boolean addEmail(User user, String email) { + return getJdbcTemplate().update("INSERT INTO emails(user_id,email) VALUES (?,?)", user.getUid(), email) > 0; } @Override - public boolean deleteEmail(Integer userId, String account) { + public boolean deleteEmail(User user, String account) { return getNamedParameterJdbcTemplate().update("DELETE FROM emails " + "WHERE (SELECT COUNT(*) cnt FROM (select user_id, email FROM emails e) c WHERE user_id=:uid) > 1 " + "AND user_id=:uid AND email=:email", new MapSqlParameterSource() - .addValue("uid", userId) + .addValue("uid", user.getUid()) .addValue("email", account)) > 0; } @Transactional(readOnly = true) @Override - public String getNotificationsEmail(Integer userId) { + public String getNotificationsEmail(User user) { List list = getJdbcTemplate().queryForList( - "SELECT email FROM emails WHERE user_id=? AND subscr_hour IS NOT NULL", String.class, userId); + "SELECT email FROM emails WHERE user_id=? AND subscr_hour IS NOT NULL", String.class, user.getUid()); return list.isEmpty() ? StringUtils.EMPTY : list.get(0); } @Override - public boolean setNotificationsEmail(Integer userId, String account) { - getJdbcTemplate().update("UPDATE emails SET subscr_hour=NULL WHERE user_id=?", userId); + public boolean setNotificationsEmail(User user, String account) { + getJdbcTemplate().update("UPDATE emails SET subscr_hour=NULL WHERE user_id=?", user.getUid()); return StringUtils.isNotEmpty(account) && getJdbcTemplate().update( - "UPDATE emails SET subscr_hour=1 WHERE user_id=? AND email=?", userId, account) > 0; + "UPDATE emails SET subscr_hour=1 WHERE user_id=? AND email=?", user.getUid(), account) > 0; } @Transactional(readOnly = true) @Override - public List getEmails(Integer userId, boolean active) { + public List getEmails(User user, boolean active) { return getJdbcTemplate().queryForList("SELECT email FROM emails WHERE user_id=? " + - (active ? "AND subscr_hour IS NOT NULL" : ""), String.class, userId); + (active ? "AND subscr_hour IS NOT NULL" : ""), String.class, user.getUid()); } } diff --git a/juick-server/src/main/java/com/juick/service/EntityUtils.java b/juick-server/src/main/java/com/juick/service/EntityUtils.java new file mode 100644 index 00000000..7f296e77 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/EntityUtils.java @@ -0,0 +1,22 @@ +package com.juick.service; + +import com.juick.User; +import com.juick.service.data.entities.UserEntity; + +class EntityUtils { + static User entityToUser(UserEntity entity) { + User user = new User(); + user.setUid(entity.getId()); + user.setName(entity.getName()); + user.setBanned(entity.isBanned()); + return user; + } + static User entityToSecurityUser(UserEntity entity) { + User user = new User(); + user.setUid(entity.getId()); + user.setName(entity.getName()); + user.setBanned(entity.isBanned()); + user.setCredentials(entity.getPassword()); + return user; + } +} diff --git a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java index a78c9203..b981b37f 100644 --- a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java @@ -20,6 +20,9 @@ package com.juick.service; import com.juick.*; import com.juick.server.helpers.PrivacyOpts; import com.juick.server.helpers.ResponseReply; +import com.juick.service.data.MessagesRepository; +import com.juick.service.data.UsersRepository; +import com.juick.service.data.entities.MessageEntity; import com.juick.util.MessageUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -51,6 +54,10 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ @Inject private UserService userService; @Inject + private UsersRepository usersRepository; + @Inject + private MessagesRepository messagesRepository; + @Inject private TagService tagService; @Inject private SearchService searchService; @@ -110,19 +117,15 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ */ @Transactional @Override - public int createMessage(final int uid, final String txt, final String attachment, final Collection tags) { - SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(getJdbcTemplate()).withTableName("messages") - .usingColumns("user_id", "attach", "ts") - .usingGeneratedKeyColumns("message_id"); - Map insertMap = new HashMap<>(); - insertMap.put("user_id", uid); + public Message createMessage(final User user, final String txt, final String attachment, final Collection tags) { + MessageEntity newMsg = new MessageEntity(); + newMsg.setText(txt); + newMsg.setUser(usersRepository.findById(user.getUid()).orElseThrow(IllegalStateException::new)); Instant now = Instant.now(); - insertMap.put("ts", Timestamp.from(now)); - if (attachment != null) { - insertMap.put("attach", attachment); - } - int mid = simpleJdbcInsert.executeAndReturnKey(insertMap).intValue(); - if (mid > 0) { + newMsg.setTimestamp(now); + + newMsg = messagesRepository.save(newMsg); + if (newMsg.getId() > 0) { String tagsNames = StringUtils.EMPTY; if (CollectionUtils.isNotEmpty(tags)) { @@ -138,7 +141,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ next = true; tasNamesBuilder.append(tag.getName()); - params.add(new Object[]{mid, tag.TID}); + params.add(new Object[]{newMsg.getId(), tag.TID}); } tagsNames = tasNamesBuilder.toString(); @@ -148,13 +151,13 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ } getJdbcTemplate().update( - "INSERT INTO messages_txt(message_id, tags, txt) VALUES (?, ?, ?)", - new Object[]{mid, tagsNames, txt}, - new int[]{Types.INTEGER, Types.VARCHAR, Types.VARCHAR}); - getJdbcTemplate().update("UPDATE users SET lastmessage=? where id=?", Timestamp.from(now), uid); + "UPDATE messages_txt SET tags=? WHERE message_id=?", + new Object[]{tagsNames, newMsg.getId()}, + new int[]{Types.VARCHAR, Types.INTEGER}); + getJdbcTemplate().update("UPDATE users SET lastmessage=? where id=?", Timestamp.from(now), user.getUid()); } - return mid; + return getMessage(newMsg.getId()); } /** diff --git a/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java b/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java index b68e0236..01b825e4 100644 --- a/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java @@ -34,16 +34,16 @@ public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesSe @Transactional @Override - public boolean createPM(final int uidFrom, final int uid_to, final String body) { + public boolean createPM(final User me, final User to, final String body) { boolean ret = getJdbcTemplate().update( "INSERT INTO pm(user_id, user_id_to, txt) VALUES (?, ?, ?)", - uidFrom, uid_to, body) > 0; + me.getUid(), to.getUid(), body) > 0; if (ret) { try { getJdbcTemplate().update( "INSERT INTO pm_streams(user_id, user_id_to, lastmessage, unread) VALUES (?, ?, NOW(), 1)", - uidFrom, uid_to); + me.getUid(), to.getUid()); } catch (DuplicateKeyException e) { // ignore } @@ -53,43 +53,31 @@ public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesSe @Transactional @Override - public boolean addPMinRoster(final int uid, final String jid) { + public boolean addPMinRoster(final User me, final String jid) { return getJdbcTemplate().update( - "INSERT INTO pm_inroster(user_id, jid) VALUES (?, ?) ON DUPLICATE KEY UPDATE user_id=user_id", uid, jid) > 0; + "INSERT INTO pm_inroster(user_id, jid) VALUES (?, ?) ON DUPLICATE KEY UPDATE user_id=user_id", me.getUid(), jid) > 0; } @Transactional @Override - public boolean removePMinRoster(final int uid, final String jid) { + public boolean removePMinRoster(final User me, final String jid) { return getJdbcTemplate().update( - "DELETE FROM pm_inroster WHERE user_id = ? AND jid = ?", uid, jid) > 0; + "DELETE FROM pm_inroster WHERE user_id = ? AND jid = ?", me.getUid(), jid) > 0; } @Transactional @Override - public boolean havePMinRoster(final int uid, final String jid) { + public boolean havePMinRoster(final User me, final String jid) { List res = getJdbcTemplate().queryForList( "SELECT 1 FROM pm_inroster WHERE user_id = ? AND jid = ?", Integer.class, - uid, jid); + me.getUid(), jid); return res.size() > 0; } @Transactional(readOnly = true) @Override - public String getLastView(final int uidFrom, final int uidTo) { - List list = getJdbcTemplate().queryForList( - "SELECT lastview FROM pm_streams WHERE user_id = ? AND user_id_to = ?", - String.class, - uidFrom, uidTo); - - return list.isEmpty() ? - null : list.get(0); - } - - @Transactional(readOnly = true) - @Override - public List getPMLastConversationsUsers(final int uid, final int cnt) { + public List getPMLastConversationsUsers(final User me, final int cnt) { return getJdbcTemplate().query( "SELECT pm_streams.user_id, users.nick, pm_streams.unread FROM pm_streams " + "INNER JOIN users ON users.id = pm_streams.user_id " @@ -102,15 +90,15 @@ public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesSe u.setUnreadCount(rs.getInt(3)); return u; }, - uid, cnt); + me.getUid(), cnt); } @Transactional @Override - public List getPMMessages(final int uid, final int uidTo) { + public List getPMMessages(final User me, final User to) { SqlParameterSource sqlParameterSource = new MapSqlParameterSource() - .addValue("uid", uid) - .addValue("uidTo", uidTo); + .addValue("uid", me.getUid()) + .addValue("uidTo", to.getUid()); List msgs = getNamedParameterJdbcTemplate().query( "SELECT pm.user_id, pm.txt, pm.ts, users.nick FROM pm INNER JOIN users ON users.id=pm.user_id WHERE (user_id = :uid AND user_id_to = :uidTo) " @@ -137,7 +125,7 @@ public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesSe @Transactional(readOnly = true) @Override - public List getLastPMInbox(final int uid) { + public List getLastPMInbox(final User me) { return getJdbcTemplate().query( "SELECT pm.user_id, users.nick, pm.txt, pm.ts " + "FROM pm INNER JOIN users ON pm.user_id=users.id WHERE pm.user_id_to=? ORDER BY pm.ts DESC LIMIT 20", @@ -150,12 +138,12 @@ public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesSe msg.setTimestamp(rs.getTimestamp(4).toInstant()); return msg; }, - uid); + me.getUid()); } @Transactional(readOnly = true) @Override - public List getLastPMSent(final int uid) { + public List getLastPMSent(final User me) { return getJdbcTemplate().query( "SELECT pm.user_id_to, users.nick, pm.txt, " + "pm.ts FROM pm INNER JOIN users ON pm.user_id_to=users.id " + @@ -169,6 +157,6 @@ public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesSe msg.setTimestamp(rs.getTimestamp(4).toInstant()); return msg; }, - uid); + me.getUid()); } } diff --git a/juick-server/src/main/java/com/juick/service/TelegramServiceImpl.java b/juick-server/src/main/java/com/juick/service/TelegramServiceImpl.java index 4e37bfac..dd6ab8cf 100644 --- a/juick-server/src/main/java/com/juick/service/TelegramServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/TelegramServiceImpl.java @@ -18,13 +18,17 @@ package com.juick.service; import com.juick.User; +import com.juick.server.helpers.AnonymousUser; +import com.juick.service.data.UsersRepository; import org.springframework.dao.DuplicateKeyException; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import javax.inject.Inject; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -33,6 +37,8 @@ import java.util.stream.Collectors; */ @Repository public class TelegramServiceImpl extends BaseJdbcService implements TelegramService { + @Inject + UsersRepository usersRepository; @Transactional @Override @@ -58,12 +64,8 @@ public class TelegramServiceImpl extends BaseJdbcService implements TelegramServ @Transactional(readOnly = true) @Override - public int getUser(final long tgId) { - List list = getJdbcTemplate().queryForList( - "SELECT id FROM users INNER JOIN telegram " + - "ON telegram.user_id = users.id WHERE telegram.tg_id=?", Integer.class, tgId); - - return list.isEmpty() ? 0 : list.get(0); + public User getUser(final long tgId) { + return usersRepository.findByTgIds_Identifier(tgId).map(EntityUtils::entityToUser).orElse(AnonymousUser.INSTANCE); } @Transactional diff --git a/juick-server/src/main/java/com/juick/service/UserServiceImpl.java b/juick-server/src/main/java/com/juick/service/UserServiceImpl.java index 2de3dfc6..ad6be9aa 100644 --- a/juick-server/src/main/java/com/juick/service/UserServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/UserServiceImpl.java @@ -19,31 +19,35 @@ package com.juick.service; import com.juick.Message; import com.juick.User; +import com.juick.service.data.UsersRepository; +import com.juick.service.data.entities.EmailEntity; +import com.juick.service.data.entities.LoginEntity; +import com.juick.service.data.entities.UserEntity; import com.juick.server.helpers.AnonymousUser; import com.juick.server.helpers.Auth; import com.juick.server.helpers.UserInfo; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.dao.DuplicateKeyException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; -import java.sql.PreparedStatement; +import javax.inject.Inject; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import java.util.*; +import java.util.stream.Collectors; /** * Created by aalexeev on 11/13/16. */ @Repository public class UserServiceImpl extends BaseJdbcService implements UserService { + @Inject + private UsersRepository usersRepository; private class UserMapper implements RowMapper { @Override @@ -90,104 +94,55 @@ public class UserServiceImpl extends BaseJdbcService implements UserService { return list.get(0); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override - public int createUser(final String username, final String password) { - KeyHolder holder = new GeneratedKeyHolder(); + public User createUser(final String username, final String password) { + UserEntity newUser = new UserEntity(); + newUser.setName(username); + newUser.setPassword(password); try { - getJdbcTemplate().update( - con -> { - PreparedStatement stmt = con.prepareStatement( - "INSERT INTO users(nick,passw) VALUES (?,?)", - Statement.RETURN_GENERATED_KEYS); - stmt.setString(1, username); - stmt.setString(2, password); - return stmt; - }, - holder); - } catch (DuplicateKeyException e) { - return -1; + UserEntity created = usersRepository.save(newUser); + getJdbcTemplate().update("INSERT INTO useroptions(user_id) VALUES (?)", created.getId()); + getJdbcTemplate().update("INSERT INTO subscr_users(user_id, suser_id) VALUES (2, ?)", created.getId()); + return EntityUtils.entityToUser(created); + } catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AnonymousUser.INSTANCE; } - - int uid = holder.getKey().intValue(); - - getJdbcTemplate().update("INSERT INTO useroptions(user_id) VALUES (?)", uid); - getJdbcTemplate().update("INSERT INTO subscr_users(user_id, suser_id) VALUES (2, ?)", uid); - - return uid; } @Transactional(readOnly = true) @Override public Optional getUserByUID(final int uid) { - List list = getJdbcTemplate().query( - "SELECT id, nick, banned, lang FROM users WHERE id = ?", new UserMapper(), uid); - - return list.isEmpty() ? Optional.empty() : Optional.of(list.get(0)); + return usersRepository.findById(uid).map(EntityUtils::entityToUser); } @Transactional(readOnly = true) @Override public User getUserByName(final String username) { - if (StringUtils.isNotBlank(username)) { - List list = getJdbcTemplate().query( - "SELECT id, nick, banned, lang FROM users WHERE nick = ?", new UserMapper(), username); - - if (!list.isEmpty()) - return list.get(0); + Optional e = usersRepository.findByName(username); + if (e.isPresent()) { + return EntityUtils.entityToUser(e.get()); } - // TODO: @NonNullable ? return AnonymousUser.INSTANCE; } @Override - // No need marks with @Transactional annotation + @Transactional(readOnly = true) public User getFullyUserByName(final String username) { - if (StringUtils.isNotBlank(username)) { - List list = getFullyUsersByNames(Collections.singletonList(username)); - if (!list.isEmpty()) - return list.get(0); - } - return null; + return usersRepository.findByName(username).map(EntityUtils::entityToSecurityUser).orElse(AnonymousUser.INSTANCE); } @Override @Transactional(readOnly = true) public User getUserByEmail(String email) { - if (StringUtils.isNotBlank(email)) { - List list = getJdbcTemplate().query( - "SELECT id, nick, banned, lang FROM users WHERE id = (SELECT DISTINCT user_id FROM emails WHERE email = ?)", - new UserMapper(), - email); - - if (!list.isEmpty()) - return list.get(0); + Optional e = usersRepository.findByEmailsEmail(email); + if (e.isPresent()) { + return EntityUtils.entityToUser(e.get()); } return AnonymousUser.INSTANCE; } - @Transactional(readOnly = true) - @Override - public List getFullyUsersByNames(final Collection usernames) { - if (CollectionUtils.isEmpty(usernames)) - return Collections.emptyList(); - - return getNamedParameterJdbcTemplate().query( - "SELECT id, nick, passw, lang, banned FROM users WHERE nick in (:names)", - new MapSqlParameterSource("names", usernames), - (rs, rowNum) -> { - User user = new User(); - - user.setUid(rs.getInt(1)); - user.setName(rs.getString(2)); - user.setCredentials(rs.getString(3)); - user.setLang(rs.getString(4)); - user.setBanned(rs.getBoolean(5)); - - return user; - }); - } - @Transactional(readOnly = true) @Override public User getUserByJID(final String jid) { @@ -208,25 +163,13 @@ public class UserServiceImpl extends BaseJdbcService implements UserService { @Transactional(readOnly = true) @Override public List getUsersByName(final Collection unames) { - if (CollectionUtils.isEmpty(unames)) - return Collections.emptyList(); - - return getNamedParameterJdbcTemplate().query( - "SELECT id, nick, banned, lang FROM users WHERE nick IN (:unames)", - new MapSqlParameterSource("unames", unames), - new UserMapper()); + return usersRepository.findAllByNameIn(unames).map(EntityUtils::entityToUser).collect(Collectors.toList()); } @Transactional(readOnly = true) @Override public List getUsersByID(final Collection uids) { - if (CollectionUtils.isEmpty(uids)) - return Collections.emptyList(); - - return getNamedParameterJdbcTemplate().query( - "SELECT id, nick, banned, lang FROM users WHERE id IN (:ids)", - new MapSqlParameterSource("ids", uids), - new UserMapper()); + return usersRepository.findAllByIdIn(uids).map(EntityUtils::entityToUser).collect(Collectors.toList()); } @Transactional(readOnly = true) @@ -235,59 +178,13 @@ public class UserServiceImpl extends BaseJdbcService implements UserService { return getJdbcTemplate().queryForList("SELECT jid FROM jids WHERE user_id = ? AND active = 1", String.class, uid); } - @Transactional(readOnly = true) - @Override - public int getUIDbyJID(final String jid) { - if (StringUtils.isNotBlank(jid)) { - List list = getJdbcTemplate().queryForList( - "SELECT user_id FROM jids WHERE jid = ?", Integer.class, jid); - - if (!list.isEmpty()) - return list.get(0); - } - return 0; - } - - @Transactional(readOnly = true) - @Override - public int getUIDbyName(final String uname) { - if (StringUtils.isNotBlank(uname)) { - List list = getJdbcTemplate().queryForList( - "SELECT id FROM users WHERE nick = ?", Integer.class, uname); - - if (!list.isEmpty()) - return list.get(0); - } - return 0; - } - - @Transactional(readOnly = true) - @Override - public int getUIDbyHash(final String hash) { - if (StringUtils.isNotBlank(hash)) { - List list = getJdbcTemplate().queryForList( - "SELECT user_id FROM logins WHERE hash = ?", Integer.class, hash); - - if (!list.isEmpty()) - return list.get(0); - } - return 0; - } - @Transactional(readOnly = true) @Override public com.juick.User getUserByHash(final String hash) { if (StringUtils.isNotBlank(hash)) { - List list = getJdbcTemplate().query( - "SELECT logins.user_id, users.nick, users.banned, users.lang FROM logins " + - "INNER JOIN users ON logins.user_id = users.id WHERE logins.hash = ?", - new UserMapper(), - hash); - - if (!list.isEmpty()) { - User user = list.get(0); - user.setAuthHash(hash); - return user; + Optional entityUser = usersRepository.findByLogins_Hash(hash); + if (entityUser.isPresent()) { + return EntityUtils.entityToUser(entityUser.get()); } } return AnonymousUser.INSTANCE; @@ -295,49 +192,36 @@ public class UserServiceImpl extends BaseJdbcService implements UserService { @Transactional @Override - public String getHashByUID(final int uid) { - List list = getJdbcTemplate().queryForList( - "SELECT hash FROM logins WHERE user_id = ?", String.class, uid); - - if (list.isEmpty()) { - String hash = RandomStringUtils.randomAlphanumeric(16).toUpperCase(); - getJdbcTemplate().update("INSERT INTO logins(user_id, hash) VALUES (?, ?)", uid, hash); - return hash; + public String getHashForUser(final User user) { + UserEntity entityUser = usersRepository.findById(user.getUid()).orElseThrow(IllegalStateException::new); + if (entityUser.getLogins().size() > 0) { + return entityUser.getLogins().stream().findFirst().orElseThrow(IllegalStateException::new).getHash(); } - return list.get(0); + + LoginEntity newHash = new LoginEntity(); + newHash.setUser(entityUser); + newHash.setHash(RandomStringUtils.randomAlphanumeric(16).toUpperCase()); + entityUser.getLogins().add(newHash); + return getHashForUser(EntityUtils.entityToUser(usersRepository.save(entityUser))); } @Transactional(readOnly = true) @Override - public int checkPassword(final String username, final String password) { - if (StringUtils.isNotBlank(username)) { - List list = getJdbcTemplate().query( - "SELECT id, nick, banned, passw FROM users WHERE nick = ?", - (rs, rowNum) -> { - User user = new User(); - user.setUid(rs.getInt(1)); - user.setName(rs.getString(2)); - user.setBanned(rs.getBoolean(3)); - user.setCredentials(rs.getString(4)); - return user; - }, - username); - - if (!list.isEmpty()) { - User user = list.get(0); - if (Objects.equals(password, user.getCredentials())) - return user.getUid(); - } - } - return -1; + public User checkPassword(final String username, final String password) { + Optional userEntity = usersRepository.findByNameAndPassword(username, password); + if (userEntity.isPresent()) { + return EntityUtils.entityToUser(userEntity.get()); + }; + return AnonymousUser.INSTANCE; } @Transactional @Override public boolean updatePassword(final User user, final String newPassword) { - return user != null && - user.getUid() > 0 && - getJdbcTemplate().update("UPDATE users SET passw = ? WHERE id = ?", newPassword, user.getUid()) > 0; + UserEntity entityUser = usersRepository.findById(user.getUid()).orElseThrow(IllegalStateException::new); + entityUser.setPassword(newPassword); + usersRepository.save(entityUser); + return true; } @Transactional(readOnly = true) @@ -396,17 +280,6 @@ public class UserServiceImpl extends BaseJdbcService implements UserService { info.getDescription()) > 0; } - @Transactional(readOnly = true) - @Override - public boolean getCanMedia(final int uid) { - List list = getJdbcTemplate().queryForList( - "SELECT users.lastphoto - UNIX_TIMESTAMP() FROM users WHERE id = ?", - Integer.class, - uid); - - return !list.isEmpty() && list.get(0) < 3600; - } - @Transactional(readOnly = true) @Override public boolean isInWL(final int uid, final int check) { @@ -617,8 +490,12 @@ public class UserServiceImpl extends BaseJdbcService implements UserService { @Transactional(readOnly = true) @Override - public List getEmails(final User user) { - return getJdbcTemplate().queryForList("SELECT email FROM emails WHERE user_id=?", String.class, user.getUid()); + public Collection getEmails(final User user) { + Optional entityUser = usersRepository.findById(user.getUid()); + if (entityUser.isPresent()) { + return entityUser.get().getEmails().stream().map(EmailEntity::getEmail).collect(Collectors.toList()); + } + return Collections.emptyList(); } @Transactional(readOnly = true) diff --git a/juick-server/src/main/java/com/juick/service/data/MessagesRepository.java b/juick-server/src/main/java/com/juick/service/data/MessagesRepository.java new file mode 100644 index 00000000..df8e8274 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/MessagesRepository.java @@ -0,0 +1,7 @@ +package com.juick.service.data; + +import com.juick.service.data.entities.MessageEntity; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface MessagesRepository extends PagingAndSortingRepository { +} diff --git a/juick-server/src/main/java/com/juick/service/data/TextRepository.java b/juick-server/src/main/java/com/juick/service/data/TextRepository.java new file mode 100644 index 00000000..f02a4c0d --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/TextRepository.java @@ -0,0 +1,7 @@ +package com.juick.service.data; + +import com.juick.service.data.entities.TextEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TextRepository extends JpaRepository { +} diff --git a/juick-server/src/main/java/com/juick/service/data/UsersRepository.java b/juick-server/src/main/java/com/juick/service/data/UsersRepository.java new file mode 100644 index 00000000..b0a106e3 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/UsersRepository.java @@ -0,0 +1,23 @@ +package com.juick.service.data; + +import com.juick.service.data.entities.UserEntity; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.Optional; +import java.util.stream.Stream; + +@Repository +public interface UsersRepository extends CrudRepository { + Optional findById(Integer uid); + Optional findByName(String name); + Optional findByNameAndPassword(String name, String password); + Optional findByEmailsEmail(String email); + Stream findAllByNameIn(Collection names); + Stream findAllByIdIn(Collection uids); + Optional findByFacebookIds_FacebookId(Long facebookId); + Optional findByVkIds_VkId(Long vkId); + Optional findByLogins_Hash(String hash); + Optional findByTgIds_Identifier(Long telegramId); +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/BaseMessagePropertyEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/BaseMessagePropertyEntity.java new file mode 100644 index 00000000..d9407f84 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/BaseMessagePropertyEntity.java @@ -0,0 +1,20 @@ +package com.juick.service.data.entities; + +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; + +@MappedSuperclass +public class BaseMessagePropertyEntity { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "message_id") + private MessageEntity message; + public MessageEntity getMessage() { + return message; + } + + public void setMessage(MessageEntity message) { + this.message = message; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/BaseUserPropertyEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/BaseUserPropertyEntity.java new file mode 100644 index 00000000..a5b1909d --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/BaseUserPropertyEntity.java @@ -0,0 +1,20 @@ +package com.juick.service.data.entities; + +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; + +@MappedSuperclass +public class BaseUserPropertyEntity { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserEntity user; + public UserEntity getUser() { + return user; + } + + public void setUser(UserEntity user) { + this.user = user; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/EmailEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/EmailEntity.java new file mode 100644 index 00000000..d65b5da6 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/EmailEntity.java @@ -0,0 +1,20 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "emails") +public class EmailEntity extends BaseUserPropertyEntity { + @Id + @Column(name = "email", columnDefinition = "char(64)") + @GeneratedValue(strategy = GenerationType.AUTO) + private String email; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/FacebookEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/FacebookEntity.java new file mode 100644 index 00000000..587651d9 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/FacebookEntity.java @@ -0,0 +1,20 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "facebook") +public class FacebookEntity extends BaseUserPropertyEntity { + @Id + @Column(name = "fb_id", columnDefinition = "bigint(20)") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long facebookId; + + public Long getFacebookId() { + return facebookId; + } + + public void setFacebookId(Long facebookId) { + this.facebookId = facebookId; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/LoginEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/LoginEntity.java new file mode 100644 index 00000000..6799073f --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/LoginEntity.java @@ -0,0 +1,19 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "logins") +public class LoginEntity extends BaseUserPropertyEntity { + @Id + @Column(name = "hash", columnDefinition = "char(16)") + private String hash; + + public String getHash() { + return hash; + } + + public void setHash(String hash) { + this.hash = hash; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/MessageEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/MessageEntity.java new file mode 100644 index 00000000..fdbdbdc0 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/MessageEntity.java @@ -0,0 +1,81 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.Instant; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "messages") +public class MessageEntity implements Serializable { + @Id + @Column(name = "message_id", columnDefinition = "int(10) unsigned auto_increment", nullable = false, unique = true) + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "message") + private Set tags = new HashSet<>(); + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "message") + private Set replies = new HashSet<>(); + + @OneToOne(cascade = CascadeType.ALL, mappedBy = "message") + private TextEntity textEntity; + + @ManyToOne(cascade = CascadeType.ALL) + private UserEntity user; + + @Column(name = "ts") + private Instant ts; + + public MessageEntity() { + this.textEntity = new TextEntity(this); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Set getTags() { + return tags; + } + + public void setTags(Set tags) { + this.tags = tags; + } + + public Set getReplies() { + return replies; + } + + public void setReplies(Set replies) { + this.replies = replies; + } + + public String getText() { + return textEntity.getText(); + } + + public void setText(String text) { + this.textEntity.setText(text); + } + + public UserEntity getUser() { + return user; + } + + public void setUser(UserEntity user) { + this.user = user; + } + + public Instant getTimestamp() { + return ts; + } + + public void setTimestamp(Instant ts) { + this.ts = ts; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/ReplyEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/ReplyEntity.java new file mode 100644 index 00000000..65a38576 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/ReplyEntity.java @@ -0,0 +1,31 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "replies") +public class ReplyEntity extends BaseMessagePropertyEntity { + @Id + @Column(name = "reply_id", columnDefinition = "smallint") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long replyId; + @Column(name = "txt", columnDefinition = "clob") + private + String text; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Long getReplyId() { + return replyId; + } + + public void setReplyId(Long replyId) { + this.replyId = replyId; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/TagEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/TagEntity.java new file mode 100644 index 00000000..22196562 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/TagEntity.java @@ -0,0 +1,15 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "messages_tags") +public class TagEntity extends BaseMessagePropertyEntity { + @Id + @Column(name = "tag_id", columnDefinition = "int(10)") + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + @OneToOne(cascade = CascadeType.ALL) + @PrimaryKeyJoinColumn + private TagNameEntity tagName; +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/TagNameEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/TagNameEntity.java new file mode 100644 index 00000000..4540a45e --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/TagNameEntity.java @@ -0,0 +1,30 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "tags") +public class TagNameEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "tag_id") + private int id; + @Column(name = "name", columnDefinition = "varchar(70)") + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/TelegramEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/TelegramEntity.java new file mode 100644 index 00000000..e851b00e --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/TelegramEntity.java @@ -0,0 +1,20 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "telegram") +public class TelegramEntity extends BaseUserPropertyEntity { + @Id + @Column(name = "tg_id", columnDefinition = "bigint(20)") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long identifier; + + public Long getIdentifier() { + return identifier; + } + + public void setIdentifier(Long identifier) { + this.identifier = identifier; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/TextEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/TextEntity.java new file mode 100644 index 00000000..ba4b9146 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/TextEntity.java @@ -0,0 +1,42 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +@Table(name = "messages_txt") +public class TextEntity implements Serializable { + + @Id + @Column(name = "message_id", columnDefinition = "int(10)") + private Integer id; + + @Column(name = "txt", columnDefinition = "clob") + private String text; + + @OneToOne(fetch = FetchType.LAZY) + @MapsId + @JoinColumn(name = "message_id", foreignKey = @ForeignKey(name = "message_id")) + private MessageEntity message; + + public TextEntity() { + super(); + } + + public TextEntity(MessageEntity message) { + this(); + this.message = message; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public MessageEntity getMessage() { + return message; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/UserEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/UserEntity.java new file mode 100644 index 00000000..50a72bdb --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/UserEntity.java @@ -0,0 +1,109 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "users") +public class UserEntity { + @Id + @Column(name = "id", columnDefinition = "int(10) unsigned", nullable = false, unique = true) + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @Column(name = "nick", columnDefinition = "char(64)") + private String name; + + @Column(name = "passw", columnDefinition = "char(32)") + private String password; + + @Column(name = "banned", columnDefinition = "tinyint(1)") + private boolean banned; + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") + private Set emails = new HashSet<>(); + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") + private Set facebookIds = new HashSet<>(); + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") + private Set vkIds = new HashSet<>(); + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") + private Set logins = new HashSet<>(); + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") + private Set tgIds = new HashSet<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getId() { + return id; + } + + public void setId(Integer uid) { + this.id = uid; + } + + public boolean isBanned() { + return banned; + } + + public void setBanned(boolean banned) { + this.banned = banned; + } + + public Set getEmails() { + return emails; + } + + public void setEmails(Set emails) { + this.emails = emails; + } + + public Set getFacebookIds() { + return facebookIds; + } + + public void setFacebookIds(Set facebookIds) { + this.facebookIds = facebookIds; + } + + public Set getVkIds() { + return vkIds; + } + + public void setVkIds(Set vkIds) { + this.vkIds = vkIds; + } + + public Set getLogins() { + return logins; + } + + public void setLogins(Set logins) { + this.logins = logins; + } + + public Set getTgIds() { + return tgIds; + } + + public void setTgIds(Set tgIds) { + this.tgIds = tgIds; + } +} diff --git a/juick-server/src/main/java/com/juick/service/data/entities/VKEntity.java b/juick-server/src/main/java/com/juick/service/data/entities/VKEntity.java new file mode 100644 index 00000000..47b5c969 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/data/entities/VKEntity.java @@ -0,0 +1,20 @@ +package com.juick.service.data.entities; + +import javax.persistence.*; + +@Entity +@Table(name = "vk") +public class VKEntity extends BaseUserPropertyEntity { + @Id + @Column(name = "vk_id", columnDefinition = "bigint(20)") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long vkId; + + public Long getVkId() { + return vkId; + } + + public void setVkId(Long vkId) { + this.vkId = vkId; + } +} diff --git a/juick-server/src/main/resources/schema.sql b/juick-server/src/main/resources/schema.sql index 296fd486..990be36b 100644 --- a/juick-server/src/main/resources/schema.sql +++ b/juick-server/src/main/resources/schema.sql @@ -90,14 +90,6 @@ CREATE TABLE IF NOT EXISTS `messages_tags` ( UNIQUE KEY `message_id_2` (`message_id`,`tag_id`) ); -CREATE TABLE IF NOT EXISTS `messages_txt` ( - `message_id` int(10) unsigned NOT NULL, - `tags` varchar(255) DEFAULT NULL, - `repliesby` varchar(96) DEFAULT NULL, - `txt` mediumtext NOT NULL, - PRIMARY KEY (`message_id`) -); - CREATE TABLE IF NOT EXISTS `messages_votes` ( `message_id` int(10) unsigned NOT NULL, `user_id` int(10) unsigned NOT NULL, @@ -341,6 +333,13 @@ CREATE TABLE IF NOT EXISTS `messages` ( `updated` timestamp(9) NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (`user_id`) references users(id) ); +CREATE TABLE IF NOT EXISTS `messages_txt` ( + `message_id` int(10) unsigned NOT NULL, + `tags` varchar(255) DEFAULT NULL, + `repliesby` varchar(96) DEFAULT NULL, + `txt` mediumtext NOT NULL, + FOREIGN KEY (message_id) references messages(message_id) +); CREATE TABLE IF NOT EXISTS `pm_inroster` ( `user_id` int(10) unsigned NOT NULL, `jid` char(64) NOT NULL, diff --git a/juick-server/src/test/java/com/juick/server/tests/ServerTests.java b/juick-server/src/test/java/com/juick/server/tests/ServerTests.java index e4e5f298..b463765a 100644 --- a/juick-server/src/test/java/com/juick/server/tests/ServerTests.java +++ b/juick-server/src/test/java/com/juick/server/tests/ServerTests.java @@ -112,7 +112,7 @@ public class ServerTests { @Inject private MockMvc mockMvc; @Inject - private TestRestTemplate restTemplate; + private TestRestTemplate rest; @Inject private MessagesService messagesService; @Inject @@ -175,12 +175,12 @@ public class ServerTests { freefdPassword = "MyPassw0rd!"; juickName = "juick"; juickPassword = "demo"; - int ugnichId = userService.createUser(ugnichName, ugnichPassword); - ugnich = userService.getUserByUID(ugnichId).orElseThrow(IllegalStateException::new); - int freefdId = userService.createUser(freefdName, freefdPassword); - freefd = userService.getUserByUID(freefdId).orElseThrow(IllegalStateException::new); - int juickId = userService.createUser(juickName, juickPassword); - juick = userService.getUserByUID(juickId).orElseThrow(IllegalStateException::new); + ugnich = userService.createUser(ugnichName, ugnichPassword); + assertThat(ugnich, not(AnonymousUser.INSTANCE)); + freefd = userService.createUser(freefdName, freefdPassword); + assertThat(freefd, not(AnonymousUser.INSTANCE)); + juick = userService.createUser(juickName, juickPassword); + assertThat(juick, not(AnonymousUser.INSTANCE)); isSetUp = true; } } @@ -193,130 +193,123 @@ public class ServerTests { } @Test public void getMyFeed() { - int mid0 = messagesService.createMessage(ugnich.getUid(), "test", null, null); - int mid2 = messagesService.createMessage(ugnich.getUid(), "test2", null, null); + Message msg0 = messagesService.createMessage(ugnich, "test", null, null); + Message msg2 = messagesService.createMessage(ugnich, "test2", null, null); subscriptionService.subscribeUser(userService.getUserByUID(freefd.getUid()).orElse(AnonymousUser.INSTANCE), userService.getUserByUID(ugnich.getUid()).orElse(AnonymousUser.INSTANCE)); List freefdFeed = messagesService.getMyFeed(freefd.getUid(), 0, false); - assertThat(freefdFeed.get(0), equalTo(mid2)); - int tonyaid = userService.createUser("Tonya", "secret"); - int mid3 = messagesService.createMessage(tonyaid, "test3", null, null); - messagesService.recommendMessage(mid3, ugnich.getUid()); - assertThat(messagesService.getMyFeed(freefd.getUid(), 0, false).get(0), equalTo(mid2)); - assertThat(messagesService.getMyFeed(freefd.getUid(), 0, true).get(0), equalTo(mid3)); - assertThat(messagesService.getMyFeed(freefd.getUid(), mid2, true).get(0), equalTo(mid0)); - assertThat(messagesService.recommendMessage(mid0, ugnich.getUid()), equalTo(MessagesService.RecommendStatus.Added)); - assertThat(messagesService.getMessage(mid0).getLikes(), equalTo(1)); - assertThat(messagesService.recommendMessage(mid0, ugnich.getUid()), equalTo(MessagesService.RecommendStatus.Deleted)); - assertThat(messagesService.getMessage(mid0).getLikes(), equalTo(0)); - assertThat(messagesService.getAll(ugnich.getUid(), 0).get(0), equalTo(mid3)); + assertThat(freefdFeed.get(0), equalTo(msg2.getMid())); + User tonya = userService.createUser("Tonya", "secret"); + assertThat(tonya, not(AnonymousUser.INSTANCE)); + Message msg3 = messagesService.createMessage(tonya, "test3", null, null); + messagesService.recommendMessage(msg3.getMid(), ugnich.getUid()); + assertThat(messagesService.getMyFeed(freefd.getUid(), 0, false).get(0), equalTo(msg2.getMid())); + assertThat(messagesService.getMyFeed(freefd.getUid(), 0, true).get(0), equalTo(msg3.getMid())); + assertThat(messagesService.getMyFeed(freefd.getUid(), msg2.getMid(), true).get(0), equalTo(msg0.getMid())); + assertThat(messagesService.recommendMessage(msg0.getMid(), ugnich.getUid()), equalTo(MessagesService.RecommendStatus.Added)); + assertThat(msg0.getLikes(), equalTo(1)); + assertThat(messagesService.recommendMessage(msg0.getMid(), ugnich.getUid()), equalTo(MessagesService.RecommendStatus.Deleted)); + assertThat(msg0.getLikes(), equalTo(0)); + assertThat(messagesService.getAll(ugnich.getUid(), 0).get(0), equalTo(msg3.getMid())); Tag yoTag = tagService.getTag("yoyo", true); assertThat(tagService.getTag("YOYO", false), equalTo(yoTag)); - int mid = messagesService.createMessage(ugnich.getUid(), "yo", null, Collections.singletonList(yoTag)); - List subscribers = subscriptionService.getSubscribedUsers(ugnich.getUid(), mid); + Message msg = messagesService.createMessage(ugnich, "yo", null, Collections.singletonList(yoTag)); + List subscribers = subscriptionService.getSubscribedUsers(ugnich.getUid(), msg.getMid()); telegramService.createTelegramUser(12345, "freefd"); String loginhash = jdbcTemplate.queryForObject("SELECT loginhash FROM telegram where tg_id=?", String.class, 12345); - crosspostService.setTelegramUser(loginhash, freefd.getUid()); + crosspostService.setTelegramUser(loginhash, freefd); List telegramSubscribers = telegramService.getTelegramIdentifiers(subscribers); assertThat(subscribers.size(), equalTo(1)); assertThat(subscribers.size(), equalTo(telegramSubscribers.size())); assertThat(subscribers.get(0).getUid(), equalTo(freefd.getUid())); tagService.blacklistTag(freefd, yoTag); - List subscribers2 = subscriptionService.getSubscribedUsers(ugnich.getUid(), mid); + List subscribers2 = subscriptionService.getSubscribedUsers(ugnich.getUid(), msg.getMid()); assertThat(subscribers2.size(), equalTo(0)); assertThat(telegramService.getTelegramIdentifiers(subscribers2).size(), equalTo(0)); tagService.blacklistTag(freefd, yoTag); - assertThat(subscriptionService.getSubscribedUsers(ugnich.getUid(), mid).size(), equalTo(1)); + assertThat(subscriptionService.getSubscribedUsers(ugnich.getUid(), msg.getMid()).size(), equalTo(1)); subscriptionService.unSubscribeUser(freefd, ugnich); - assertThat(subscriptionService.getSubscribedUsers(ugnich.getUid(), mid).size(), equalTo(0)); + assertThat(subscriptionService.getSubscribedUsers(ugnich.getUid(), msg.getMid()).size(), equalTo(0)); } @Test public void pmTests() { - pmQueriesService.createPM(freefd.getUid(), ugnich.getUid(), "hello"); - Message pm = pmQueriesService.getPMMessages(ugnich.getUid(), freefd.getUid()).get(0); + pmQueriesService.createPM(freefd, ugnich, "hello"); + Message pm = pmQueriesService.getPMMessages(ugnich, freefd).get(0); assertThat(pm.getText(), equalTo("hello")); assertThat(pm.getUser().getUid(), equalTo(freefd.getUid())); } @Test public void messageTests() { - int user_id = userService.createUser("mmmme", "secret"); - User user = userService.getUserByUID(user_id).orElse(AnonymousUser.INSTANCE); - assertEquals("it should be me", "mmmme", user.getName()); - int mid = messagesService.createMessage(user_id, "yo", null, new ArrayList<>()); - Message msg = messagesService.getMessage(mid); + User mmmme = userService.createUser("mmmme", "secret"); + assertEquals("it should be me", "mmmme", mmmme.getName()); + Message msg = messagesService.createMessage(mmmme, "yo", null, new ArrayList<>()); assertEquals("yo", msg.getText()); User me = msg.getUser(); assertEquals("mmmme", me.getName()); - assertEquals("mmmme", messagesService.getMessageAuthor(mid).getName()); + assertEquals("mmmme", messagesService.getMessageAuthor(msg.getMid()).getName()); int tagID = tagService.createTag("weather"); Tag tag = tagService.getTag(tagID); List tagList = new ArrayList<>(); tagList.add(tag); - int mid2 = messagesService.createMessage(user_id, "yo2", null, tagList); - Message msg2 = messagesService.getMessage(mid2); + Message msg2 = messagesService.createMessage(mmmme, "yo2", null, tagList); assertEquals(1, msg2.getTags().size()); - assertEquals("we already have ugnich", -1, userService.createUser("ugnich", "x")); - int ugnich_id = userService.createUser("hugnich", "x"); - User ugnich = userService.getUserByUID(ugnich_id).orElse(AnonymousUser.INSTANCE); - int rid = messagesService.createReply(msg2.getMid(), 0, ugnich, "bla-bla", null); + assertEquals("we already have ugnich", AnonymousUser.INSTANCE, userService.createUser("ugnich", "x")); + User hugnich = userService.createUser("hugnich", "x"); + int rid = messagesService.createReply(msg2.getMid(), 0, hugnich, "bla-bla", null); assertEquals(1, rid); assertThat(msg2.getTo(), equalTo(null)); Message reply = messagesService.getReply(msg2.getMid(), rid); - assertThat(reply.getTo().getName(), equalTo(user.getName())); - List replies = messagesService.getReplies(user, msg2.getMid()); + assertThat(reply.getTo().getName(), equalTo(mmmme.getName())); + List replies = messagesService.getReplies(mmmme, msg2.getMid()); assertThat(replies.size(), equalTo(1)); assertThat(replies.get(0), equalTo(reply)); int ridToReply = messagesService.createReply(msg2.getMid(), 1, ugnich, "blax2", null); Message reply2 = messagesService.getReply(msg2.getMid(), ridToReply); - assertThat(reply.getTo().getName(), equalTo(user.getName())); - List replies2 = messagesService.getReplies(user, msg2.getMid()); + assertThat(reply.getTo().getName(), equalTo(mmmme.getName())); + List replies2 = messagesService.getReplies(mmmme, msg2.getMid()); assertThat(replies2.size(), equalTo(2)); assertThat(replies2.get(1), equalTo(reply2)); - Message msg3 = messagesService.getMessage(mid2); - - assertEquals(2, msg3.getReplies()); - assertEquals("weather", msg3.getTags().get(0).getName()); - assertEquals(ugnich.getUid(), userService.checkPassword(ugnich.getName(), "x")); - assertEquals(-1, userService.checkPassword(ugnich.getName(), "xy")); + assertEquals(2, msg2.getReplies()); + assertEquals("weather", msg2.getTags().get(0).getName()); + assertEquals(hugnich, userService.checkPassword(hugnich.getName(), "x")); + assertEquals(AnonymousUser.INSTANCE, userService.checkPassword(hugnich.getName(), "xy")); - subscriptionService.subscribeMessage(msg, user); + subscriptionService.subscribeMessage(msg, mmmme); subscriptionService.subscribeMessage(msg, ugnich); int reply_id = messagesService.createReply(msg.getMid(), 0, ugnich, "comment", null); assertEquals(1, subscriptionService.getUsersSubscribedToComments(msg, messagesService.getReply(msg.getMid(), reply_id)).size()); assertThat(messagesService.getDiscussions(ugnich.getUid(), 0L).get(0), equalTo(msg.getMid())); - messagesService.deleteMessage(user_id, mid); - messagesService.deleteMessage(user_id, mid2); + messagesService.deleteMessage(mmmme.getUid(), msg.getMid()); + messagesService.deleteMessage(mmmme.getUid(), msg2.getMid()); String htmlTagName = ">_<"; Tag htmlTag = tagService.getTag(htmlTagName, true); TagStats htmlTagStats = new TagStats(); htmlTagStats.setTag(htmlTag); String dbTagName = jdbcTemplate.queryForObject("select name from tags where name=?", String.class, htmlTagName); assertEquals("db tags should not be escaped", dbTagName, htmlTag.getName()); - int mid4 = messagesService.createMessage(user_id, "yoyoyo", null, null); - Message msg4 = messagesService.getMessage(mid4); + Message msg4 = messagesService.createMessage(mmmme, "yoyoyo", null, null); assertEquals("tags string should be empty", StringUtils.EMPTY, MessageUtils.getTagsString(msg4)); - messagesService.deleteMessage(user_id, mid4); + messagesService.deleteMessage(mmmme.getUid(), msg4.getMid()); } public ExpectedException exception = ExpectedException.none(); @Test public void likeTypeStatsTests(){ - int user_id = userService.createUser("dsdss", "secret"); + User dsdss = userService.createUser("dsdss", "secret"); final int freefdId = freefd.getUid(); - int mid = messagesService.createMessage(user_id, "yo", null, new ArrayList<>()); - messagesService.likeMessage(mid, freefdId , 2); - messagesService.likeMessage(mid, freefdId,2); - messagesService.likeMessage(mid, freefdId,3); - messagesService.likeMessage(mid, freefdId,1); + Message msg4 = messagesService.createMessage(dsdss, "yo", null, new ArrayList<>()); + messagesService.likeMessage(msg4.getMid(), freefdId , 2); + messagesService.likeMessage(msg4.getMid(), freefdId,2); + messagesService.likeMessage(msg4.getMid(), freefdId,3); + messagesService.likeMessage(msg4.getMid(), freefdId,1); - Message msg4 = messagesService.getMessage(mid); assertThat(msg4.getLikes(), equalTo(1)); Assert.assertEquals(2, msg4.getReactions().stream().filter(r -> r.getId() == 2) @@ -326,34 +319,34 @@ public class ServerTests { } @Test public void lastJidShouldNotBeDeleted() { - int ugnich_id = userService.createUser("hugnich2", "x"); - jdbcTemplate.update("INSERT INTO jids(user_id,jid,active) VALUES(?,?,?)", ugnich_id, "firstjid@localhost", 1); - jdbcTemplate.update("INSERT INTO jids(user_id,jid,active) VALUES(?,?,?)", ugnich_id, "secondjid@localhost", 1); - assertThat(userService.deleteJID(ugnich_id, "secondjid@localhost"), equalTo(true)); - assertThat(userService.deleteJID(ugnich_id, "firstjid@localhost"), equalTo(false)); + User hugnich2 = userService.createUser("hugnich2", "x"); + jdbcTemplate.update("INSERT INTO jids(user_id,jid,active) VALUES(?,?,?)", hugnich2.getUid(), "firstjid@localhost", 1); + jdbcTemplate.update("INSERT INTO jids(user_id,jid,active) VALUES(?,?,?)", hugnich2.getUid(), "secondjid@localhost", 1); + assertThat(userService.deleteJID(hugnich2.getUid(), "secondjid@localhost"), equalTo(true)); + assertThat(userService.deleteJID(hugnich2.getUid(), "firstjid@localhost"), equalTo(false)); } @Test public void lastEmailShouldNotBeDeleted() { - int ugnich_id = userService.createUser("hugnich3", "x"); - jdbcTemplate.update("INSERT INTO emails(user_id,email) VALUES(?,?)", ugnich_id, "first@localhost"); - jdbcTemplate.update("INSERT INTO emails(user_id,email) VALUES(?,?)", ugnich_id, "second@localhost"); - assertThat(emailService.deleteEmail(ugnich_id, "second@localhost"), equalTo(true)); - assertThat(emailService.deleteEmail(ugnich_id, "first@localhost"), equalTo(false)); + User hugnich3 = userService.createUser("hugnich3", "x"); + jdbcTemplate.update("INSERT INTO emails(user_id,email) VALUES(?,?)", hugnich3.getUid(), "first@localhost"); + jdbcTemplate.update("INSERT INTO emails(user_id,email) VALUES(?,?)", hugnich3.getUid(), "second@localhost"); + assertThat(emailService.deleteEmail(hugnich3, "second@localhost"), equalTo(true)); + assertThat(emailService.deleteEmail(hugnich3, "first@localhost"), equalTo(false)); } @Test public void messageUpdatedTimeShouldMatchLastReplyTime() throws InterruptedException { - int ugnich_id = userService.createUser("hugnich4", "x"); - int mid = messagesService.createMessage(ugnich_id, "yo", null, null); + User hugnich4 = userService.createUser("hugnich4", "x"); + Message msg = messagesService.createMessage(hugnich4, "yo", null, null); Instant ts = jdbcTemplate.queryForObject("SELECT updated FROM messages WHERE message_id=?", - Timestamp.class, mid).toInstant(); + Timestamp.class, msg.getMid()).toInstant(); Thread.sleep(1000); - int rid = messagesService.createReply(mid, 0, ugnich, "people", null); + int rid = messagesService.createReply(msg.getMid(), 0, ugnich, "people", null); Instant rts = jdbcTemplate.queryForObject("SELECT updated FROM messages WHERE message_id=?", - Timestamp.class, mid).toInstant(); + Timestamp.class, msg.getMid()).toInstant(); assertThat(rts, greaterThan(ts)); - Message msg = messagesService.getReply(mid, rid); - assertThat(rts, equalTo(msg.getTimestamp())); - messagesService.deleteMessage(ugnich_id, mid); + Message reply = messagesService.getReply(msg.getMid(), rid); + assertThat(rts, equalTo(reply.getTimestamp())); + messagesService.deleteMessage(hugnich4.getUid(), msg.getMid()); } @Test @@ -399,7 +392,7 @@ public class ServerTests { @Test public void homeTestWithMessagesAndRememberMe() throws Exception { - String ugnichHash = userService.getHashByUID(ugnich.getUid()); + String ugnichHash = userService.getHashForUser(ugnich); mockMvc.perform( get("/home") .with(httpBasic(ugnichName, ugnichPassword))) @@ -452,16 +445,16 @@ public class ServerTests { @Test public void messagesUrlTest() throws Exception { - int user_id = userService.createUser("dsds4345", "secret"); + User dsds4345 = userService.createUser("dsds4345", "secret"); - String freefdHash = userService.getHashByUID(freefd.getUid()); - System.out.println("user_id"+ user_id); - String userIdHash = userService.getHashByUID(user_id); + String freefdHash = userService.getHashForUser(freefd); + System.out.println("user_id"+ dsds4345.getUid()); + String userIdHash = userService.getHashForUser(dsds4345); final int freefdId = freefd.getUid(); - int mid = messagesService.createMessage(user_id, "yo", null, new ArrayList<>()); - messagesService.likeMessage(mid, freefdId, 2 ); - messagesService.likeMessage(mid, freefdId, 2 ); - messagesService.likeMessage(mid, freefdId, 3 ); + Message msg = messagesService.createMessage(dsds4345, "yo", null, new ArrayList<>()); + messagesService.likeMessage(msg.getMid(), freefdId, 2 ); + messagesService.likeMessage(msg.getMid(), freefdId, 2 ); + messagesService.likeMessage(msg.getMid(), freefdId, 3 ); mockMvc.perform(get("/messages?"+ "hash=" + userIdHash)) .andDo(print()) @@ -482,8 +475,8 @@ public class ServerTests { public void tags() throws Exception { Tag weather = tagService.getTag("weather", true); Tag yo = tagService.getTag("yo", true); - messagesService.createMessage(ugnich.getUid(), "text", null, Arrays.asList(yo, weather)); - messagesService.createMessage(freefd.getUid(), "text2", null, Collections.singletonList(yo)); + messagesService.createMessage(ugnich, "text", null, Arrays.asList(yo, weather)); + messagesService.createMessage(freefd, "text2", null, Collections.singletonList(yo)); MvcResult result = mockMvc.perform(get("/tags")) .andExpect(status().isOk()) .andReturn(); @@ -515,7 +508,7 @@ public class ServerTests { } @Test public void performRequestsWithIssuedToken() throws Exception { - String ugnichHash = userService.getHashByUID(ugnich.getUid()); + String ugnichHash = userService.getHashForUser(ugnich); mockMvc.perform(get("/home")).andExpect(status().isUnauthorized()); mockMvc.perform(get("/auth")) .andExpect(status().isUnauthorized()); @@ -573,26 +566,26 @@ public class ServerTests { } @Test public void topTest() { - int topmid = messagesService.createMessage(ugnich.getUid(), "top message", null, null); + Message topmsg = messagesService.createMessage(ugnich, "top message", null, null); IntStream.rangeClosed(6, 12).forEach(i -> { User next = new User(); next.setUid(i); - messagesService.createReply(topmid, 0, next, "yo", null); + messagesService.createReply(topmsg.getMid(), 0, next, "yo", null); }); List topCandidates = messagesService.getPopularCandidates(); assertThat(topCandidates.size(), is(1)); - assertThat(topCandidates.get(0), is(topmid)); + assertThat(topCandidates.get(0), is(topmsg.getMid())); Tag juickTag = tagService.getTag("juick", false); assertThat(juickTag.TID, is(2)); - tagService.updateTags(topmid, Collections.singletonList(juickTag)); + tagService.updateTags(topmsg.getMid(), Collections.singletonList(juickTag)); assertThat(messagesService.getPopularCandidates().isEmpty(), is(true)); - tagService.updateTags(topmid, Collections.singletonList(juickTag)); + tagService.updateTags(topmsg.getMid(), Collections.singletonList(juickTag)); assertThat(messagesService.getPopularCandidates().isEmpty(), is(false)); jdbcTemplate.update("INSERT INTO tags(tag_id, name) VALUES(805, 'NSFW')"); Tag nsfw = tagService.getTag("NSFW", false); assertThat(nsfw.TID, equalTo(805)); - tagService.updateTags(topmid, Collections.singletonList(nsfw)); + tagService.updateTags(topmsg.getMid(), Collections.singletonList(nsfw)); assertThat(messagesService.getPopularCandidates().isEmpty(), is(true)); } @Test @@ -619,10 +612,10 @@ public class ServerTests { } @Test public void botIsUpAndProcessingResourceConstraints() throws Exception { - int renhaId = userService.createUser("renha", "umnnbt"); + User renha = userService.createUser("renha", "umnnbt"); Jid from = Jid.of("renha@serverstorageisfull.tld"); jdbcTemplate.update("INSERT INTO jids(user_id,jid,active) VALUES(?,?,?)", - renhaId, from.toEscapedString(), 1); + renha.getUid(), from.toEscapedString(), 1); rocks.xmpp.core.stanza.model.Message xmppMessage = new rocks.xmpp.core.stanza.model.Message(); xmppMessage.setType(rocks.xmpp.core.stanza.model.Message.Type.ERROR); xmppMessage.setFrom(from); @@ -630,16 +623,16 @@ public class ServerTests { StanzaError err = new StanzaError(StanzaError.Type.CANCEL, Condition.RESOURCE_CONSTRAINT); xmppMessage.setError(err); Function isActive = f -> jdbcTemplate.queryForObject("SELECT active FROM jids WHERE user_id=?", Integer.class, f) == 1; - assertThat(isActive.apply(renhaId), equalTo(true)); + assertThat(isActive.apply(renha.getUid()), equalTo(true)); ClientMessage result = router.incomingMessage(xmppMessage); assertNull(result); - assertThat(isActive.apply(renhaId), equalTo(false)); + assertThat(isActive.apply(renha.getUid()), equalTo(false)); xmppMessage.setError(null); xmppMessage.setType(rocks.xmpp.core.stanza.model.Message.Type.CHAT); xmppMessage.setBody("On"); result = router.incomingMessage(xmppMessage); assertThat(result.getBody(), equalTo("XMPP notifications are activated")); - assertTrue(isActive.apply(renhaId)); + assertTrue(isActive.apply(renha.getUid())); xmppMessage.setBody("*test test"); result = router.incomingMessage(xmppMessage); assertThat(result.getBody(), startsWith("New message posted")); @@ -647,7 +640,7 @@ public class ServerTests { xmppMessage.setBody("PING"); result = router.incomingMessage(xmppMessage); assertThat(result.getBody(), equalTo("PONG")); - int secretlySadId = userService.createUser("secretlysad", "bbk"); + User secretlySad = userService.createUser("secretlysad", "bbk"); xmppMessage.setTo(botJid.withLocal("secretlysad")); xmppMessage.setBody("What's up?"); result = router.incomingMessage(xmppMessage); @@ -672,8 +665,7 @@ public class ServerTests { @Test public void protocolTests() throws Exception { - int uid = userService.createUser("me", "secret"); - User user = userService.getUserByUID(uid).orElse(AnonymousUser.INSTANCE); + User user = userService.createUser("me", "secret"); Tag yo = tagService.getTag("yo", true); Message msg = commandsManager.processCommand(user, "*yo yoyo", URI.create("http://static.juick.com/settings/facebook.png")).getNewMessage().get(); assertThat(msg.getAttachmentType(), is("png")); @@ -691,8 +683,7 @@ public class ServerTests { assertThat(last.toInstant(), equalTo(yoyoMsg.getNewMessage().get().getTimestamp())); assertEquals("should be message", true, commandsManager.processCommand(user, String.format("#%d", mid), emptyUri).getText().startsWith("@me")); - int readerUid = userService.createUser("dummyReader", "dummySecret"); - User readerUser = userService.getUserByUID(readerUid).orElse(AnonymousUser.INSTANCE); + User readerUser = userService.createUser("dummyReader", "dummySecret"); assertThat(commandsManager.processCommand(readerUser, "s", emptyUri).getText().startsWith("You are subscribed to"), is(true)); assertThat(commandsManager.processCommand(readerUser, "S", emptyUri).getText().startsWith("You are subscribed to"), is(true)); assertEquals("should be subscribed", "Subscribed", @@ -716,11 +707,11 @@ public class ServerTests { assertEquals("should be subscribed", "Subscribed to @" + user.getName(), commandsManager.processCommand(readerUser, "S @" + user.getName(), emptyUri) .getText()); - List friends = userService.getUserFriends(readerUid); + List friends = userService.getUserFriends(readerUser.getUid()); assertEquals("number of friend users should match", 2, friends.size()); assertEquals("number of reader users should match", 1, - userService.getUserReaders(uid).size()); + userService.getUserReaders(user.getUid()).size()); String expectedSecondReply = "Reply posted.\n#" + mid + "/2 " + "https://juick.com/m/" + mid + "#2"; String expectedThirdReply = "Reply posted.\n#" + mid + "/3 " @@ -746,32 +737,31 @@ public class ServerTests { assertEquals("should be blacklisted", "Tag added to your blacklist", commandsManager.processCommand(readerUser, "BL *there", emptyUri).getText()); assertEquals("number of subscribed users should match", 0, - subscriptionService.getSubscribedUsers(uid, mid).size()); + subscriptionService.getSubscribedUsers(user.getUid(), mid).size()); assertEquals("tags should be updated", "Tags are updated", commandsManager.processCommand(user, "#" + mid + " *there", emptyUri).getText()); assertEquals("number of tags should match", 1, tagService.getMessageTags(mid).size()); - int taggerUid = userService.createUser("dummyTagger", "dummySecret"); - User taggerUser = userService.getUserByUID(taggerUid).orElse(AnonymousUser.INSTANCE); + User taggerUser = userService.createUser("dummyTagger", "dummySecret"); assertEquals("should be subscribed", "Subscribed", commandsManager.processCommand(taggerUser, "S *yo", emptyUri).getText()); assertEquals("number of subscribed users should match", 2, - subscriptionService.getSubscribedUsers(uid, mid).size()); + subscriptionService.getSubscribedUsers(user.getUid(), mid).size()); assertEquals("should be unsubscribed", "Unsubscribed from yo", commandsManager.processCommand(taggerUser, "U *yo", emptyUri).getText()); assertEquals("number of subscribed users should match", 1, - subscriptionService.getSubscribedUsers(uid, mid).size()); + subscriptionService.getSubscribedUsers(user.getUid(), mid).size()); assertEquals("number of readers should match", 1, - userService.getUserReaders(uid).size()); + userService.getUserReaders(user.getUid()).size()); String readerFeed = commandsManager.processCommand(readerUser, "#", emptyUri).getText(); assertTrue("description should match", readerFeed.startsWith("Your feed")); assertEquals("should be unsubscribed", "Unsubscribed from @" + user.getName(), commandsManager.processCommand(readerUser, "U @" + user.getName(), emptyUri) .getText()); assertEquals("number of readers should match", 0, - userService.getUserReaders(uid).size()); + userService.getUserReaders(user.getUid()).size()); assertEquals("number of friends should match", 1, - userService.getUserFriends(uid).size()); + userService.getUserFriends(user.getUid()).size()); assertEquals("should be unsubscribed", "Unsubscribed from #" + mid, commandsManager.processCommand(readerUser, "u #" + mid, emptyUri).getText()); assertEquals("number of subscribed users should match", 0, @@ -867,83 +857,82 @@ public class ServerTests { @Test public void recommendTests() throws Exception { - int mid = messagesService.createMessage(ugnich.getUid(), "to be liked", null, null); - String freefdHash = userService.getHashByUID(freefd.getUid()); - int freefdMid = messagesService.createMessage(freefd.getUid(), "to be not liked", null, null); + Message msg = messagesService.createMessage(ugnich, "to be liked", null, null); + String freefdHash = userService.getHashForUser(freefd); + Message freefdMsg = messagesService.createMessage(freefd, "to be not liked", null, null); - mockMvc.perform(post("/like?mid=" + mid + "&hash=" + freefdHash)) + mockMvc.perform(post("/like?mid=" + msg.getMid() + "&hash=" + freefdHash)) .andExpect(status().isOk()) .andExpect(jsonPath("$.status", is("Message is added to your recommendations"))); - mockMvc.perform(get("/thread?mid=" + mid + "&hash=" + freefdHash)) + mockMvc.perform(get("/thread?mid=" + msg.getMid() + "&hash=" + freefdHash)) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].recommendations.length()", is(1))) .andExpect(jsonPath("$[0].recommendations[0]", is(freefdName))); - mockMvc.perform(post("/like?mid=" + freefdMid + "&hash=" + freefdHash)) + mockMvc.perform(post("/like?mid=" + freefdMsg.getMid() + "&hash=" + freefdHash)) .andExpect(status().isForbidden()); } @Test public void likesTests() throws Exception{ - int user_id = userService.createUser("dsds", "secret"); - String freefdHash = userService.getHashByUID(freefd.getUid()); - int mid1 = messagesService.createMessage(user_id, "yo", null, new ArrayList<>()); + User dsds = userService.createUser("dsds", "secret"); + String freefdHash = userService.getHashForUser(freefd); + Message msg1 = messagesService.createMessage(dsds, "yo", null, new ArrayList<>()); - mockMvc.perform(post("/react?mid=" + mid1 + "&hash=" + freefdHash+ "&reactionId=2")) + mockMvc.perform(post("/react?mid=" + msg1.getMid() + "&hash=" + freefdHash+ "&reactionId=2")) .andExpect(status().isOk()); - Message msg4 = messagesService.getMessage(mid1); - assertThat(msg4.getLikes(), is(0)); - assertThat(messagesService.getMessages(Collections.singletonList(mid1)).get(0).getLikes(), is(0)); - Assert.assertEquals(1, msg4.getReactions().stream().filter(r -> r.getId() == 2) + assertThat(msg1.getLikes(), is(0)); + assertThat(messagesService.getMessages(Collections.singletonList(msg1.getMid())).get(0).getLikes(), is(0)); + Assert.assertEquals(1, msg1.getReactions().stream().filter(r -> r.getId() == 2) .findFirst().orElseThrow(IllegalStateException::new).getCount()); - mockMvc.perform(post("/react?mid=" + mid1 + "&hash=" + freefdHash+ "&reactionId=1")) + mockMvc.perform(post("/react?mid=" + msg1.getMid() + "&hash=" + freefdHash+ "&reactionId=1")) .andExpect(status().isOk()); - mockMvc.perform(post("/react?mid=" + mid1 + "&hash=" + freefdHash+ "&reactionId=1")) + mockMvc.perform(post("/react?mid=" + msg1.getMid() + "&hash=" + freefdHash+ "&reactionId=1")) .andExpect(status().isOk()); - assertThat(messagesService.getMessage(mid1).getLikes(), is(1)); + assertThat(msg1.getLikes(), is(1)); } @Test public void lastReadTests() throws Exception { assertThat(userService.isInBLAny(ugnich.getUid(), freefd.getUid()), is(false)); - int mid = messagesService.createMessage(ugnich.getUid(), "to be watched", null, null); - subscriptionService.subscribeMessage(messagesService.getMessage(mid), ugnich); - messagesService.createReply(mid, 0, freefd, "new reply", null); + Message msg = messagesService.createMessage(ugnich, "to be watched", null, null); + subscriptionService.subscribeMessage(msg, ugnich); + messagesService.createReply(msg.getMid(), 0, freefd, "new reply", null); BiFunction lastRead = (user, m) -> jdbcTemplate.queryForObject( "SELECT last_read_rid FROM subscr_messages WHERE suser_id=? AND message_id=?", Integer.class, user.getUid(), m); - assertThat(lastRead.apply(ugnich, mid), is(0)); + assertThat(lastRead.apply(ugnich, msg.getMid()), is(0)); assertThat(messagesService.getUnread(ugnich).size(), is(1)); - assertThat(messagesService.getUnread(ugnich).get(0), is(mid)); - messagesService.getReplies(ugnich, mid); - assertThat(lastRead.apply(ugnich, mid), is(1)); + assertThat(messagesService.getUnread(ugnich).get(0), is(msg.getMid())); + messagesService.getReplies(ugnich, msg.getMid()); + assertThat(lastRead.apply(ugnich, msg.getMid()), is(1)); assertThat(messagesService.getUnread(ugnich).size(), is(0)); - messagesService.setLastReadComment(ugnich, mid, 0); - assertThat(lastRead.apply(ugnich, mid), is(1)); - String ugnichHash = userService.getHashByUID(ugnich.getUid()); - int freefdrid = messagesService.createReply(mid, 0, freefd, "again", null); - mockMvc.perform(get(String.format("/thread/mark_read/%d-%d.gif?hash=%s", mid, freefdrid, ugnichHash))) + messagesService.setLastReadComment(ugnich, msg.getMid(), 0); + assertThat(lastRead.apply(ugnich, msg.getMid()), is(1)); + String ugnichHash = userService.getHashForUser(ugnich); + int freefdrid = messagesService.createReply(msg.getMid(), 0, freefd, "again", null); + mockMvc.perform(get(String.format("/thread/mark_read/%d-%d.gif?hash=%s", msg.getMid(), freefdrid, ugnichHash))) .andExpect(status().isOk()) .andExpect(content().bytes(IOUtils.toByteArray( Objects.requireNonNull(getClass().getClassLoader().getResource("Transparent.gif"))))); - assertThat(lastRead.apply(ugnich, mid), is(freefdrid)); + assertThat(lastRead.apply(ugnich, msg.getMid()), is(freefdrid)); privacyQueriesService.blacklistUser(ugnich, freefd); - int newfreefdrid = messagesService.createReply(mid, 0, freefd, "from ban", null); - serverManager.processMessageEvent(new MessageEvent(this, messagesService.getReply(mid, newfreefdrid), + int newfreefdrid = messagesService.createReply(msg.getMid(), 0, freefd, "from ban", null); + serverManager.processMessageEvent(new MessageEvent(this, messagesService.getReply(msg.getMid(), newfreefdrid), Collections.emptyList())); - assertThat(userService.isReplyToBL(ugnich, messagesService.getReply(mid, newfreefdrid)), is(true)); - assertThat(lastRead.apply(ugnich, mid), is(newfreefdrid)); + assertThat(userService.isReplyToBL(ugnich, messagesService.getReply(msg.getMid(), newfreefdrid)), is(true)); + assertThat(lastRead.apply(ugnich, msg.getMid()), is(newfreefdrid)); privacyQueriesService.blacklistUser(ugnich, freefd); - newfreefdrid = messagesService.createReply(mid, 0, freefd, "after ban", null); - assertThat(lastRead.apply(ugnich, mid), lessThan(newfreefdrid)); - mockMvc.perform(get(String.format("/thread?mid=%d&hash=%s", mid, ugnichHash))) + newfreefdrid = messagesService.createReply(msg.getMid(), 0, freefd, "after ban", null); + assertThat(lastRead.apply(ugnich, msg.getMid()), lessThan(newfreefdrid)); + mockMvc.perform(get(String.format("/thread?mid=%d&hash=%s", msg.getMid(), ugnichHash))) .andExpect(status().isOk()); - assertThat(lastRead.apply(ugnich, mid), is(newfreefdrid)); + assertThat(lastRead.apply(ugnich, msg.getMid()), is(newfreefdrid)); } @Test public void feedsShouldNotContainMessagesWithBannedTags() { Tag banned = tagService.getTag("banned", true); - int mid = messagesService.createMessage(ugnich.getUid(), "yo", "jpg", + Message msg = messagesService.createMessage(ugnich, "yo", "jpg", Collections.singletonList(banned)); privacyQueriesService.blacklistTag(freefd, banned); assertTrue(messagesService.getMessages(messagesService.getAll(freefd.getUid(), 0)) @@ -954,7 +943,7 @@ public class ServerTests { .stream().noneMatch(m -> m.getTags().contains(banned))); assertFalse(messagesService.getMessages(messagesService.getPhotos(ugnich.getUid(), 0)) .stream().noneMatch(m -> m.getTags().contains(banned))); - jdbcTemplate.update("UPDATE messages SET popular=1 WHERE message_id=?", mid); + jdbcTemplate.update("UPDATE messages SET popular=1 WHERE message_id=?", msg.getMid()); assertTrue(messagesService.getMessages(messagesService.getPopular(freefd.getUid(), 0)) .stream().noneMatch(m -> m.getTags().contains(banned))); assertFalse(messagesService.getMessages(messagesService.getPopular(ugnich.getUid(), 0)) @@ -1024,8 +1013,8 @@ public class ServerTests { HttpEntity> request = new HttpEntity<>(map, headers); map.add("body", "yo"); - map.add("hash", userService.getHashByUID(ugnich.getUid())); - ResponseEntity result = restTemplate.postForEntity( + map.add("hash", userService.getHashForUser(ugnich)); + ResponseEntity result = rest.postForEntity( "/post", request, CommandResult.class); assertThat(result.getStatusCode(), is(HttpStatus.OK)); @@ -1051,7 +1040,7 @@ public class ServerTests { commandsManager.processCommand(freefd, "S @ugnich", emptyUri); commandsManager.processCommand(ugnich, "S @freefd", emptyUri); assertThat(userService.getUserReaders(ugnich.getUid()).size(), is(1)); - String hash = userService.getHashByUID(ugnich.getUid()); + String hash = userService.getHashForUser(ugnich); mockMvc.perform(get("/me") .with(httpBasic(ugnichName, ugnichPassword))) .andExpect(jsonPath("$.hash", is(hash))) @@ -1111,4 +1100,11 @@ public class ServerTests { assertThat(replyJpgCmyk.getNewMessage().isPresent(), is(true)); assertThat(replyJpgCmyk.getNewMessage().get().getAttachmentType(), is("jpg")); } + @Test + public void emailTest() { + User tezzt = userService.createUser("tezzt", "12346"); + jdbcTemplate.update("INSERT INTO emails(user_id, email) VALUES(?, 'yo@example.com')", tezzt.getUid()); + User user = userService.getUserByEmail("yo@example.com"); + assertThat(user, is(tezzt)); + } } diff --git a/juick-server/src/test/resources/data.sql b/juick-server/src/test/resources/data.sql index 102b11f4..9690d6a8 100644 --- a/juick-server/src/test/resources/data.sql +++ b/juick-server/src/test/resources/data.sql @@ -1,3 +1,4 @@ +INSERT INTO tags(tag_id, name) VALUES(1, 'тест'); INSERT INTO tags(tag_id, name) VALUES(2, 'juick'); INSERT INTO reactions (like_id, description) VALUES (1, 'like'); INSERT INTO reactions (like_id, description) VALUES (2, 'love'); diff --git a/juick-www/src/main/java/com/juick/www/controllers/Login.java b/juick-www/src/main/java/com/juick/www/controllers/Login.java index cb7df833..783430b2 100644 --- a/juick-www/src/main/java/com/juick/www/controllers/Login.java +++ b/juick-www/src/main/java/com/juick/www/controllers/Login.java @@ -44,7 +44,7 @@ public class Login { } @GetMapping("/login/success") public String getSuccessLogin(ModelMap model) { - model.addAttribute("hash", userService.getHashByUID(UserUtils.getCurrentUser().getUid())); + model.addAttribute("hash", userService.getHashForUser(UserUtils.getCurrentUser())); return "views/login_success"; } } diff --git a/juick-www/src/main/java/com/juick/www/controllers/MessagesWWW.java b/juick-www/src/main/java/com/juick/www/controllers/MessagesWWW.java index f416cb86..dc0729e0 100644 --- a/juick-www/src/main/java/com/juick/www/controllers/MessagesWWW.java +++ b/juick-www/src/main/java/com/juick/www/controllers/MessagesWWW.java @@ -456,7 +456,7 @@ public class MessagesWWW { return "redirect:/login"; } String title = "PM: Inbox"; - List msgs = pmQueriesService.getLastPMInbox(visitor.getUid()); + List msgs = pmQueriesService.getLastPMInbox(visitor); fillUserModel(model, visitor, visitor); model.addAttribute("title", title); model.addAttribute("visitor", visitor); @@ -473,7 +473,7 @@ public class MessagesWWW { return "redirect:/login"; } String title = "PM: Sent"; - List msgs = pmQueriesService.getLastPMSent(visitor.getUid()); + List msgs = pmQueriesService.getLastPMSent(visitor); if (WebUtils.isNotUserName(uname)) { uname = StringUtils.EMPTY; @@ -549,7 +549,7 @@ public class MessagesWWW { "\n" + "\n" + "\n"; - String twitterName = crosspostService.getTwitterName(msg.getUser().getUid()); + String twitterName = crosspostService.getTwitterName(msg.getUser()); if (StringUtils.isNotEmpty(twitterName)) { headers += "\n"; } diff --git a/juick-www/src/main/java/com/juick/www/controllers/NewMessage.java b/juick-www/src/main/java/com/juick/www/controllers/NewMessage.java index a464add2..a88698af 100644 --- a/juick-www/src/main/java/com/juick/www/controllers/NewMessage.java +++ b/juick-www/src/main/java/com/juick/www/controllers/NewMessage.java @@ -161,7 +161,7 @@ public class NewMessage { params.add("body", rid == 0 ? String.format("#%d %s", mid, body) : String.format("#%d/%d %s", mid, rid, body)); - params.add("hash", userService.getHashByUID(visitor.getUid())); + params.add("hash", userService.getHashForUser(visitor)); if (StringUtils.isNotEmpty(attachmentFName.toString())) { params.add("img", attachmentFName.toASCIIString()); } @@ -203,7 +203,7 @@ public class NewMessage { HttpEntity> request = new HttpEntity<>(params, headers); params.add("body", String.format("@%s %s", userTo.getName(), body)); - params.add("hash", userService.getHashByUID(visitor.getUid())); + params.add("hash", userService.getHashForUser(visitor)); URI postUri = UriComponentsBuilder.fromUriString(apiUrl).path("/post").build().toUri(); ResponseEntity result = rest.postForEntity( postUri, @@ -240,7 +240,7 @@ public class NewMessage { HttpEntity> request = new HttpEntity<>(params, headers); params.add("body", body); - params.add("hash", userService.getHashByUID(visitor.getUid())); + params.add("hash", userService.getHashForUser(visitor)); if (StringUtils.isNotEmpty(attachmentFName.toString())) { params.add("img", attachmentFName.toASCIIString()); } diff --git a/juick-www/src/main/java/com/juick/www/controllers/Settings.java b/juick-www/src/main/java/com/juick/www/controllers/Settings.java index f9527423..702f52af 100644 --- a/juick-www/src/main/java/com/juick/www/controllers/Settings.java +++ b/juick-www/src/main/java/com/juick/www/controllers/Settings.java @@ -96,20 +96,20 @@ public class Settings { model.addAttribute("visitor", visitor); model.addAttribute("tags", tagService.getPopularTags()); model.addAttribute("auths", userService.getAuthCodes(visitor)); - model.addAttribute("email_active", emailService.getNotificationsEmail(visitor.getUid())); + model.addAttribute("email_active", emailService.getNotificationsEmail(visitor)); model.addAttribute("ehash", userService.getEmailHash(visitor)); model.addAttribute("emails", userService.getEmails(visitor)); model.addAttribute("jids", userService.getAllJIDs(visitor)); List hours = IntStream.rangeClosed(0, 23).boxed() .map(i -> StringUtils.leftPad(String.format("%d", i), 2, "0")).collect(Collectors.toList()); model.addAttribute("hours", hours); - model.addAttribute("fbstatus", crosspostService.getFbCrossPostStatus(visitor.getUid())); - model.addAttribute("twitter_name", crosspostService.getTwitterName(visitor.getUid())); - model.addAttribute("telegram_name", crosspostService.getTelegramName(visitor.getUid())); + model.addAttribute("fbstatus", crosspostService.getFbCrossPostStatus(visitor)); + model.addAttribute("twitter_name", crosspostService.getTwitterName(visitor)); + model.addAttribute("telegram_name", crosspostService.getTelegramName(visitor)); model.addAttribute("notify_options", subscriptionService.getNotifyOptions(visitor)); model.addAttribute("userinfo", userService.getUserInfo(visitor)); if (page.equals("auth-email")) { - if (emailService.verifyAddressByCode(visitor.getUid(), request.getParameter("code"))) { + if (emailService.verifyAddressByCode(visitor, request.getParameter("code"))) { ; model.addAttribute("result", "OK!"); } else { @@ -140,7 +140,7 @@ public class Settings { case "password": if (userService.updatePassword(visitor, request.getParameter("password"))) { result = "

Password has been changed.

"; - String hash = userService.getHashByUID(visitor.getUid()); + String hash = userService.getHashForUser(visitor); Cookie c = new Cookie("hash", hash); c.setMaxAge(365 * 24 * 60 * 60); response.addCookie(c); @@ -186,9 +186,9 @@ public class Settings { } break; case "email-add": - if (!emailService.verifyAddressByCode(visitor.getUid(), request.getParameter("account"))) { + if (!emailService.verifyAddressByCode(visitor, request.getParameter("account"))) { String authCode = RandomStringUtils.randomAlphanumeric(8).toUpperCase(); - if (emailService.addVerificationCode(visitor.getUid(), request.getParameter("account"), authCode)) { + if (emailService.addVerificationCode(visitor, request.getParameter("account"), authCode)) { Session session = Session.getDefaultInstance(System.getProperties()); try { MimeMessage message = new MimeMessage(session); @@ -210,14 +210,14 @@ public class Settings { } break; case "email-del": - if (emailService.deleteEmail(visitor.getUid(), request.getParameter("account"))) { + if (emailService.deleteEmail(visitor, request.getParameter("account"))) { result = "

Deleted. Back.

"; } else { result = "

An error occured while deleting.

"; } break; case "email-subscr": - if (emailService.setNotificationsEmail(visitor.getUid(), request.getParameter("account"))) { + if (emailService.setNotificationsEmail(visitor, request.getParameter("account"))) { result = String.format("

Saved! Will send notifications to %s." + "

Back

", request.getParameter("account")); } else { @@ -225,7 +225,7 @@ public class Settings { } break; case "twitter-del": - crosspostService.deleteTwitterToken(visitor.getUid()); + crosspostService.deleteTwitterToken(visitor); for (Cookie cookie : request.getCookies()) { if (cookie.getName().equals("request_token")) { cookie.setMaxAge(0); @@ -246,15 +246,15 @@ public class Settings { result = "

Back

"; break; case "facebook-disable": - crosspostService.disableFBCrosspost(visitor.getUid()); + crosspostService.disableFBCrosspost(visitor); result = "

Back

"; break; case "facebook-enable": - crosspostService.enableFBCrosspost(visitor.getUid()); + crosspostService.enableFBCrosspost(visitor); result = "

Back

"; break; case "vk-del": - crosspostService.deleteVKUser(visitor.getUid()); + crosspostService.deleteVKUser(visitor); result = "

Back

"; break; default: diff --git a/juick-www/src/main/java/com/juick/www/controllers/SignUp.java b/juick-www/src/main/java/com/juick/www/controllers/SignUp.java index 02a8006b..11f02169 100644 --- a/juick-www/src/main/java/com/juick/www/controllers/SignUp.java +++ b/juick-www/src/main/java/com/juick/www/controllers/SignUp.java @@ -16,6 +16,7 @@ */ package com.juick.www.controllers; +import com.juick.User; import com.juick.server.util.HttpBadRequestException; import com.juick.server.util.HttpForbiddenException; import com.juick.server.util.UserUtils; @@ -95,7 +96,7 @@ public class SignUp { @RequestParam(required = false) String username, @RequestParam(required = false) String password) { com.juick.User visitor = UserUtils.getCurrentUser(); - int uid = 0; + User signedUser = visitor; if (hash.length() > 36 || !type.matches("^[a-zA-Z0-9\\-]+$") || !hash.matches("^[a-zA-Z0-9\\-]+$")) { throw new HttpBadRequestException(); @@ -107,20 +108,20 @@ public class SignUp { if (username.length() > 32) { throw new HttpBadRequestException(); } - uid = userService.checkPassword(username, password); + signedUser = userService.checkPassword(username, password); } else { - uid = visitor.getUid(); + signedUser = visitor; } - if (uid <= 0) { + if (signedUser.isAnonymous()) { throw new HttpForbiddenException(); } - if (!(type.charAt(0) == 'f' && crosspostService.setFacebookUser(hash, uid)) - && !(type.charAt(0) == 'v' && crosspostService.setVKUser(hash, uid)) - && !(type.charAt(0) == 'd' && crosspostService.setTelegramUser(hash, uid)) - && !(type.charAt(0) == 'x' && crosspostService.setJIDUser(hash, uid)) - && !(type.charAt(0) == 'm' && messengerService.linkMessengerUser(hash, uid))) { + if (!(type.charAt(0) == 'f' && crosspostService.setFacebookUser(hash, signedUser)) + && !(type.charAt(0) == 'v' && crosspostService.setVKUser(hash, signedUser)) + && !(type.charAt(0) == 'd' && crosspostService.setTelegramUser(hash, signedUser)) + && !(type.charAt(0) == 'x' && crosspostService.setJIDUser(hash, signedUser)) + && !(type.charAt(0) == 'm' && messengerService.linkMessengerUser(hash, signedUser.getUid()))) { throw new HttpBadRequestException(); } @@ -131,22 +132,22 @@ public class SignUp { // CHECK USERNAME - uid = userService.createUser(username, password); - if (uid <= 0) { + signedUser = userService.createUser(username, password); + if (signedUser.isAnonymous()) { throw new HttpBadRequestException(); } - if (!(type.charAt(0) == 'f' && crosspostService.setFacebookUser(hash, uid)) - && !(type.charAt(0) == 'v' && crosspostService.setVKUser(hash, uid)) - && !(type.charAt(0) == 'd' && crosspostService.setTelegramUser(hash, uid)) - && !(type.charAt(0) == 'x' && crosspostService.setJIDUser(hash, uid)) - && !(type.charAt(0) == 'm' && messengerService.linkMessengerUser(hash, uid))) { + if (!(type.charAt(0) == 'f' && crosspostService.setFacebookUser(hash, signedUser)) + && !(type.charAt(0) == 'v' && crosspostService.setVKUser(hash, signedUser)) + && !(type.charAt(0) == 'd' && crosspostService.setTelegramUser(hash, signedUser)) + && !(type.charAt(0) == 'x' && crosspostService.setJIDUser(hash, signedUser)) + && !(type.charAt(0) == 'm' && messengerService.linkMessengerUser(hash, signedUser.getUid()))) { throw new HttpBadRequestException(); } } if (visitor.isAnonymous()) { - hash = userService.getHashByUID(uid); + hash = userService.getHashForUser(signedUser); Cookie c = new Cookie("hash", hash); c.setMaxAge(365 * 24 * 60 * 60); response.addCookie(c); diff --git a/juick-www/src/test/java/com/juick/WebAppTests.java b/juick-www/src/test/java/com/juick/WebAppTests.java index 74be2c92..3b85b585 100644 --- a/juick-www/src/test/java/com/juick/WebAppTests.java +++ b/juick-www/src/test/java/com/juick/WebAppTests.java @@ -23,6 +23,7 @@ import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.css.StyleElement; import com.gargoylesoftware.htmlunit.html.DomElement; import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.juick.server.helpers.AnonymousUser; import com.juick.service.*; import com.juick.util.MessageUtils; import com.juick.www.Utils; @@ -126,8 +127,7 @@ public class WebAppTests { userService.createUser(ugnichName, ugnichPassword); ugnich = userService.getUserByName(ugnichName); - int freefdId = userService.createUser(freefdName, freefdPassword); - freefd = userService.getUserByUID(freefdId).orElseThrow(IllegalStateException::new); + freefd = userService.createUser(freefdName, freefdPassword); isSetUp = true; } @@ -148,7 +148,7 @@ public class WebAppTests { @Test public void postWithoutTagsShouldNotHaveAsteriskInTitle() throws Exception { String msgText = "Привет, я - Угнич"; - int mid = messagesService.createMessage(ugnich.getUid(), msgText, null, null); + int mid = messagesService.createMessage(ugnich, msgText, null, null); HtmlPage threadPage = webClient.getPage(String.format("http://localhost:8080/ugnich/%d", mid)); assertThat(threadPage.getTitleText(), equalTo("ugnich:")); } @@ -159,8 +159,9 @@ public class WebAppTests { String msgText = "автор этого поста был забанен"; String hash = "12345678"; - User isilmine = userService.getUserByUID(userService.createUser(userName, userPassword)).orElseThrow(IllegalStateException::new); - int mid = messagesService.createMessage(isilmine.getUid(), msgText, null, null); + User isilmine = userService.createUser(userName, userPassword); + assertThat(isilmine, not(AnonymousUser.INSTANCE)); + int mid = messagesService.createMessage(isilmine, msgText, null, null); jdbcTemplate.update("UPDATE users SET banned=1 WHERE id=?", isilmine.getUid()); Page blogPage = webClient.getPage("http://localhost:8080/isilmine"); Page threadPage = webClient.getPage(String.format("http://localhost:8080/isilmine/%d", mid)); @@ -169,7 +170,7 @@ public class WebAppTests { } @Test public void repliesList() throws IOException { - int mid = messagesService.createMessage(ugnich.getUid(), "hello", null, null); + int mid = messagesService.createMessage(ugnich, "hello", null, null); IntStream.range(1, 15).forEach(i -> messagesService.createReply(mid, i-1, freefd, String.valueOf(i-1), null )); @@ -184,7 +185,7 @@ public class WebAppTests { } @Test public void userShouldNotSeeReplyButtonToBannedUser() throws Exception { - int mid = messagesService.createMessage(ugnich.getUid(), "freefd bl me", null, null); + int mid = messagesService.createMessage(ugnich, "freefd bl me", null, null); messagesService.createReply(mid, 0, ugnich, "yo", null); MvcResult loginResult = mockMvc.perform(post("/login") .param("username", freefdName) @@ -201,8 +202,9 @@ public class WebAppTests { assertThat(threadPage.querySelectorAll(".a-thread-comment").isEmpty(), equalTo(false)); privacyQueriesService.blacklistUser(freefd, ugnich); assertThat(userService.isInBLAny(freefd.getUid(), ugnich.getUid()), equalTo(true)); - int renhaId = userService.createUser("renha", "secret"); - messagesService.createReply(mid, 0, userService.getUserByUID(renhaId).orElseThrow(IllegalStateException::new), + User renha = userService.createUser("renha", "secret"); + assertThat(renha, not(AnonymousUser.INSTANCE)); + messagesService.createReply(mid, 0, renha, "people", null); threadPage = webClient.getPage(String.format("http://localhost:8080/ugnich/%d", mid)); assertThat(threadPage.getWebResponse().getStatusCode(), equalTo(200)); @@ -229,11 +231,11 @@ public class WebAppTests { @Test public void testTwitterCards() throws Exception { - int mid = messagesService.createMessage(ugnich.getUid(), "without image", null, null); + int mid = messagesService.createMessage(ugnich, "without image", null, null); assertThat(fetchMeta(String.format("http://localhost:8080/ugnich/%d", mid), "twitter:card") .getAttribute("content"), equalTo("summary")); - int mid2 = messagesService.createMessage(ugnich.getUid(), "with image", "png", null); + int mid2 = messagesService.createMessage(ugnich, "with image", "png", null); Message message = messagesService.getMessage(mid2); assertThat(fetchMeta(String.format("http://localhost:8080/ugnich/%d", mid2), "twitter:card") .getAttribute("content"), equalTo("summary_large_image")); @@ -266,7 +268,7 @@ public class WebAppTests { mockMvc.perform(multipart("/post2") .file(file) .cookie(loginResult.getResponse().getCookies())).andExpect(status().isFound()); - int mid = messagesService.createMessage(ugnich.getUid(), "dummy message", null, null); + int mid = messagesService.createMessage(ugnich, "dummy message", null, null); mockMvc.perform(post("/comment") .param("mid", String.valueOf(mid)) .param("body", "yo")).andExpect(redirectedUrl("http://localhost/login")); @@ -297,7 +299,7 @@ public class WebAppTests { } @Test public void hashLoginShouldNotUseSession() throws Exception { - String hash = userService.getHashByUID(ugnich.getUid()); + String hash = userService.getHashForUser(ugnich); MvcResult hashLoginResult = mockMvc.perform(get("/?show=my&hash=" + hash)) .andExpect(status().isOk()) .andExpect(model().attribute("visitor", hasProperty("authHash", equalTo(hash)))) @@ -322,8 +324,8 @@ public class WebAppTests { @Test public void discussionsShouldBePageableByTimestamp() throws Exception { String msgText = "Привет, я снова Угнич"; - int mid = messagesService.createMessage(ugnich.getUid(), msgText, null, null); - int midNew = messagesService.createMessage(ugnich.getUid(), "Я более новый Угнич", null, null); + int mid = messagesService.createMessage(ugnich, msgText, null, null); + int midNew = messagesService.createMessage(ugnich, "Я более новый Угнич", null, null); MvcResult loginResult = mockMvc.perform(post("/login") .param("username", freefdName) .param("password", freefdPassword)).andReturn(); @@ -351,7 +353,7 @@ public class WebAppTests { HtmlPage discussionsOld = webClient.getPage(discussionsUrl + "&to=" + msg.getUpdated().toEpochMilli()); assertThat(discussionsOld.querySelectorAll("article").size(), is(1)); assertThat(discussionsOld.querySelectorAll("article").get(0).getAttributes().getNamedItem("data-mid").getNodeValue(), is(String.valueOf(midNew))); - List newMids = IntStream.rangeClosed(1, 19).map(i -> messagesService.createMessage(ugnich.getUid(), String.valueOf(i), null, null)).boxed().collect(Collectors.toList()); + List newMids = IntStream.rangeClosed(1, 19).map(i -> messagesService.createMessage(ugnich, String.valueOf(i), null, null)).boxed().collect(Collectors.toList()); for (Integer m : newMids) { subscriptionService.subscribeMessage(messagesService.getMessage(m), freefd); } @@ -384,7 +386,7 @@ public class WebAppTests { } @Test public void anythingRedirects() throws Exception { - int mid = messagesService.createMessage(ugnich.getUid(), "yo", null, null); + int mid = messagesService.createMessage(ugnich, "yo", null, null); mockMvc.perform(get(String.format("/%d", mid))) .andExpect(status().isMovedPermanently()) .andExpect(redirectedUrl(String.format("/%s/%d", ugnich.getName(), mid))); @@ -407,7 +409,7 @@ public class WebAppTests { new com.gargoylesoftware.htmlunit.util.Cookie(loginCookie.getDomain(), loginCookie.getName(), loginCookie.getValue())); - int mid = messagesService.createMessage(ugnich.getUid(), "new test", null, null); + int mid = messagesService.createMessage(ugnich, "new test", null, null); subscriptionService.subscribeMessage(messagesService.getMessage(mid), freefd); int rid = messagesService.createReply(mid, 0, ugnich, "new reply", null); HtmlPage discussionsPage = webClient.getPage("http://localhost:8080/?show=discuss"); -- cgit v1.2.3