From 8a0fbbd35c13054a947ea0d27ca117542bc452b9 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Fri, 18 May 2018 15:33:38 +0300 Subject: JPA WIP --- .../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 +- 31 files changed, 726 insertions(+), 362 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 (limited to 'juick-server/src/main') 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, -- cgit v1.2.3