aboutsummaryrefslogtreecommitdiff
path: root/juick-server/src/main/java/com/juick
diff options
context:
space:
mode:
Diffstat (limited to 'juick-server/src/main/java/com/juick')
-rw-r--r--juick-server/src/main/java/com/juick/server/EmailManager.java10
-rw-r--r--juick-server/src/main/java/com/juick/server/TelegramBotManager.java20
-rw-r--r--juick-server/src/main/java/com/juick/server/TwitterManager.java4
-rw-r--r--juick-server/src/main/java/com/juick/server/XMPPConnection.java21
-rw-r--r--juick-server/src/main/java/com/juick/server/api/PM.java12
-rw-r--r--juick-server/src/main/java/com/juick/server/api/SocialLogin.java33
-rw-r--r--juick-server/src/main/java/com/juick/server/api/Users.java2
-rw-r--r--juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java84
-rw-r--r--juick-server/src/main/java/com/juick/service/EmailServiceImpl.java35
-rw-r--r--juick-server/src/main/java/com/juick/service/EntityUtils.java22
-rw-r--r--juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java39
-rw-r--r--juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java48
-rw-r--r--juick-server/src/main/java/com/juick/service/TelegramServiceImpl.java14
-rw-r--r--juick-server/src/main/java/com/juick/service/UserServiceImpl.java245
-rw-r--r--juick-server/src/main/java/com/juick/service/data/MessagesRepository.java7
-rw-r--r--juick-server/src/main/java/com/juick/service/data/TextRepository.java7
-rw-r--r--juick-server/src/main/java/com/juick/service/data/UsersRepository.java23
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/BaseMessagePropertyEntity.java20
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/BaseUserPropertyEntity.java20
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/EmailEntity.java20
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/FacebookEntity.java20
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/LoginEntity.java19
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/MessageEntity.java81
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/ReplyEntity.java31
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/TagEntity.java15
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/TagNameEntity.java30
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/TelegramEntity.java20
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/TextEntity.java42
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/UserEntity.java109
-rw-r--r--juick-server/src/main/java/com/juick/service/data/entities/VKEntity.java20
30 files changed, 719 insertions, 354 deletions
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<MessageEvent> {
}
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<MessageEvent> {
", 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<br /><br />--<br />You are receiving this because you are subscribed to this user" +
", discussion or tag. Reply to this email directly or <a href=\"%s\"><img src=\"https://api.juick.com/thread/mark_read/%d-%d.gif?hash=%s\" />view it</a> on Juick." +
@@ -110,7 +110,7 @@ public class EmailManager implements ApplicationListener<MessageEvent> {
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<Long> 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<User> lastconv = pmQueriesService.getPMLastConversationsUsers(visitor.getUid(), cnt);
+ List<User> 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<ExternalToken> getTwitterToken(final int uid) {
+ public Optional<ExternalToken> getTwitterToken(final User user) {
List<ExternalToken> 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<Pair<String, String>> getFacebookTokens(final int uid) {
+ public Optional<Pair<String, String>> getFacebookTokens(final User user) {
List<Optional<Pair<String, String>>> 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<ApplicationStatus> 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<String> 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<String> 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<Pair<String, String>> getVkTokens(final int uid) {
+ public Optional<Pair<String, String>> getVkTokens(final User user) {
List<Optional<Pair<String, String>>> 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<User> 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<User> 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<String> 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<String> getEmails(Integer userId, boolean active) {
+ public List<String> 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<com.juick.Tag> tags) {
- SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(getJdbcTemplate()).withTableName("messages")
- .usingColumns("user_id", "attach", "ts")
- .usingGeneratedKeyColumns("message_id");
- Map<String, Object> insertMap = new HashMap<>();
- insertMap.put("user_id", uid);
+ public Message createMessage(final User user, final String txt, final String attachment, final Collection<com.juick.Tag> 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<Integer> 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<String> 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<User> getPMLastConversationsUsers(final int uid, final int cnt) {
+ public List<User> 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<com.juick.Message> getPMMessages(final int uid, final int uidTo) {
+ public List<com.juick.Message> 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<com.juick.Message> 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<com.juick.Message> getLastPMInbox(final int uid) {
+ public List<com.juick.Message> 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<com.juick.Message> getLastPMSent(final int uid) {
+ public List<com.juick.Message> 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<Integer> 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<User> {
@Override
@@ -90,106 +94,57 @@ 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<User> getUserByUID(final int uid) {
- List<User> 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<User> list = getJdbcTemplate().query(
- "SELECT id, nick, banned, lang FROM users WHERE nick = ?", new UserMapper(), username);
-
- if (!list.isEmpty())
- return list.get(0);
+ Optional<UserEntity> 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<User> 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<User> 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<UserEntity> e = usersRepository.findByEmailsEmail(email);
+ if (e.isPresent()) {
+ return EntityUtils.entityToUser(e.get());
}
return AnonymousUser.INSTANCE;
}
@Transactional(readOnly = true)
@Override
- public List<User> getFullyUsersByNames(final Collection<String> 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) {
User result = null;
@@ -208,25 +163,13 @@ public class UserServiceImpl extends BaseJdbcService implements UserService {
@Transactional(readOnly = true)
@Override
public List<User> getUsersByName(final Collection<String> 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<User> getUsersByID(final Collection<Integer> 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)
@@ -237,57 +180,11 @@ public class UserServiceImpl extends BaseJdbcService implements UserService {
@Transactional(readOnly = true)
@Override
- public int getUIDbyJID(final String jid) {
- if (StringUtils.isNotBlank(jid)) {
- List<Integer> 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<Integer> 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<Integer> 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<User> 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<UserEntity> 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<String> 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<User> 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> 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)
@@ -398,17 +282,6 @@ public class UserServiceImpl extends BaseJdbcService implements UserService {
@Transactional(readOnly = true)
@Override
- public boolean getCanMedia(final int uid) {
- List<Integer> 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) {
List<Integer> list = getJdbcTemplate().queryForList(
"SELECT 1 FROM wl_users WHERE user_id = ? AND wl_user_id = ?",
@@ -617,8 +490,12 @@ public class UserServiceImpl extends BaseJdbcService implements UserService {
@Transactional(readOnly = true)
@Override
- public List<String> getEmails(final User user) {
- return getJdbcTemplate().queryForList("SELECT email FROM emails WHERE user_id=?", String.class, user.getUid());
+ public Collection<String> getEmails(final User user) {
+ Optional<UserEntity> 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<MessageEntity, Integer> {
+}
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<TextEntity, Integer> {
+}
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<UserEntity, String> {
+ Optional<UserEntity> findById(Integer uid);
+ Optional<UserEntity> findByName(String name);
+ Optional<UserEntity> findByNameAndPassword(String name, String password);
+ Optional<UserEntity> findByEmailsEmail(String email);
+ Stream<UserEntity> findAllByNameIn(Collection<String> names);
+ Stream<UserEntity> findAllByIdIn(Collection<Integer> uids);
+ Optional<UserEntity> findByFacebookIds_FacebookId(Long facebookId);
+ Optional<UserEntity> findByVkIds_VkId(Long vkId);
+ Optional<UserEntity> findByLogins_Hash(String hash);
+ Optional<UserEntity> 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<TagEntity> tags = new HashSet<>();
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "message")
+ private Set<ReplyEntity> 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<TagEntity> getTags() {
+ return tags;
+ }
+
+ public void setTags(Set<TagEntity> tags) {
+ this.tags = tags;
+ }
+
+ public Set<ReplyEntity> getReplies() {
+ return replies;
+ }
+
+ public void setReplies(Set<ReplyEntity> 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<EmailEntity> emails = new HashSet<>();
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
+ private Set<FacebookEntity> facebookIds = new HashSet<>();
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
+ private Set<VKEntity> vkIds = new HashSet<>();
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
+ private Set<LoginEntity> logins = new HashSet<>();
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
+ private Set<TelegramEntity> 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<EmailEntity> getEmails() {
+ return emails;
+ }
+
+ public void setEmails(Set<EmailEntity> emails) {
+ this.emails = emails;
+ }
+
+ public Set<FacebookEntity> getFacebookIds() {
+ return facebookIds;
+ }
+
+ public void setFacebookIds(Set<FacebookEntity> facebookIds) {
+ this.facebookIds = facebookIds;
+ }
+
+ public Set<VKEntity> getVkIds() {
+ return vkIds;
+ }
+
+ public void setVkIds(Set<VKEntity> vkIds) {
+ this.vkIds = vkIds;
+ }
+
+ public Set<LoginEntity> getLogins() {
+ return logins;
+ }
+
+ public void setLogins(Set<LoginEntity> logins) {
+ this.logins = logins;
+ }
+
+ public Set<TelegramEntity> getTgIds() {
+ return tgIds;
+ }
+
+ public void setTgIds(Set<TelegramEntity> 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;
+ }
+}