From ffb24e0d469aaafa35ad5f460a7bdf771382f0ff Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Wed, 16 Nov 2016 14:30:50 +0300 Subject: server-core -> juick-server --- juick-api/build.gradle | 2 +- juick-crosspost/build.gradle | 2 +- juick-demo/build.gradle | 2 +- juick-notifications/build.gradle | 2 +- juick-rss/build.gradle | 2 +- juick-server/build.gradle | 48 ++ .../com/juick/configuration/DataConfiguration.java | 57 ++ .../src/main/java/com/juick/server/AdsQueries.java | 51 ++ .../java/com/juick/server/CrosspostQueries.java | 87 ++ .../java/com/juick/server/MessagesQueries.java | 657 +++++++++++++++ .../src/main/java/com/juick/server/PMQueries.java | 133 ++++ .../main/java/com/juick/server/PrivacyQueries.java | 32 + .../main/java/com/juick/server/PushQueries.java | 44 + .../main/java/com/juick/server/ShowQueries.java | 32 + .../com/juick/server/SubscriptionsQueries.java | 125 +++ .../src/main/java/com/juick/server/TagQueries.java | 160 ++++ .../main/java/com/juick/server/UserQueries.java | 487 ++++++++++++ .../juick/server/helpers/ApplicationStatus.java | 35 + .../main/java/com/juick/server/helpers/Auth.java | 22 + .../java/com/juick/server/helpers/EmailOpts.java | 24 + .../java/com/juick/server/helpers/NotifyOpts.java | 34 + .../java/com/juick/server/helpers/PrivacyOpts.java | 29 + .../main/java/com/juick/server/helpers/Status.java | 19 + .../java/com/juick/server/helpers/UserInfo.java | 43 + .../com/juick/server/protocol/JuickProtocol.java | 458 +++++++++++ .../com/juick/server/protocol/ProtocolReply.java | 23 + .../server/protocol/annotation/UserCommand.java | 31 + .../main/java/com/juick/service/AdsService.java | 11 + .../java/com/juick/service/AdsServiceImpl.java | 51 ++ .../java/com/juick/service/BaseJdbcService.java | 55 ++ .../java/com/juick/service/CrosspostService.java | 24 + .../com/juick/service/CrosspostServiceImpl.java | 96 +++ .../java/com/juick/service/MessagesService.java | 81 ++ .../com/juick/service/MessagesServiceImpl.java | 857 ++++++++++++++++++++ .../java/com/juick/service/PMQueriesService.java | 28 + .../com/juick/service/PMQueriesServiceImpl.java | 165 ++++ .../com/juick/service/PrivacyQueriesService.java | 17 + .../juick/service/PrivacyQueriesServiceImpl.java | 56 ++ .../java/com/juick/service/PushQueriesService.java | 20 + .../com/juick/service/PushQueriesServiceImpl.java | 70 ++ .../java/com/juick/service/ShowQueriesService.java | 14 + .../com/juick/service/ShowQueriesServiceImpl.java | 50 ++ .../com/juick/service/SubscriptionService.java | 36 + .../com/juick/service/SubscriptionServiceImpl.java | 196 +++++ .../main/java/com/juick/service/TagService.java | 30 + .../java/com/juick/service/TagServiceImpl.java | 190 +++++ .../main/java/com/juick/service/UserService.java | 107 +++ .../java/com/juick/service/UserServiceImpl.java | 614 ++++++++++++++ .../src/main/java/com/juick/util/TagUtils.java | 24 + .../src/main/java/com/juick/util/ThreadHelper.java | 37 + .../src/main/java/com/juick/util/UserUtils.java | 27 + juick-server/src/main/resources/juick.conf.example | 47 ++ .../src/main/resources/logback.xml.example | 35 + juick-server/src/main/resources/schema.sql | 885 +++++++++++++++++++++ juick-ws/build.gradle | 2 +- juick-www/build.gradle | 2 +- juick-xmpp-bot/build.gradle | 2 +- juick-xmpp-ft/build.gradle | 2 +- juick-xmpp/build.gradle | 2 +- readme.txt | 2 +- server-core/build.gradle | 48 -- .../com/juick/configuration/DataConfiguration.java | 57 -- .../src/main/java/com/juick/server/AdsQueries.java | 51 -- .../java/com/juick/server/CrosspostQueries.java | 87 -- .../java/com/juick/server/MessagesQueries.java | 657 --------------- .../src/main/java/com/juick/server/PMQueries.java | 133 ---- .../main/java/com/juick/server/PrivacyQueries.java | 32 - .../main/java/com/juick/server/PushQueries.java | 44 - .../main/java/com/juick/server/ShowQueries.java | 32 - .../com/juick/server/SubscriptionsQueries.java | 125 --- .../src/main/java/com/juick/server/TagQueries.java | 160 ---- .../main/java/com/juick/server/UserQueries.java | 487 ------------ .../juick/server/helpers/ApplicationStatus.java | 35 - .../main/java/com/juick/server/helpers/Auth.java | 22 - .../java/com/juick/server/helpers/EmailOpts.java | 24 - .../java/com/juick/server/helpers/NotifyOpts.java | 34 - .../java/com/juick/server/helpers/PrivacyOpts.java | 29 - .../main/java/com/juick/server/helpers/Status.java | 19 - .../java/com/juick/server/helpers/UserInfo.java | 43 - .../com/juick/server/protocol/JuickProtocol.java | 458 ----------- .../com/juick/server/protocol/ProtocolReply.java | 23 - .../server/protocol/annotation/UserCommand.java | 31 - .../main/java/com/juick/service/AdsService.java | 11 - .../java/com/juick/service/AdsServiceImpl.java | 51 -- .../java/com/juick/service/BaseJdbcService.java | 55 -- .../java/com/juick/service/CrosspostService.java | 24 - .../com/juick/service/CrosspostServiceImpl.java | 96 --- .../java/com/juick/service/MessagesService.java | 81 -- .../com/juick/service/MessagesServiceImpl.java | 857 -------------------- .../java/com/juick/service/PMQueriesService.java | 28 - .../com/juick/service/PMQueriesServiceImpl.java | 165 ---- .../com/juick/service/PrivacyQueriesService.java | 17 - .../juick/service/PrivacyQueriesServiceImpl.java | 56 -- .../java/com/juick/service/PushQueriesService.java | 20 - .../com/juick/service/PushQueriesServiceImpl.java | 70 -- .../java/com/juick/service/ShowQueriesService.java | 14 - .../com/juick/service/ShowQueriesServiceImpl.java | 50 -- .../com/juick/service/SubscriptionService.java | 36 - .../com/juick/service/SubscriptionServiceImpl.java | 196 ----- .../main/java/com/juick/service/TagService.java | 30 - .../java/com/juick/service/TagServiceImpl.java | 190 ----- .../main/java/com/juick/service/UserService.java | 107 --- .../java/com/juick/service/UserServiceImpl.java | 614 -------------- .../src/main/java/com/juick/util/TagUtils.java | 24 - .../src/main/java/com/juick/util/ThreadHelper.java | 37 - .../src/main/java/com/juick/util/UserUtils.java | 27 - server-core/src/main/resources/juick.conf.example | 47 -- server-core/src/main/resources/logback.xml.example | 35 - server-core/src/main/resources/schema.sql | 885 --------------------- settings.gradle | 2 +- 110 files changed, 6466 insertions(+), 6466 deletions(-) create mode 100644 juick-server/build.gradle create mode 100644 juick-server/src/main/java/com/juick/configuration/DataConfiguration.java create mode 100644 juick-server/src/main/java/com/juick/server/AdsQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/CrosspostQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/MessagesQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/PMQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/PrivacyQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/PushQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/ShowQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/SubscriptionsQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/TagQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/UserQueries.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/ApplicationStatus.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/Auth.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/EmailOpts.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/NotifyOpts.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/PrivacyOpts.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/Status.java create mode 100644 juick-server/src/main/java/com/juick/server/helpers/UserInfo.java create mode 100644 juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java create mode 100644 juick-server/src/main/java/com/juick/server/protocol/ProtocolReply.java create mode 100644 juick-server/src/main/java/com/juick/server/protocol/annotation/UserCommand.java create mode 100644 juick-server/src/main/java/com/juick/service/AdsService.java create mode 100644 juick-server/src/main/java/com/juick/service/AdsServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/BaseJdbcService.java create mode 100644 juick-server/src/main/java/com/juick/service/CrosspostService.java create mode 100644 juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/MessagesService.java create mode 100644 juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/PMQueriesService.java create mode 100644 juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/PrivacyQueriesService.java create mode 100644 juick-server/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/PushQueriesService.java create mode 100644 juick-server/src/main/java/com/juick/service/PushQueriesServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/ShowQueriesService.java create mode 100644 juick-server/src/main/java/com/juick/service/ShowQueriesServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/SubscriptionService.java create mode 100644 juick-server/src/main/java/com/juick/service/SubscriptionServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/TagService.java create mode 100644 juick-server/src/main/java/com/juick/service/TagServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/service/UserService.java create mode 100644 juick-server/src/main/java/com/juick/service/UserServiceImpl.java create mode 100644 juick-server/src/main/java/com/juick/util/TagUtils.java create mode 100644 juick-server/src/main/java/com/juick/util/ThreadHelper.java create mode 100644 juick-server/src/main/java/com/juick/util/UserUtils.java create mode 100644 juick-server/src/main/resources/juick.conf.example create mode 100644 juick-server/src/main/resources/logback.xml.example create mode 100644 juick-server/src/main/resources/schema.sql delete mode 100644 server-core/build.gradle delete mode 100644 server-core/src/main/java/com/juick/configuration/DataConfiguration.java delete mode 100644 server-core/src/main/java/com/juick/server/AdsQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/CrosspostQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/MessagesQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/PMQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/PrivacyQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/PushQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/ShowQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/SubscriptionsQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/TagQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/UserQueries.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/ApplicationStatus.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/Auth.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/EmailOpts.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/NotifyOpts.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/PrivacyOpts.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/Status.java delete mode 100644 server-core/src/main/java/com/juick/server/helpers/UserInfo.java delete mode 100644 server-core/src/main/java/com/juick/server/protocol/JuickProtocol.java delete mode 100644 server-core/src/main/java/com/juick/server/protocol/ProtocolReply.java delete mode 100644 server-core/src/main/java/com/juick/server/protocol/annotation/UserCommand.java delete mode 100644 server-core/src/main/java/com/juick/service/AdsService.java delete mode 100644 server-core/src/main/java/com/juick/service/AdsServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/BaseJdbcService.java delete mode 100644 server-core/src/main/java/com/juick/service/CrosspostService.java delete mode 100644 server-core/src/main/java/com/juick/service/CrosspostServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/MessagesService.java delete mode 100644 server-core/src/main/java/com/juick/service/MessagesServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/PMQueriesService.java delete mode 100644 server-core/src/main/java/com/juick/service/PMQueriesServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/PrivacyQueriesService.java delete mode 100644 server-core/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/PushQueriesService.java delete mode 100644 server-core/src/main/java/com/juick/service/PushQueriesServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/ShowQueriesService.java delete mode 100644 server-core/src/main/java/com/juick/service/ShowQueriesServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/SubscriptionService.java delete mode 100644 server-core/src/main/java/com/juick/service/SubscriptionServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/TagService.java delete mode 100644 server-core/src/main/java/com/juick/service/TagServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/service/UserService.java delete mode 100644 server-core/src/main/java/com/juick/service/UserServiceImpl.java delete mode 100644 server-core/src/main/java/com/juick/util/TagUtils.java delete mode 100644 server-core/src/main/java/com/juick/util/ThreadHelper.java delete mode 100644 server-core/src/main/java/com/juick/util/UserUtils.java delete mode 100644 server-core/src/main/resources/juick.conf.example delete mode 100644 server-core/src/main/resources/logback.xml.example delete mode 100644 server-core/src/main/resources/schema.sql diff --git a/juick-api/build.gradle b/juick-api/build.gradle index da1a4638..c80546a5 100644 --- a/juick-api/build.gradle +++ b/juick-api/build.gradle @@ -19,7 +19,7 @@ repositories { } dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' compile 'org.bitbucket.sco0ter.babbler:xmpp-extensions-client:279e488e51' providedCompile 'javax.servlet:javax.servlet-api:3.1.0' diff --git a/juick-crosspost/build.gradle b/juick-crosspost/build.gradle index 6f28bc1f..d96e59b3 100644 --- a/juick-crosspost/build.gradle +++ b/juick-crosspost/build.gradle @@ -11,7 +11,7 @@ repositories { def springFrameworkVersion = '4.3.4.RELEASE' dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' compile 'org.bitbucket.sco0ter.babbler:xmpp-extensions-client:279e488e51' compile "org.springframework:spring-webmvc:${springFrameworkVersion}" diff --git a/juick-demo/build.gradle b/juick-demo/build.gradle index 4644ea87..5ae85d83 100644 --- a/juick-demo/build.gradle +++ b/juick-demo/build.gradle @@ -16,7 +16,7 @@ repositories { mainClassName = "com.juick.demo.Demo" dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'mysql:mysql-connector-java:5.1.40' compile 'ch.vorburger.mariaDB4j:mariaDB4j:2.2.2' compile 'jline:jline:2.14.2' diff --git a/juick-notifications/build.gradle b/juick-notifications/build.gradle index c8350adb..1928507e 100644 --- a/juick-notifications/build.gradle +++ b/juick-notifications/build.gradle @@ -11,7 +11,7 @@ repositories { def springFrameworkVersion = '4.3.4.RELEASE' dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' compile 'org.bitbucket.sco0ter.babbler:xmpp-extensions-client:279e488e51' compile 'com.ganyo:gcm-server:1.1.0' diff --git a/juick-rss/build.gradle b/juick-rss/build.gradle index 9e820d91..44af4eb9 100644 --- a/juick-rss/build.gradle +++ b/juick-rss/build.gradle @@ -8,7 +8,7 @@ repositories { } dependencies { - compile project(':server-core') + compile project(':juick-server') providedCompile 'javax.servlet:javax.servlet-api:3.1.0' providedRuntime 'mysql:mysql-connector-java:5.1.40' } diff --git a/juick-server/build.gradle b/juick-server/build.gradle new file mode 100644 index 00000000..705b7675 --- /dev/null +++ b/juick-server/build.gradle @@ -0,0 +1,48 @@ +apply plugin: 'java' +apply plugin: 'com.github.ben-manes.versions' + +sourceCompatibility = 1.8 + +repositories { + mavenCentral() +} + +def jacksonVersion = '2.8.4' +def logbackVersion = '1.1.7' +def slf4jVersion = '1.7.21' +def springFrameworkVersion = '4.3.4.RELEASE' + +dependencies { + compile project(':juick-core') + compile "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" + compile "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" + compile "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" + compile "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jacksonVersion}" + + compile "ch.qos.logback:logback-classic:${logbackVersion}" + compile "ch.qos.logback:logback-core:${logbackVersion}" + compile "ch.qos.logback:logback-access:${logbackVersion}" + + compile "org.slf4j:slf4j-api:${slf4jVersion}" + compile "org.slf4j:jcl-over-slf4j:${slf4jVersion}" + compile "org.slf4j:log4j-over-slf4j:${slf4jVersion}" + compile "org.slf4j:jul-to-slf4j:${slf4jVersion}" + + compile 'org.apache.httpcomponents:httpclient:4.5.2' + compile 'org.apache.commons:commons-lang3:3.5' + compile 'org.apache.commons:commons-collections4:4.1' + compile 'commons-io:commons-io:2.5' + + compile "org.springframework:spring-context:${springFrameworkVersion}" + compile "org.springframework:spring-jdbc:${springFrameworkVersion}" + + compile 'org.apache.commons:commons-dbcp2:2.1.1' + compile 'org.json:json:20160810' + compile 'javax.inject:javax.inject:1' +} + +compileJava.options.encoding = 'UTF-8' + +configurations { + all*.exclude module: 'commons-logging' +} diff --git a/juick-server/src/main/java/com/juick/configuration/DataConfiguration.java b/juick-server/src/main/java/com/juick/configuration/DataConfiguration.java new file mode 100644 index 00000000..88fc00b3 --- /dev/null +++ b/juick-server/src/main/java/com/juick/configuration/DataConfiguration.java @@ -0,0 +1,57 @@ +package com.juick.configuration; + +import org.apache.commons.dbcp2.BasicDataSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.annotation.TransactionManagementConfigurer; + +import javax.annotation.Resource; +import javax.sql.DataSource; + +/** + * Created by aalexeev on 11/11/16. + */ +@Configuration +@EnableTransactionManagement +@PropertySource(value = {"classpath:juick.conf"}) +@ComponentScan(basePackages = {"com.juick.service"}) +public class DataConfiguration implements TransactionManagementConfigurer { + @Resource + private Environment env; + + @Bean + public DataSource dataSource() { + BasicDataSource dataSource = new BasicDataSource(); + + dataSource.setDriverClassName(env.getProperty("datasource_driver", "com.mysql.jdbc.Driver")); + dataSource.setUrl(env.getProperty("datasource_url")); + dataSource.setUsername(env.getProperty("datasource_user", "")); + dataSource.setPassword(env.getProperty("datasource_password", "")); + + dataSource.setValidationQuery("select 1"); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager() { + return new DataSourceTransactionManager(dataSource()); + } + + @Override + public PlatformTransactionManager annotationDrivenTransactionManager() { + return transactionManager(); + } + + @Bean + public JdbcTemplate jdbcTemplate() { + return new JdbcTemplate(dataSource()); + } +} diff --git a/juick-server/src/main/java/com/juick/server/AdsQueries.java b/juick-server/src/main/java/com/juick/server/AdsQueries.java new file mode 100644 index 00000000..06590817 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/AdsQueries.java @@ -0,0 +1,51 @@ +/* + * Juick + * Copyright (C) 2008-2011, ugnich + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server; + +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * + * @author ugnich + */ +public class AdsQueries { + + public static int getAdMID(JdbcTemplate sql, int uid) { + if (uid > 0) { + try { + return sql.queryForObject("SELECT message_id FROM ads_messages " + + "WHERE message_id NOT IN (SELECT message_id FROM ads_messages_log WHERE user_id=? " + + "AND ts>UNIX_TIMESTAMP()-60*60*24 GROUP BY message_id HAVING COUNT(*)>2) ORDER BY RAND() LIMIT 1", + Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } else { + try { + return sql.queryForObject("SELECT message_id FROM ads_messages ORDER BY RAND() LIMIT 1", Integer.class); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + } + + public static void logAdMID(JdbcTemplate sql, int uid, int mid) { + sql.update("INSERT INTO ads_messages_log(user_id,message_id,ts) VALUES (?,?,UNIX_TIMESTAMP())", uid, mid); + } +} diff --git a/juick-server/src/main/java/com/juick/server/CrosspostQueries.java b/juick-server/src/main/java/com/juick/server/CrosspostQueries.java new file mode 100644 index 00000000..827dad09 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/CrosspostQueries.java @@ -0,0 +1,87 @@ +/* + * Juick + * Copyright (C) 2008-2013, Ugnich Anton + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server; + +import com.juick.server.helpers.ApplicationStatus; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.Optional; + +/** + * + * @author ugnich + */ +public class CrosspostQueries { + + public static Optional> getTwitterTokens(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT access_token,access_token_secret FROM twitter WHERE user_id=? AND crosspost=1", + (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), uid); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } + } + + public static Optional getFacebookToken(JdbcTemplate sql, int uid) { + try { + return Optional.of(sql.queryForObject("SELECT access_token FROM facebook WHERE user_id=? AND access_token IS NOT NULL " + + "AND crosspost=1", String.class, uid)); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } + } + public static ApplicationStatus isFBCrossPostEnabled(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT 1, crosspost FROM facebook WHERE user_id=? LIMIT 1", (rs, num) -> { + ApplicationStatus status = new ApplicationStatus(); + status.setConnected(rs.getInt(1) > 0); + status.setCrosspostEnabled(rs.getBoolean(2)); + return status; + }, uid); + } catch (EmptyResultDataAccessException e) { + return new ApplicationStatus(); + } + } + + public static String getTwitterName(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT uname FROM twitter WHERE user_id=?", String.class, uid); + } catch (EmptyResultDataAccessException e) { + return ""; + } + } + + public static String getTelegramName(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT tg_name FROM telegram WHERE user_id=?", String.class, uid); + } catch (EmptyResultDataAccessException e) { + return ""; + } + } + + public static Optional> getVKTokens(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("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); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } + } +} diff --git a/juick-server/src/main/java/com/juick/server/MessagesQueries.java b/juick-server/src/main/java/com/juick/server/MessagesQueries.java new file mode 100644 index 00000000..9d4284bc --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/MessagesQueries.java @@ -0,0 +1,657 @@ +/* + * Juick + * Copyright (C) 2008-2011, Ugnich Anton + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server; + +import com.juick.Message; +import com.juick.Tag; +import com.juick.User; +import com.juick.server.helpers.PrivacyOpts; +import com.juick.util.MessageUtils; +import org.apache.commons.lang3.StringEscapeUtils; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.dao.IncorrectResultSizeDataAccessException; +import org.springframework.jdbc.core.ConnectionCallback; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.util.StringUtils; + +import java.sql.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Ugnich Anton + */ +public class MessagesQueries { + + public static class MessageMapper implements RowMapper { + @Override + public Message mapRow(ResultSet rs, int rowNum) throws SQLException { + Message msg = new Message(); + msg.setMid(rs.getInt(1)); + msg.setRid(rs.getInt(2)); + msg.setReplyto(rs.getInt(3)); + User user = new User(); + user.setUid(rs.getInt(4)); + user.setName(rs.getString(5)); + user.setBanned(rs.getBoolean(6)); + msg.setUser(user); + msg.TimeAgo = rs.getInt(7); + msg.setDate(rs.getTimestamp(8)); + msg.ReadOnly = rs.getBoolean(9); + msg.setPrivacy(rs.getInt(10)); + msg.FriendsOnly = msg.getPrivacy() < 0; + msg.Replies = rs.getInt(11); + msg.AttachmentType = rs.getString(12); + if (rs.getDouble(13) != 0) { + msg.Place = new com.juick.Place(); + msg.Place.lat = rs.getDouble(14); + msg.Place.lon = rs.getDouble(15); + } + msg.Likes = rs.getInt(16); + msg.Hidden = rs.getBoolean(17); + // parse tags string + String tagsStr = rs.getString(18); + if (tagsStr != null) { + Arrays.stream(tagsStr.split(" ")).forEach(t -> msg.getTags().add(new Tag(t))); + } + msg.RepliesBy = rs.getString(19); + msg.setText(rs.getString(20)); + msg.setReplyQuote(MessageUtils.formatQuote(rs.getString(21))); + return msg; + } + } + + public static int createMessage(JdbcTemplate sql, int uid, String txt, String attachment, List tags) { + KeyHolder holder = new GeneratedKeyHolder(); + sql.update(con -> { + PreparedStatement stmt = con.prepareStatement("INSERT INTO messages(user_id,attach) VALUES (?,?)", + Statement.RETURN_GENERATED_KEYS); + stmt.setInt(1, uid); + if (attachment != null) { + stmt.setString(2, attachment); + } else { + stmt.setNull(2, Types.VARCHAR); + } + return stmt; + }, holder); + + int mid = holder.getKey().intValue(); + + + if (mid > 0) { + + String tagsNames = ""; + String tagsIDs = ""; + + for (int i = 0; i < tags.size(); i++) { + if (i > 0) { + tagsNames += " "; + tagsIDs += ","; + } + tagsNames += tags.get(i).getName(); + tagsIDs += "(" + mid + "," + tags.get(i).TID + ")"; + } + if (tags.size() > 0) { + sql.execute("INSERT INTO messages_tags(message_id,tag_id) VALUES " + tagsIDs); + } + final String finalTagsNames = tagsNames; + sql.update(con -> { + PreparedStatement stmt = con.prepareStatement("INSERT INTO messages_txt(message_id,tags,txt) " + + "VALUES (?,?,?)", Statement.NO_GENERATED_KEYS); + stmt.setInt(1, mid); + if (finalTagsNames.isEmpty()) { + stmt.setNull(2, Types.VARCHAR); + } else { + stmt.setString(2, finalTagsNames); + } + stmt.setString(3, txt); + return stmt; + }); + } + + return mid; + } + + public static int createReply(JdbcTemplate sql, int mid, int rid, int uid, String txt, String attachment) { + int ridnew = getReplyIDIncrement(sql, mid); + + sql.update( con -> { + PreparedStatement stmt = con.prepareStatement("INSERT INTO replies(message_id,reply_id,user_id," + + "replyto,attach,txt) VALUES (?,?,?,?,?,?)", Statement.NO_GENERATED_KEYS); + stmt.setInt(1, mid); + stmt.setInt(2, ridnew); + stmt.setInt(3, uid); + stmt.setInt(4, rid); + if (attachment != null) { + stmt.setString(5, attachment); + } else { + stmt.setNull(5, Types.VARCHAR); + } + stmt.setString(6, txt); + return stmt; + }); + + if (ridnew > 0) { + sql.update("UPDATE messages SET replies=replies+1 WHERE message_id=?", mid); + } + + return ridnew; + } + + public static int getReplyIDIncrement(JdbcTemplate sql, int mid) { + return sql.execute((ConnectionCallback) conn -> { + conn.setAutoCommit(false); + final int replyNo; + try (PreparedStatement ps = conn.prepareStatement("START TRANSACTION")) { + ps.executeUpdate(); + } + try (PreparedStatement ps = conn.prepareStatement("SELECT maxreplyid+1 FROM messages WHERE message_id=? FOR UPDATE")) { + ps.setInt(1, mid); + try (ResultSet resultSet = ps.executeQuery()) { + if (resultSet.next()) { + replyNo = resultSet.getInt(1); + } else { + throw new IncorrectResultSizeDataAccessException("while getting getReplyIDIncrement, mid=" + mid, 1, 0); + } + } + } + try (PreparedStatement ps = conn.prepareStatement("UPDATE messages SET maxreplyid=? WHERE message_id=?")) { + ps.setInt(1, replyNo); + ps.setInt(2, mid); + if (ps.executeUpdate() != 1) { + throw new IncorrectResultSizeDataAccessException("Cannot find a message to update: " + mid, 1, 0); + } + } + conn.commit(); + return replyNo; + }); + + } + + public static boolean recommendMessage(JdbcTemplate sql, int mid, int vuid) { + boolean res = sql.update("INSERT IGNORE INTO favorites(user_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; + if (res) { + sql.update("UPDATE messages SET likes=likes+1 WHERE message_id=?", mid); + } + return res; + } + + public static boolean canViewThread(JdbcTemplate sql, int mid, int uid) { + PrivacyOpts privacyOpts; + try { + privacyOpts = sql.queryForObject("SELECT user_id,privacy FROM messages WHERE messages.message_id=?", + (rs, rowNum) -> { + PrivacyOpts res = new PrivacyOpts(); + res.setUid(rs.getInt(1)); + res.setPrivacy(rs.getInt(2)); + return res; + }, mid); + } catch (EmptyResultDataAccessException e) { + return true; + } + return privacyOpts.getPrivacy() >= 0 + || uid == privacyOpts.getUid() + || ((privacyOpts.getPrivacy() == -1 || privacyOpts.getPrivacy() == -2) && uid > 0 + && UserQueries.isInWL(sql, privacyOpts.getUid(), uid)); + } + + public static boolean isReadOnly(JdbcTemplate sql, int mid) { + try { + return sql.queryForObject("SELECT readonly FROM messages WHERE message_id=?", new Object[]{mid}, Integer.class) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static boolean isSubscribed(JdbcTemplate sql, int uid, int mid) { + try { + return sql.queryForObject("SELECT 1 FROM subscr_messages WHERE suser_id=? AND message_id=?", new Object[]{uid, mid}, Integer.class) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static int getMessagePrivacy(JdbcTemplate sql, int mid) { + try { + return sql.queryForObject("SELECT privacy FROM messages WHERE message_id=?", new Object[]{mid}, Integer.class); + } catch (EmptyResultDataAccessException e) { + return -4; + } + } + + + public static com.juick.Message getMessage(JdbcTemplate sql, int mid) { + try { + return sql.queryForObject("SELECT messages.message_id, 0 as rid, 0 as replyto, " + + "messages.user_id,users.nick, 0 as banned, " + + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," + + "messages.ts," + + "messages.readonly,messages.privacy,messages.replies," + + "messages.attach,messages.place_id,messages.lat," + + "messages.lon,messages.likes,messages.hidden," + + "txt.tags,txt.repliesby,txt.txt, '' as q FROM messages " + + "INNER JOIN users ON messages.user_id=users.id " + + "INNER JOIN messages_txt AS txt " + + "ON messages.message_id=txt.message_id " + + "WHERE messages.message_id=?", + new MessageMapper(), mid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static com.juick.Message getReply(JdbcTemplate sql, int mid, int rid) { + try { + return sql.queryForObject("SELECT replies.user_id,users.nick," + + "replies.replyto,replies.ts," + + "replies.attach,replies.txt, IFNULL(q.txt,t.txt) as quote FROM replies INNER JOIN users " + + "ON replies.user_id=users.id " + + "LEFT JOIN replies q " + + "ON replies.message_id=q.message_id and replies.replyto=q.reply_id " + + "LEFT JOIN messages_txt t ON replies.message_id=t.message_id " + + "WHERE replies.message_id=? AND replies.reply_id=?", + (rs, num) -> { + Message msg = new Message(); + msg.setMid(mid); + msg.setRid(rid); + msg.setUser(new User()); + msg.getUser().setUid(rs.getInt(1)); + msg.getUser().setName(rs.getString(2)); + msg.setReplyto(rs.getInt(3)); + msg.setDate(rs.getTimestamp(4)); + msg.AttachmentType = rs.getString(5); + msg.setText(rs.getString(6)); + String quote = rs.getString(7); + if (!StringUtils.isEmpty(quote)) { + msg.setReplyQuote(MessageUtils.formatQuote(quote)); + } + return msg; + }, mid, rid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static User getMessageAuthor(JdbcTemplate sql, int mid) { + try { + return sql.queryForObject("SELECT messages.user_id,users.nick " + + "FROM messages INNER JOIN users " + + "ON messages.user_id=users.id WHERE messages.message_id=?", + new Object[]{mid}, (rs, num) -> { + User res = new com.juick.User(); + res.setUid(rs.getInt(1)); + res.setName(rs.getString(2)); + return res; + }); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static List getMessageTags(JdbcTemplate sql, int mid) { + return sql.query("SELECT tags.tag_id,synonym_id,name,stat_messages FROM tags " + + "INNER JOIN messages_tags ON (messages_tags.message_id=? AND messages_tags.tag_id=tags.tag_id)", + new Object[]{mid}, (rs, num) -> { + com.juick.Tag t = new com.juick.Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); + t.TID = rs.getInt(1); + t.SynonymID = rs.getInt(2); + t.UsageCnt = rs.getInt(4); + return t; + }); + } + + public static List getMessageTagsIDs(JdbcTemplate sql, int mid) { + return sql.queryForList("SELECT tag_id FROM messages_tags WHERE message_id=?", new Object[] {mid}, Integer.class); + } + + public static List getMessageRecommendations(JdbcTemplate sql, int mid) { + return sql.queryForList("SELECT users.nick FROM favorites INNER JOIN users " + + "ON (favorites.message_id=? AND favorites.user_id=users.id)", + new Object[] {mid}, String.class); + } + + public static List getAll(JdbcTemplate sql, int visitor_uid, int before) { + if (visitor_uid > 1) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 OR user_id=?) AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", + new Object[]{before, visitor_uid, visitor_uid}, Integer.class); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE hidden=0" + + " AND (privacy>0 OR user_id=?)" + + " AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", + new Object[]{visitor_uid, visitor_uid}, Integer.class); + } + } else { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 AND user_id NOT IN (SELECT id from users WHERE banned=1) " + + " ORDER BY message_id DESC LIMIT 20", + new Object[]{before}, Integer.class); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE hidden=0 AND privacy>0" + + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", + Integer.class); + } + } + } + + public static List getTag(JdbcTemplate sql, int tid, int visitor_uid, int before, int cnt) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM (tags INNER JOIN messages_tags " + + "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + + "INNER JOIN messages USING(message_id) WHERE messages.message_id0 OR messages.user_id=?) ORDER BY message_id DESC LIMIT ?", + new Object[]{tid, tid, before, visitor_uid, cnt}, Integer.class); + } else { + return sql.queryForList("SELECT message_id FROM (tags INNER JOIN messages_tags " + + "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + + "INNER JOIN messages USING(message_id) WHERE messages.privacy>0 OR messages.user_id=? " + + "ORDER BY message_id DESC LIMIT ?", + new Object[]{tid, tid, visitor_uid, cnt}, Integer.class); + } + } + + public static List getTags(JdbcTemplate sql, String tids, int visitor_uid, int before, int cnt) { + if (before > 0) { + return sql.queryForList("SELECT messages.message_id FROM messages_tags " + + "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + + "AND messages.message_id0 OR messages.user_id=?) " + + "ORDER BY messages.message_id DESC LIMIT ?", new Object[]{before, visitor_uid, cnt}, Integer.class); + } else { + return sql.queryForList("SELECT messages.message_id FROM messages_tags " + + "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + + "AND (messages.privacy>0 OR messages.user_id=?) " + + "ORDER BY messages.message_id DESC LIMIT ?", new Object[]{visitor_uid, cnt}, Integer.class); + } + } + + public static List getPlace(JdbcTemplate sql, int place_id, int visitor_uid, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE place_id=? AND message_id0 OR user_id=?) ORDER BY message_id DESC LIMIT 20", + new Object[]{place_id, before, visitor_uid}, Integer.class); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE place_id=? AND (privacy>0 OR user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", new Object[]{place_id, visitor_uid}, Integer.class); + } + } + + public static List getMyFeed(JdbcTemplate sql, int uid, int before) { + List mids; + if (before > 0) { + mids = sql.queryForList("SELECT message_id FROM messages " + + "INNER JOIN subscr_users ON (subscr_users.suser_id=? AND subscr_users.user_id=messages.user_id) " + + "WHERE message_id=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + + "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", + Integer.class, uid, before, uid); + } else { + mids = sql.queryForList("SELECT message_id FROM messages " + + "INNER JOIN subscr_users ON (subscr_users.suser_id=? " + + "AND subscr_users.user_id=messages.user_id) " + + "WHERE (privacy>=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + + "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", + Integer.class, uid, uid); + } + + + if (before > 0) { + mids.addAll(sql.queryForList("SELECT message_id FROM messages " + + "WHERE user_id=? AND message_id getPrivate(JdbcTemplate sql, int uid, int before) { + + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND privacy<0 AND message_id getDiscussions(JdbcTemplate sql, int uid, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM subscr_messages WHERE suser_id=? AND message_id getRecommended(JdbcTemplate sql, int uid, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM favorites WHERE user_id " + + "IN (SELECT user_id FROM subscr_users WHERE suser_id=?) AND message_id getPopular(JdbcTemplate sql, int visitor_uid, int before) { + + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 " + + "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", Integer.class, before, visitor_uid); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE privacy>0 " + + "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", Integer.class, visitor_uid); + } + } + + public static List getPhotos(JdbcTemplate sql, int visitor_uid, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 OR user_id=?) " + + "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + + "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", Integer.class, before, visitor_uid, visitor_uid); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE (privacy>0 OR user_id=?) " + + "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + + "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", Integer.class, visitor_uid, visitor_uid); + } + } + + public static List getSearch(JdbcTemplate sql, JdbcTemplate sqlSearch, String search, int before) { + List mids; + + if (before > 0) { + mids = sqlSearch.queryForList("SELECT id AS message_id FROM messages WHERE MATCH(?) AND id 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE message_id " + + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>0 ORDER BY message_id DESC LIMIT 20", + Integer.class); + } + return mids; + } + + public static List getUserBlog(JdbcTemplate sql, int UID, int privacy, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND message_id=" + + privacy + " ORDER BY message_id DESC LIMIT 20", Integer.class, UID, before); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + + " ORDER BY message_id DESC LIMIT 20", Integer.class, UID); + } + } + + public static List getUserTag(JdbcTemplate sql, int UID, int TID, int privacy, int before) { + if (before > 0) { + return sql.queryForList("SELECT messages.message_id FROM messages_tags INNER JOIN messages " + + "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + + "AND messages.message_id=" + privacy + + " ORDER BY messages.message_id DESC LIMIT 20", + Integer.class, UID, TID, before); + } else { + return sql.queryForList("SELECT messages.message_id FROM messages_tags INNER JOIN messages " + + "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + + "AND messages.privacy>=" + privacy + " ORDER BY messages.message_id DESC LIMIT 20", + Integer.class, UID, TID); + } + } + + public static List getUserRecommendations(JdbcTemplate sql, int UID, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM favorites " + + "WHERE user_id=? AND message_id getUserPhotos(JdbcTemplate sql, int UID, int privacy, int before) { + if (before > 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND message_id=" + + privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", + new Object[] {UID, before}, Integer.class); + } else { + return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", + new Object[] {UID}, Integer.class); + } + } + + public static List getUserSearch(JdbcTemplate sql, JdbcTemplate sqlSearch, int UID, String search, int privacy, int before) { + List mids; + + + if (before > 0) { + mids = sqlSearch.queryForList("SELECT id AS message_id FROM messages WHERE user_id=? AND MATCH(?) AND id 0) { + return sql.queryForList("SELECT message_id FROM messages WHERE message_id IN (" + + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>=" + privacy + " ORDER BY message_id DESC", + Integer.class); + } + return mids; + } + + public static List getMessages(JdbcTemplate sql, List mids) { + if (!mids.isEmpty()) { + return sql.query("SELECT messages.message_id, 0 as rid, 0 as replyto, " + + "messages.user_id,users.nick, 0 as banned, " + + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," + + "messages.ts," + + "messages.readonly,messages.privacy,messages.replies," + + "messages.attach,messages.place_id,messages.lat," + + "messages.lon,messages.likes,messages.hidden," + + "messages_txt.tags,messages_txt.repliesby, messages_txt.txt, '' as q " + + "FROM (messages INNER JOIN messages_txt " + + "ON messages.message_id=messages_txt.message_id) " + + "INNER JOIN users ON messages.user_id=users.id " + + "WHERE messages.message_id " + + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") " + + "ORDER BY messages.message_id DESC", new MessageMapper()); + } + return Collections.emptyList(); + } + + public static List getReplies(JdbcTemplate sql, int mid) { + return sql.query("SELECT ? as mid, replies.reply_id,replies.replyto, " + + "replies.user_id,users.nick,users.banned, " + + "TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts," + + "0 as readonly, 0 as privacy, 0 as replies," + + "replies.attach, 0 as place_id, 0 as lat," + + "0 as lon, 0 as likes, 0 as hidden," + + "NULL as tags,NULL as repliesby, replies.txt, " + + "IFNULL(qw.txt, t.txt) as q " + + "FROM replies INNER JOIN users " + + "ON replies.user_id=users.id " + + "LEFT JOIN replies qw ON replies.message_id=qw.message_id and replies.replyto=qw.reply_id " + + "LEFT JOIN messages_txt t on replies.message_id=t.message_id " + + "WHERE replies.message_id=? " + + "ORDER BY replies.reply_id ASC", + new MessageMapper(), mid, mid); + } + + public static boolean setMessagePopular(JdbcTemplate sql, int mid, int popular) { + boolean ret; + switch (popular) { + case -2: + ret = sql.update("UPDATE messages SET hidden=1 WHERE message_id=?", mid) > 0; + break; + case -1: + ret = sql.update("UPDATE messages SET popular=0 WHERE message_id=?", mid) > 0; + break; + default: + ret = sql.update("UPDATE messages SET popular=? WHERE message_id=?", popular, mid) > 0; + break; + } + if (popular == -1) { + ret = sql.update("INSERT INTO top_ignore_messages VALUES (?)", mid) > 0; + } + return ret; + } + + public static boolean setMessagePrivacy(JdbcTemplate sql, int mid) { + return sql.update("UPDATE messages SET privacy=1 WHERE message_id=?", + mid) > 0; + } + public static boolean deleteMessage(JdbcTemplate sql, int uid, int mid) { + if (sql.update("DELETE FROM messages WHERE message_id=? AND user_id=?", mid, uid) > 0) { + sql.update("DELETE FROM messages_txt WHERE message_id=?", mid); + sql.update("DELETE FROM replies WHERE message_id=?", mid); + sql.update("DELETE FROM subscr_messages WHERE message_id=?", mid); + sql.update("DELETE FROM messages_tags WHERE message_id=?", mid); + return true; + } + return false; + } +} diff --git a/juick-server/src/main/java/com/juick/server/PMQueries.java b/juick-server/src/main/java/com/juick/server/PMQueries.java new file mode 100644 index 00000000..c79c04b6 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/PMQueries.java @@ -0,0 +1,133 @@ +/* + * Juick + * Copyright (C) 2008-2011, Ugnich Anton + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server; + +import com.juick.User; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.List; + +/** + * + * @author Ugnich Anton + */ +public class PMQueries { + + public static boolean createPM(JdbcTemplate sql, int uid_from, int uid_to, String body) { + boolean ret = sql.update("INSERT INTO pm(user_id,user_id_to,txt) VALUES (?,?,?)", + uid_from, uid_to, body) > 0; + + if (ret) { + sql.update("INSERT INTO pm_streams(user_id,user_id_to,lastmessage,unread) " + + "VALUES (?,?,NOW(),1) " + + "ON DUPLICATE KEY UPDATE lastmessage=NOW(),unread=unread+1", + uid_from, uid_to); + } + return ret; + } + + public static boolean addPMinRoster(JdbcTemplate sql, int uid, String jid) { + return sql.update("INSERT INTO pm_inroster(user_id,jid) VALUES (?,?)", + uid, jid) > 0; + } + + public static boolean removePMinRoster(JdbcTemplate sql, int uid, String jid) { + return sql.update("DELETE FROM pm_inroster WHERE user_id=? AND jid=?", uid, jid) > 0; + } + + public static boolean havePMinRoster(JdbcTemplate sql, int uid, String jid) { + List res = sql.queryForList("SELECT 1 FROM pm_inroster " + + "WHERE user_id=? AND jid=?", Integer.class, + uid, jid); + return res.size() > 0; + } + + public static String getLastView(JdbcTemplate sql, int uid_from, int uid_to) { + try { + return sql.queryForObject("SELECT lastview FROM pm_streams WHERE user_id=? AND user_id_to=?", String.class, + uid_from, uid_to); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static List getPMLastConversationsUsers(JdbcTemplate sql, int uid, int cnt) { + return sql.query("SELECT pm_streams.user_id, users.nick, pm_streams.unread FROM pm_streams " + + "INNER JOIN users ON users.id = pm_streams.user_id " + + "WHERE pm_streams.user_id_to=? " + + "ORDER BY pm_streams.unread DESC, pm_streams.lastmessage DESC LIMIT " + cnt, (rs, rowNum) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + u.setUnreadCount(rs.getInt(3)); + return u; + }, uid); + } + + public static List getPMMessages(JdbcTemplate sql, int uid, int uid_to) { + List msgs = sql.query("SELECT user_id,txt,ts FROM pm " + + "WHERE (user_id=? AND user_id_to=?) " + + "OR (user_id_to=? AND user_id=?) ORDER BY ts DESC LIMIT 20", + (rs, rowNum) -> { + com.juick.Message msg = new com.juick.Message(); + int uuid = rs.getInt(1); + msg.setUser(new User()); + msg.getUser().setUid(uuid); + msg.setText(rs.getString(2)); + msg.setDate(rs.getTimestamp(3)); + return msg; + }, uid, uid_to, uid, uid_to); + + sql.update("UPDATE pm_streams SET lastview=NOW(),unread=0 " + + "WHERE user_id_to=? AND user_id=?", uid, uid_to); + + return msgs; + } + + public static List getLastPMInbox(JdbcTemplate sql, int uid) { + return sql.query("SELECT pm.user_id,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW()),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", + (rs, num) -> { + com.juick.Message msg = new com.juick.Message(); + msg.setUser(new User()); + msg.getUser().setUid(rs.getInt(1)); + msg.getUser().setName(rs.getString(2)); + msg.setText(rs.getString(3)); + msg.TimeAgo = rs.getInt(4); + msg.setDate(rs.getTimestamp(5)); + return msg; + }, uid); + } + + public static List getLastPMSent(JdbcTemplate sql, int uid) { + return sql.query("SELECT pm.user_id_to,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW())," + + "pm.ts FROM pm INNER JOIN users ON pm.user_id_to=users.id " + + "WHERE pm.user_id=? ORDER BY pm.ts DESC LIMIT 20", + (rs, num) -> { + com.juick.Message msg = new com.juick.Message(); + msg.setUser(new User()); + msg.getUser().setUid(rs.getInt(1)); + msg.getUser().setName(rs.getString(2)); + msg.setText(rs.getString(3)); + msg.TimeAgo = rs.getInt(4); + msg.setDate(rs.getTimestamp(5)); + return msg; + }, uid); + } +} diff --git a/juick-server/src/main/java/com/juick/server/PrivacyQueries.java b/juick-server/src/main/java/com/juick/server/PrivacyQueries.java new file mode 100644 index 00000000..40fc82c4 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/PrivacyQueries.java @@ -0,0 +1,32 @@ +package com.juick.server; + +import com.juick.Tag; +import com.juick.User; +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by vitalyster on 19.10.2016. + */ +public class PrivacyQueries { + public enum PrivacyResult { + Removed, Added + } + public static PrivacyResult blacklistUser(JdbcTemplate jdbc, User user, User target) { + int result = jdbc.update("DELETE FROM bl_users WHERE user_id=? AND bl_user_id=?", user.getUid(), target.getUid()); + if (result > 0) { + return PrivacyResult.Removed; + } else { + jdbc.update("INSERT INTO bl_users(user_id,bl_user_id) VALUES (?,?)", user.getUid(), target.getUid()); + return PrivacyResult.Added; + } + } + public static PrivacyResult blacklistTag(JdbcTemplate jdbc, User user, Tag tag) { + int result = jdbc.update("DELETE FROM bl_tags WHERE user_id=? AND tag_id=?", user.getUid(), tag.TID); + if (result > 0) { + return PrivacyResult.Removed; + } else { + jdbc.update("INSERT INTO bl_tags(user_id,tag_id) VALUES (?,?)", user.getUid(), tag.TID); + return PrivacyResult.Added; + } + } +} diff --git a/juick-server/src/main/java/com/juick/server/PushQueries.java b/juick-server/src/main/java/com/juick/server/PushQueries.java new file mode 100644 index 00000000..904b3c0d --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/PushQueries.java @@ -0,0 +1,44 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.juick.server; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * + * @author ugnich + */ +public class PushQueries { + + public static List getAndroidRegID(JdbcTemplate sql, int uid) { + return sql.queryForList("SELECT regid FROM android WHERE user_id=?", String.class, uid); + } + + public static List getAndroidTokens(JdbcTemplate sql, List uids) { + return sql.queryForList("SELECT regid FROM android INNER JOIN users " + + "ON (users.id=android.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", String.class); + } + + public static List getWinPhoneURL(JdbcTemplate sql, int uid) { + return sql.queryForList("SELECT url FROM winphone WHERE user_id=?", String.class, uid); + } + + public static List getWindowsTokens(JdbcTemplate sql, List uids) { + return sql.queryForList("SELECT url FROM winphone INNER JOIN users " + + "ON (users.id=winphone.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", String.class); + } + + public static List getAPNSToken(JdbcTemplate sql, int uid) { + return sql.queryForList("SELECT token from ios WHERE user_id=?", String.class, uid); + } + + public static List getAPNSTokens(JdbcTemplate sql, List uids) { + return sql.queryForList("SELECT token FROM ios INNER JOIN users " + + "ON (users.id=ios.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", String.class); + } +} diff --git a/juick-server/src/main/java/com/juick/server/ShowQueries.java b/juick-server/src/main/java/com/juick/server/ShowQueries.java new file mode 100644 index 00000000..fde388c3 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/ShowQueries.java @@ -0,0 +1,32 @@ +package com.juick.server; + +import com.juick.User; + +import java.util.List; +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Created by vt on 10/01/16. + */ +public class ShowQueries { + + public static List getRecommendedUsers(JdbcTemplate sql, User forUser) { + return sql.queryForList("SELECT users.nick FROM subscr_users INNER JOIN users " + + "ON subscr_users.user_id=users.id " + + "WHERE subscr_users.user_id NOT IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + + "AND subscr_users.suser_id IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + + "AND subscr_users.user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "AND subscr_users.user_id!=? AND users.lastmessage>UNIX_TIMESTAMP()-259200 " + + "GROUP BY subscr_users.user_id ORDER BY count(*) DESC LIMIT 10", + String.class, forUser.getUid(), forUser.getUid(), forUser.getUid(), forUser.getUid()); + } + + public static List getTopUsers(JdbcTemplate sql) { + return sql.queryForList("SELECT users.nick,COUNT(subscr_users.suser_id) AS cnt " + + "FROM (subscr_users INNER JOIN users ON subscr_users.user_id=users.id) " + + "INNER JOIN useroptions ON users.id=useroptions.user_id " + + "WHERE useroptions.privacy_view>0 AND users.lastmessage>UNIX_TIMESTAMP()-259200 " + + "AND users.id!=2 GROUP BY subscr_users.user_id ORDER BY cnt DESC LIMIT 10", + String.class); + } +} diff --git a/juick-server/src/main/java/com/juick/server/SubscriptionsQueries.java b/juick-server/src/main/java/com/juick/server/SubscriptionsQueries.java new file mode 100644 index 00000000..08d704d9 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/SubscriptionsQueries.java @@ -0,0 +1,125 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.juick.server; + +import com.juick.Tag; +import com.juick.User; +import com.juick.server.helpers.NotifyOpts; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * @author ugnich + */ +public class SubscriptionsQueries { + + public static List getJIDSubscribedToUser(JdbcTemplate sql, int uid, boolean friendsonly) { + if (friendsonly == false) { + return sql.queryForList("SELECT jids.jid FROM subscr_users INNER JOIN jids " + + "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1", + String.class, uid); + } else { + return sql.queryForList("SELECT jids.jid FROM subscr_users INNER JOIN jids " + + "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1 " + + "AND jids.user_id IN (SELECT wl_user_id FROM wl_users WHERE user_id=?)", String.class, uid, uid); + } + } + + public static List getSubscribedUsers(JdbcTemplate sql, int uid, int mid) { + User author = MessagesQueries.getMessageAuthor(sql, mid); + List userids = UserQueries.getUserReaders(sql, uid); + Set set = new HashSet<>(); + set.addAll(userids.stream().map(User::getUid).collect(Collectors.toList())); + List tags = MessagesQueries.getMessageTagsIDs(sql, mid); + if (tags.size() > 0) { + List tagUsers = sql.queryForList("SELECT suser_id FROM subscr_tags " + + "WHERE tag_id IN (" + StringUtils.arrayToCommaDelimitedString(tags.toArray()) + ") AND suser_id!=? " + + " AND suser_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=?)", Integer.class, uid, author.getUid()); + set.addAll(tagUsers); + } + return UserQueries.getUsersByID(sql, new ArrayList<>(set)); + } + + public static List getUsersSubscribedToComments(JdbcTemplate sql, int mid, int ignore_uid) { + List userids = sql.queryForList("SELECT suser_id FROM subscr_messages WHERE message_id=? AND suser_id!=?", + Integer.class, mid, ignore_uid); + if (userids.size() > 0) { + return UserQueries.getUsersByID(sql, userids); + } else { + return Collections.emptyList(); + } + } + + public static List getUsersSubscribedToUserRecommendations(JdbcTemplate sql, int uid, int mid, int muid) { + List tags = MessagesQueries.getMessageTagsIDs(sql, mid); + + String query = "SELECT suser_id FROM subscr_users WHERE user_id=" + uid; + query += " AND user_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=" + muid + ")"; + query += " AND user_id NOT IN (SELECT suser_id FROM subscr_users WHERE user_id=" + muid + ")"; + query += " AND user_id NOT IN (SELECT suser_id FROM subscr_messages WHERE message_id=" + mid + ")"; + query += " AND user_id NOT IN (SELECT user_id FROM favorites WHERE message_id=" + mid + ")"; + query += " AND user_id NOT IN (SELECT subscr_users.suser_id FROM subscr_users INNER JOIN favorites ON (favorites.message_id=" + mid + " AND subscr_users.user_id=favorites.user_id AND favorites.user_id!=" + uid + "))"; + if (!tags.isEmpty()) { + String tagsStr = StringUtils.arrayToCommaDelimitedString(tags.toArray()); + query += " AND user_id NOT IN (SELECT suser_id FROM subscr_tags WHERE tag_id IN (" + tagsStr + "))"; + query += " AND user_id NOT IN (SELECT user_id FROM bl_tags WHERE tag_id IN (" + tagsStr + "))"; + } + List userids = sql.queryForList(query, Integer.class); + return UserQueries.getUsersByID(sql, userids); + } + + public static boolean subscribeMessage(JdbcTemplate sql, int mid, int vuid) { + return sql.update("INSERT IGNORE INTO subscr_messages(suser_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; + } + public static boolean unSubscribeMessage(JdbcTemplate sql, int mid, int vuid) { + return sql.update("DELETE FROM subscr_messages WHERE message_id=? AND suser_id=?", + mid, vuid) > 0; + } + public static boolean subscribeUser(JdbcTemplate sql, User user, User toUser) { + return sql.update("INSERT IGNORE INTO subscr_users(user_id,suser_id) VALUES (?,?)", + toUser.getUid(), user.getUid()) == 1; + } + public static boolean unSubscribeUser(JdbcTemplate sql, User user, User fromUser) { + return sql.update("DELETE FROM subscr_users WHERE suser_id=? AND user_id=?", + user.getUid(), fromUser.getUid()) > 0; + } + public static boolean subscribeTag(JdbcTemplate sql, User user, Tag toTag) { + return sql.update("INSERT IGNORE INTO subscr_tags(tag_id,suser_id) VALUES (?,?)", + toTag.TID, user.getUid()) == 1; + } + public static boolean unSubscribeTag(JdbcTemplate sql, User user, Tag toTag) { + return sql.update("DELETE FROM subscr_tags WHERE tag_id=? AND suser_id=?", + toTag.TID, user.getUid()) > 0; + } + + public static NotifyOpts getNotifyOptions(JdbcTemplate sql, User user) { + try { + return sql.queryForObject("SELECT jnotify,subscr_notify,recommendations FROM useroptions WHERE user_id=?", + (rs, num) -> { + NotifyOpts options = new NotifyOpts(); + options.setRepliesEnabled(rs.getInt(1) > 0); + options.setSubscriptionsEnabled(rs.getInt(2) > 0); + options.setRecommendationsEnabled(rs.getInt(3) > 0); + return options; + }, user.getUid()); + } catch (EmptyResultDataAccessException e) { + return new NotifyOpts(); + } + } + + public static boolean setNotifyOptions(JdbcTemplate sql, User user, NotifyOpts options) { + return sql.update("UPDATE useroptions SET jnotify=? WHERE user_id=?", options.isRepliesEnabled() ? 1 : 0, + user.getUid()) > 0 && + sql.update("UPDATE useroptions SET subscr_notify=? WHERE user_id=?", options.isSubscriptionsEnabled() ? 1 : 0, + user.getUid()) > 0 && + sql.update("UPDATE useroptions SET recommendations=? WHERE user_id=?", options.isRecommendationsEnabled() ? 1 : 0, + user.getUid()) > 0; + } +} diff --git a/juick-server/src/main/java/com/juick/server/TagQueries.java b/juick-server/src/main/java/com/juick/server/TagQueries.java new file mode 100644 index 00000000..ee9a1e21 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/TagQueries.java @@ -0,0 +1,160 @@ +/* + * Juick + * Copyright (C) 2008-2011, Ugnich Anton + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server; + +import com.juick.Tag; +import org.apache.commons.lang3.StringEscapeUtils; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; + +import java.sql.PreparedStatement; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * + * @author Ugnich Anton + */ +public class TagQueries { + + public static com.juick.Tag getTag(JdbcTemplate sql, int tid) { + try { + return sql.queryForObject("SELECT synonym_id,name FROM tags WHERE tag_id=?", + (rs, num) -> { + Tag ret = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(2))); + ret.TID = tid; + ret.SynonymID = rs.getInt(1); + return ret; + }, tid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static com.juick.Tag getTag(JdbcTemplate sql, String tag, boolean autoCreate) { + Tag ret = null; + try { + ret = sql.queryForObject("SELECT tag_id,synonym_id,name FROM tags WHERE name=?", + (rs, rowNum) -> { + Tag ret1 = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); + ret1.TID = rs.getInt(1); + ret1.SynonymID = rs.getInt(2); + return ret1; + }, StringEscapeUtils.escapeHtml4(tag)); + } catch (EmptyResultDataAccessException e) { + // tag not found + } + if (ret == null && autoCreate) { + ret = new com.juick.Tag(tag); + ret.TID = createTag(sql, tag); + } + + return ret; + } + + public static List getTags(JdbcTemplate sql, String[] tags, boolean autoCreate) { + List ret = new ArrayList<>(); + + for (String tag : tags) { + if (!tag.isEmpty()) { + Tag t = getTag(sql, tag, autoCreate); + if (t != null) { + ret.add(t); + } + } + } + + return ret; + } + + public static boolean getTagNoIndex(JdbcTemplate sql, int tag_id) { + try { + return sql.queryForObject("SELECT noindex FROM tags WHERE tag_id=?", Integer.class, tag_id) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static int createTag(JdbcTemplate sql, String name) { + KeyHolder holder = new GeneratedKeyHolder(); + sql.update(con -> { + PreparedStatement stmt = con.prepareStatement("INSERT INTO tags(name) VALUES (?)", + Statement.RETURN_GENERATED_KEYS); + stmt.setString(1, StringEscapeUtils.escapeHtml4(name)); + return stmt; + }, holder); + + return holder.getKey().intValue(); + } + + public static List getUserTagsAll(JdbcTemplate sql, int uid) { + return sql.query("SELECT tags.name,COUNT(messages.message_id) " + + "FROM (messages INNER JOIN messages_tags ON (messages.user_id=? " + + "AND messages.message_id=messages_tags.message_id)) " + + "INNER JOIN tags ON messages_tags.tag_id=tags.tag_id GROUP BY tags.tag_id ORDER BY tags.name ASC", + (rs, rowNum) -> { + Tag t = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(1))); + t.UsageCnt = rs.getInt(2); + return t; + }, uid); + } + + public static List getUserBLTags(JdbcTemplate sql, int uid) { + return sql.queryForList("SELECT tags.name FROM tags INNER JOIN bl_tags " + + "ON (bl_tags.user_id=? AND bl_tags.tag_id=tags.tag_id) ORDER BY tags.name", + String.class, uid); + } + + public static List getPopularTags(JdbcTemplate sql) { + return sql.queryForList("SELECT name FROM tags WHERE top=1 ORDER BY name ASC", String.class).stream() + .map(StringEscapeUtils::unescapeHtml4).collect(Collectors.toList()); + } + public static List updateTags(JdbcTemplate sql, int mid, List newTags) { + List currentTags = MessagesQueries.getMessageTags(sql, mid); + newTags.stream().filter(currentTags::contains) + .forEach(t -> sql.update("DELETE FROM messages_tags WHERE message_id=? AND tag_id=?", mid, t.TID)); + newTags.stream().filter(t -> !currentTags.contains(t)) + .forEach(t -> sql.update("INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)", mid, t.TID)); + return MessagesQueries.getMessageTags(sql, mid); + } + + public static List fromString(JdbcTemplate sql, String txt, boolean tagsOnly) { + String patternString = tagsOnly ? "^(?:(?:\\*[^ \\r\\n\\t]+)|\\s)+$" : "^\\*([^ \\r\\n\\t]+)\\s+([\\s\\S]+)"; + Pattern tagsPattern = Pattern.compile(patternString); + if (tagsPattern.matcher(txt).matches()) { + Pattern tagPattern = Pattern.compile("\\*([^ \\r\\n\\t]+)"); + Matcher tagMatcher = tagPattern.matcher(txt); + List tags = new ArrayList<>(); + // TODO: process readonly, private, friends, public + while (tagMatcher.find()) { + for (int i = 1; i <= tagMatcher.groupCount(); i++) { + tags.add(getTag(sql, tagMatcher.group(i), true)); + } + } + return tags; + } + return Collections.emptyList(); + } +} diff --git a/juick-server/src/main/java/com/juick/server/UserQueries.java b/juick-server/src/main/java/com/juick/server/UserQueries.java new file mode 100644 index 00000000..7400e6b2 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/UserQueries.java @@ -0,0 +1,487 @@ +/* + * Juick + * Copyright (C) 2008-2011, Ugnich Anton + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.juick.server; + +import com.juick.User; +import com.juick.server.helpers.Auth; +import com.juick.server.helpers.EmailOpts; +import com.juick.server.helpers.UserInfo; +import com.juick.util.UserUtils; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.util.StringUtils; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.*; + +/** + * @author Ugnich Anton + */ +public class UserQueries { + + static final String ABCDEF = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public static class UserMapper implements RowMapper { + @Override + public User mapRow(ResultSet rs, int rowNum) throws SQLException { + User user = new User(); + user.setUid(rs.getInt(1)); + user.setName(rs.getString(2)); + user.setBanned(rs.getBoolean(3)); + return user; + } + } + + public static String getSignUpHashByJID(JdbcTemplate sql, String jid) { + String hash; + try { + hash = sql.queryForObject("SELECT loginhash FROM jids WHERE jid=? AND user_id IS NULL", + String.class, jid); + } catch (EmptyResultDataAccessException e) { + hash = UUID.randomUUID().toString(); + sql.update("INSERT INTO jids(jid,loginhash) VALUES (?,?)", jid, hash); + } + return hash; + } + + public static String getSignUpHashByTelegramID(JdbcTemplate sql, Long telegramId, String username) { + try { + return sql.queryForObject("SELECT loginhash FROM telegram WHERE tg_id=? AND user_id IS NULL", + String.class, telegramId); + } catch (EmptyResultDataAccessException e) { + String hash = UUID.randomUUID().toString(); + sql.update("INSERT INTO telegram(tg_id, loginhash, tg_name) VALUES (?, ?, ?)", telegramId, hash, username); + return hash; + } + } + + public static int createUser(JdbcTemplate sql, String username, String password) { + KeyHolder holder = new GeneratedKeyHolder(); + try { + sql.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; + } + + int uid = holder.getKey().intValue(); + + sql.update("INSERT INTO useroptions(user_id) VALUES (?)", uid); + sql.update("INSERT INTO subscr_users(user_id,suser_id) VALUES (2,?)", uid); + + return uid; + } + + public static Optional getUserByUID(JdbcTemplate sql, int uid) { + try { + return Optional.of(sql.queryForObject("SELECT id, nick,banned FROM users WHERE id=?", + new UserMapper(), uid)); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } + } + + public static User getUserByName(JdbcTemplate sql, String username) { + try { + return sql.queryForObject("SELECT id,nick,banned FROM users WHERE nick=?", + new UserMapper(), + username); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static User getUserByJID(JdbcTemplate sql, String jid) { + try { + return sql.queryForObject("SELECT id,nick,banned FROM users WHERE id=(SELECT user_id FROM jids WHERE jid=?)", + new UserMapper(), jid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static List getUsersByName(JdbcTemplate sql, List unames) { + if (!unames.isEmpty()) { + return sql.query("SELECT id,nick,banned FROM users WHERE nick IN (\"" + StringUtils.arrayToDelimitedString(unames.toArray(), "\",\"") + "\")", + new UserMapper()); + } + return Collections.emptyList(); + } + + public static List getUsersByID(JdbcTemplate sql, List uids) { + if (!uids.isEmpty()) { + return sql.query("SELECT id,nick,banned FROM users WHERE id IN (" + StringUtils.arrayToCommaDelimitedString(uids.toArray()) + ")", + new UserMapper()); + } + return Collections.emptyList(); + } + + public static List getUsersByJID(JdbcTemplate sql, List jids) { + if (!jids.isEmpty()) { + return sql.query("SELECT users.id,users.nick,jids.jid FROM users " + + "INNER JOIN jids ON jids.user_id=users.id " + + "WHERE jids.jid IN (\"" + StringUtils.arrayToDelimitedString(jids.toArray(), "\",\"") + "\")", + (rs, rowNum) -> { + com.juick.User user = new com.juick.User(); + user.setUid(rs.getInt(1)); + user.setName(rs.getString(2)); + user.setJID(rs.getString(3)); + return user; + }); + } + return Collections.emptyList(); + } + + public static List getJIDsbyUID(JdbcTemplate sql, int uid) { + return sql.queryForList("SELECT jid FROM jids WHERE user_id=? AND active=1", String.class, uid); + } + + public static int getUIDbyJID(JdbcTemplate sql, String jid) { + try { + return sql.queryForObject("SELECT user_id FROM jids WHERE jid=?", Integer.class, jid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public static int getUIDbyName(JdbcTemplate sql, String uname) { + try { + return sql.queryForObject("SELECT id FROM users WHERE nick=?", Integer.class, uname); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public static int getUIDbyHash(JdbcTemplate sql, String hash) { + try { + return sql.queryForObject("SELECT user_id FROM logins WHERE hash=?", Integer.class, hash); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public static com.juick.User getUserByHash(JdbcTemplate sql, String hash) { + try { + User user = sql.queryForObject("SELECT logins.user_id,users.nick, users.banned FROM logins " + + "INNER JOIN users ON logins.user_id=users.id WHERE logins.hash=?", + new UserMapper(), hash); + user.setAuthHash(hash); + return user; + } catch (EmptyResultDataAccessException e) { + return new User(); + } + } + + public static String getHashByUID(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT hash FROM logins WHERE user_id=?", String.class, uid); + } catch (EmptyResultDataAccessException e) { + String hash = UserUtils.generateHash(16); + sql.update(con -> { + PreparedStatement stmt = con.prepareStatement("INSERT INTO logins(user_id,hash) VALUES (?,?)"); + stmt.setInt(1, uid); + stmt.setString(2, hash); + return stmt; + }); + return hash; + } + } + + public static int checkPassword(JdbcTemplate sql, String username, String password) { + try { + String realPassword = sql.queryForObject("SELECT passw FROM users WHERE nick=?", String.class, username); + if (realPassword.equals(password)) { + User user = UserQueries.getUserByName(sql, username); + if (user != null) { + return user.getUid(); + } else { + return -1; + } + } else { + return -1; + } + } catch (EmptyResultDataAccessException e) { + return -1; + } + } + + public static boolean updatePassword(JdbcTemplate sql, User user, String newPassword) { + return user.getUid() > 0 && sql.update("UPDATE users SET passw=? WHERE id=?", newPassword, user.getUid()) > 0; + } + + public static String updateSecretEmail(JdbcTemplate sql, User user) { + String newHash = UserUtils.generateHash(16); + if (sql.update("INSERT INTO mail(user_id,hash) VALUES (?,?) ON DUPLICATE KEY UPDATE hash=?", user.getUid(), newHash, newHash) > 0) { + return newHash; + } + return ""; + } + + public static int getUserOptionInt(JdbcTemplate sql, int uid, String option, int defaultValue) { + try { + return sql.queryForObject("SELECT " + option + " FROM useroptions WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return defaultValue; + } + } + + public static void setUserOptionInt(JdbcTemplate sql, int uid, String option, int value) { + sql.update("UPDATE useroptions SET " + option + "=? WHERE user_id=?", value, uid); + } + + public static UserInfo getUserInfo(JdbcTemplate sql, User user) { + try { + return sql.queryForObject("SELECT fullname,country,url,descr FROM usersinfo WHERE user_id=?", ((rs, rowNum) -> { + UserInfo info = new UserInfo(); + info.setFullName(rs.getString(1)); + info.setCountry(rs.getString(2)); + info.setUrl(rs.getString(3)); + info.setDescription(rs.getString(4)); + return info; + }), user.getUid()); + } catch (EmptyResultDataAccessException e) { + return new UserInfo(); + } + } + + public static boolean updateUserInfo(JdbcTemplate sql, User user, UserInfo info) { + return sql.update("INSERT INTO usersinfo(user_id,fullname,country,url,descr) VALUES (?,?,?,?,?) " + + "ON DUPLICATE KEY UPDATE fullname=?,country=?,url=?,descr=?", user.getUid(), info.getFullName(), + info.getCountry(), info.getUrl(), info.getDescription(), info.getFullName(), + info.getCountry(), info.getUrl(), info.getDescription()) > 0; + } + + public static boolean getCanMedia(JdbcTemplate sql, int uid) { + try { + int res = sql.queryForObject("SELECT users.lastphoto-UNIX_TIMESTAMP() FROM users WHERE id=?", + Integer.class, uid); + return res < 3600; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static boolean isInWL(JdbcTemplate sql, int uid, int check) { + try { + return sql.queryForObject("SELECT 1 FROM wl_users WHERE user_id=? AND wl_user_id=?", + Integer.class, uid, check) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static boolean isInBL(JdbcTemplate sql, int uid, int check) { + try { + return sql.queryForObject("SELECT 1 FROM bl_users WHERE user_id=? AND bl_user_id=?", + Integer.class, uid, check) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static boolean isInBLAny(JdbcTemplate sql, int uid, int uid2) { + try { + return sql.queryForObject("SELECT 1 FROM bl_users " + + "WHERE (user_id=? AND bl_user_id=?) " + + "OR (user_id=? AND bl_user_id=?)", new Object[]{uid, uid2, uid2, uid}, Integer.class) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static List checkBL(JdbcTemplate sql, int visitor, List uids) { + if (!uids.isEmpty()) { + return sql.queryForList("SELECT user_id FROM bl_users WHERE bl_user_id=? and user_id IN (" + + StringUtils.collectionToCommaDelimitedString(uids) + ")", Integer.class, visitor); + } else { + return new ArrayList<>(); + } + } + + public static boolean isSubscribed(JdbcTemplate sql, int uid, int check) { + try { + return sql.queryForObject("SELECT 1 FROM subscr_users WHERE suser_id=? AND user_id=?", + Integer.class, uid, check) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public static List getUserRead(JdbcTemplate sql, int uid) { + return sql.queryForList("SELECT user_id FROM subscr_users WHERE suser_id=?", Integer.class, uid); + } + + public static List getUserReadLeastPopular(JdbcTemplate sql, int uid, int cnt) { + return sql.query("SELECT users.id,users.nick FROM (subscr_users " + + "INNER JOIN users_subscr ON (subscr_users.suser_id=? " + + "AND subscr_users.user_id=users_subscr.user_id)) INNER JOIN users " + + "ON subscr_users.user_id=users.id ORDER BY cnt LIMIT ?", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, uid, cnt); + } + + public static List getUserReaders(JdbcTemplate sql, int uid) { + return sql.query("SELECT users.id, users.nick FROM subscr_users " + + "INNER JOIN users ON subscr_users.suser_id=users.id " + + "WHERE subscr_users.user_id=? ORDER BY users.nick", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, uid); + } + + public static List getUserFriends(JdbcTemplate sql, int uid) { + return sql.query("SELECT users.id,users.nick FROM subscr_users " + + "INNER JOIN users ON subscr_users.user_id=users.id " + + "WHERE subscr_users.suser_id=? AND users.id!=? " + + "ORDER BY users.nick", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, uid, uid); + } + + public static List getUserBLUsers(JdbcTemplate sql, int uid) { + return sql.query("SELECT users.id,users.nick FROM users INNER JOIN bl_users " + + "ON(bl_users.bl_user_id=users.id) WHERE bl_users.user_id=? ORDER BY users.nick", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, uid); + } + + public static boolean linkTwitterAccount(JdbcTemplate sql, User user, String accessToken, + String accessTokenSecret, String screenName) { + if (sql.update("INSERT INTO twitter(user_id,access_token,access_token_secret,uname) " + + "VALUES (?,?,?,?)" + + " ON DUPLICATE KEY UPDATE access_token=?,access_token_secret=?,uname=?", + user.getUid(), accessToken, accessTokenSecret, screenName, accessToken, accessTokenSecret, screenName) > 0) { + return sql.update("INSERT INTO subscr_users(user_id,suser_id,jid) " + + "VALUES (?,1741,'juick\\@twitter.juick.com')", user.getUid()) > 0; + } + return false; + + } + + public static int getStatsIRead(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT COUNT(*) FROM subscr_users WHERE suser_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public static int getStatsMyReaders(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT COUNT(*) FROM subscr_users WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public static int getStatsMessages(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT COUNT(*) FROM messages WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public static int getStatsReplies(JdbcTemplate sql, int uid) { + try { + return sql.queryForObject("SELECT COUNT(*) FROM replies WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + public enum ActiveStatus { + Inactive, + Active + } + + public static boolean setActiveStatusForJID(JdbcTemplate sql, String JID, ActiveStatus jidStatus) { + User user = getUserByJID(sql, JID); + if (user != null) { + return sql.update(con -> { + PreparedStatement preparedStatement = con.prepareStatement( + "UPDATE jids SET active=? WHERE user_id=? AND jid=?"); + int newStatus = jidStatus == ActiveStatus.Active ? 1 : 0; + preparedStatement.setInt(1, newStatus); + preparedStatement.setInt(2, user.getUid()); + preparedStatement.setString(3, JID); + return preparedStatement; + + }) >= 0; + } + return false; + } + + public static List getAllJIDs(JdbcTemplate sql, User user) { + return sql.queryForList("SELECT jid FROM jids WHERE user_id=?", String.class, user.getUid()); + } + + public static List getAuthCodes(JdbcTemplate sql, User user) { + return sql.query("SELECT account,authcode FROM auth WHERE user_id=? AND protocol='xmpp'", + (rs, num) -> new Auth(rs.getString(1), rs.getString(2)), user.getUid()); + } + + public static List getEmails(JdbcTemplate sql, User user) { + return sql.queryForList("SELECT email FROM emails WHERE user_id=?", String.class, user.getUid()); + } + + public static EmailOpts getEmailOpts(JdbcTemplate sql, User user) { + try { + return sql.queryForObject("SELECT email,subscr_hour FROM emails WHERE user_id=? AND subscr_hour IS NOT NULL", + (rs, num) -> new EmailOpts(rs.getString(1), rs.getInt(2)), user.getUid()); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + public static String getEmailHash(JdbcTemplate sql, User user) { + try { + return sql.queryForObject("SELECT hash FROM mail WHERE user_id=?", String.class, user.getUid()) + + "@mail.juick.com"; + } catch (EmptyResultDataAccessException e) { + return ""; + } + } +} diff --git a/juick-server/src/main/java/com/juick/server/helpers/ApplicationStatus.java b/juick-server/src/main/java/com/juick/server/helpers/ApplicationStatus.java new file mode 100644 index 00000000..61109c47 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/ApplicationStatus.java @@ -0,0 +1,35 @@ +package com.juick.server.helpers; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * Created by vt on 03/09/16. + */ +public class ApplicationStatus { + private boolean connected; + private boolean crosspostEnabled; + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("connected", connected) + .append("crosspostEnabled", crosspostEnabled) + .toString(); + } + + public boolean isConnected() { + return connected; + } + + public void setConnected(boolean connected) { + this.connected = connected; + } + + public boolean isCrosspostEnabled() { + return crosspostEnabled; + } + + public void setCrosspostEnabled(boolean crosspostEnabled) { + this.crosspostEnabled = crosspostEnabled; + } +} diff --git a/juick-server/src/main/java/com/juick/server/helpers/Auth.java b/juick-server/src/main/java/com/juick/server/helpers/Auth.java new file mode 100644 index 00000000..3e1f0bd9 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/Auth.java @@ -0,0 +1,22 @@ +package com.juick.server.helpers; + +/** + * Created by vt on 09/02/16. + */ +public class Auth { + private String account; + private String authCode; + + public Auth(String account, String authCode) { + this.account = account; + this.authCode = authCode; + } + + public String getAccount() { + return account; + } + + public String getAuthCode() { + return authCode; + } +} \ No newline at end of file diff --git a/juick-server/src/main/java/com/juick/server/helpers/EmailOpts.java b/juick-server/src/main/java/com/juick/server/helpers/EmailOpts.java new file mode 100644 index 00000000..679d1a8d --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/EmailOpts.java @@ -0,0 +1,24 @@ +package com.juick.server.helpers; + +import org.apache.commons.lang3.StringUtils; + +/** + * Created by vitalyster on 09.02.2016. + */ +public class EmailOpts { + private String email; + private String subscriptionHour; + + public EmailOpts(String email, int subscriptionHour) { + this.email = email; + this.subscriptionHour = StringUtils.leftPad(String.format("%d", subscriptionHour), 2, "0"); + } + + public String getSubscriptionHour() { + return subscriptionHour; + } + + public String getEmail() { + return email; + } +} \ No newline at end of file diff --git a/juick-server/src/main/java/com/juick/server/helpers/NotifyOpts.java b/juick-server/src/main/java/com/juick/server/helpers/NotifyOpts.java new file mode 100644 index 00000000..377b0a50 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/NotifyOpts.java @@ -0,0 +1,34 @@ +package com.juick.server.helpers; + +/** + * Created by vt on 03/09/16. + */ +public class NotifyOpts { + private boolean repliesEnabled; + private boolean subscriptionsEnabled; + private boolean recommendationsEnabled; + + public boolean isRepliesEnabled() { + return repliesEnabled; + } + + public void setRepliesEnabled(boolean repliesEnabled) { + this.repliesEnabled = repliesEnabled; + } + + public boolean isSubscriptionsEnabled() { + return subscriptionsEnabled; + } + + public void setSubscriptionsEnabled(boolean subscriptionsEnabled) { + this.subscriptionsEnabled = subscriptionsEnabled; + } + + public boolean isRecommendationsEnabled() { + return recommendationsEnabled; + } + + public void setRecommendationsEnabled(boolean recommendationsEnabled) { + this.recommendationsEnabled = recommendationsEnabled; + } +} diff --git a/juick-server/src/main/java/com/juick/server/helpers/PrivacyOpts.java b/juick-server/src/main/java/com/juick/server/helpers/PrivacyOpts.java new file mode 100644 index 00000000..66cf9410 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/PrivacyOpts.java @@ -0,0 +1,29 @@ +package com.juick.server.helpers; + +/** + * Created by vt on 16/01/16. + */ +public class PrivacyOpts { + private int uid; + private int privacy; + + public PrivacyOpts() { + + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getPrivacy() { + return privacy; + } + + public void setPrivacy(int privacy) { + this.privacy = privacy; + } +} diff --git a/juick-server/src/main/java/com/juick/server/helpers/Status.java b/juick-server/src/main/java/com/juick/server/helpers/Status.java new file mode 100644 index 00000000..f68baae5 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/Status.java @@ -0,0 +1,19 @@ +package com.juick.server.helpers; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Created by vitalyster on 25.07.2016. + */ +public class Status { + private String value; + + public Status(String value) { + this.value = value; + } + + @JsonProperty("status") + public String getValue() { + return value; + } +} diff --git a/juick-server/src/main/java/com/juick/server/helpers/UserInfo.java b/juick-server/src/main/java/com/juick/server/helpers/UserInfo.java new file mode 100644 index 00000000..5a4b6894 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/helpers/UserInfo.java @@ -0,0 +1,43 @@ +package com.juick.server.helpers; + +/** + * Created by vt on 03/09/16. + */ +public class UserInfo { + private String fullName; + private String country; + private String url; + private String description; + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java b/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java new file mode 100644 index 00000000..6fa3790e --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/protocol/JuickProtocol.java @@ -0,0 +1,458 @@ +package com.juick.server.protocol; + +import com.juick.Message; +import com.juick.Tag; +import com.juick.User; +import com.juick.formatters.PlainTextFormatter; +import com.juick.json.MessageSerializer; +import com.juick.server.*; +import com.juick.server.protocol.annotation.UserCommand; +import com.juick.util.TagUtils; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * Created by oxpa on 22.03.16. + */ + +public class JuickProtocol { + MessageSerializer json = new MessageSerializer(); + JdbcTemplate sql; + String baseUri; + + public JuickProtocol(JdbcTemplate sql, String baseUri) { + this.sql = sql; + this.baseUri = baseUri; + } + + /** + * find command by pattern and invoke + * @param user who send command + * @param userInput given by user + * @return command result + * @throws InvocationTargetException + * @throws IllegalAccessException + * @throws NoSuchMethodException + */ + public ProtocolReply getReply(User user, String userInput) throws InvocationTargetException, + IllegalAccessException, NoSuchMethodException { + Optional cmd = Arrays.stream(getClass().getDeclaredMethods()) + .filter(m -> m.isAnnotationPresent(UserCommand.class)) + .filter(m -> Pattern.compile(m.getAnnotation(UserCommand.class).pattern(), + m.getAnnotation(UserCommand.class).patternFlags()).matcher(userInput).matches()) + .findFirst(); + if (!cmd.isPresent()) { + // default command - post as new message + return postMessage(user, userInput); + } else { + Matcher matcher = Pattern.compile(cmd.get().getAnnotation(UserCommand.class).pattern(), + cmd.get().getAnnotation(UserCommand.class).patternFlags()).matcher(userInput); + List groups = new ArrayList<>(); + while (matcher.find()) { + for (int i = 1; i <= matcher.groupCount(); i++) { + groups.add(matcher.group(i)); + } + } + return (ProtocolReply) getClass().getMethod(cmd.get().getName(), User.class, String[].class) + .invoke(this, user, groups.toArray(new String[groups.size()])); + } + } + + public ProtocolReply postMessage(User user, String input) { + List tags = TagQueries.fromString(sql, input, false); + String body = input.substring(TagUtils.toString(tags).length()); + int mid = MessagesQueries.createMessage(sql, user.getUid(), body, null, tags); + SubscriptionsQueries.subscribeMessage(sql, mid, user.getUid()); + //app.events().publishEvent(new JuickMessageEvent(app.messages().getMessage(mid))); + return new ProtocolReply("New message posted.\n#" + mid + " " + baseUri + mid, + Optional.of(json.serializeList(Collections.singletonList(MessagesQueries.getMessage(sql, mid))))); + } + + @UserCommand(pattern = "^#(\\++)$", help = "#+ - Show last Juick messages (#++ - second page, ...)") + public ProtocolReply commandLast(User user, String... arguments) { + // number of + is the page count + int page = arguments[0].length() - 1; + List mids = MessagesQueries.getAll(sql, user.getUid(), page); + List messages = MessagesQueries.getMessages(sql, mids); + return new ProtocolReply("Last messages: \n" + String.join("\n", messages.stream().map(PlainTextFormatter::formatPost) + .collect(Collectors.toList())), Optional.of(json.serializeList(messages))); + } + + @UserCommand(pattern = "^\\s*bl\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "BL - Show your blacklist") + public ProtocolReply commandBL(User user_from, String... arguments) { + List blusers; + List bltags; + + blusers = UserQueries.getUserBLUsers(sql, user_from.getUid()); + bltags = TagQueries.getUserBLTags(sql, user_from.getUid()); + + + String txt = ""; + if (bltags.size() > 0) { + for (String bltag : bltags) { + txt += "*" + bltag + "\n"; + } + + if (blusers.size() > 0) { + txt += "\n"; + } + } + if (blusers.size() > 0) { + for (User bluser : blusers) { + txt += "@" + bluser.getName() + "\n"; + } + } + if (txt.isEmpty()) { + txt = "You don't have any users or tags in your blacklist."; + } + return new ProtocolReply(txt, Optional.empty()); + } + + @UserCommand(pattern = "^bl\\s+@([^\\s\\n\\+]+)", patternFlags = Pattern.CASE_INSENSITIVE, + help = "BL @username - add @username to your blacklist") + public ProtocolReply blacklistUser(User from, String... arguments) { + User blUser = UserQueries.getUserByName(sql, arguments[0]); + if (blUser != null) { + PrivacyQueries.PrivacyResult result = PrivacyQueries.blacklistUser(sql, from, blUser); + if (result == PrivacyQueries.PrivacyResult.Added) { + return new ProtocolReply("User added to your blacklist", Optional.empty()); + } else { + return new ProtocolReply("User removed from your blacklist", Optional.empty()); + } + } + return new ProtocolReply("User not found", Optional.empty()); + } + + @UserCommand(pattern = "^bl\\s\\*(\\S+)$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "BL *tag - add *tag to your blacklist") + public ProtocolReply blacklistTag(User from, String... arguments) { + User blUser = UserQueries.getUserByName(sql, arguments[0]); + if (blUser != null) { + Tag tag = TagQueries.getTag(sql, arguments[0], false); + if (tag != null) { + PrivacyQueries.PrivacyResult result = PrivacyQueries.blacklistTag(sql, from, tag); + if (result == PrivacyQueries.PrivacyResult.Added) { + return new ProtocolReply("Tag added to your blacklist", Optional.empty()); + } else { + return new ProtocolReply("Tag removed from your blacklist", Optional.empty()); + } + } + } + return new ProtocolReply("Tag not found", Optional.empty()); + } + + @UserCommand(pattern = "@", help = "@ - Show recommendations and popular personal blogs") + public ProtocolReply commandUsers(User currentUser, String... args) { + StringBuilder msg = new StringBuilder(); + msg.append("Recommended blogs"); + List recommendedUsers = ShowQueries.getRecommendedUsers(sql, currentUser); + if (recommendedUsers.size() > 0) { + for (String user : recommendedUsers) { + msg.append("\n@").append(user); + } + } else { + msg.append("\nNo recommendations now. Subscribe to more blogs. ;)"); + } + msg.append("\n\nTop 10 personal blogs:"); + List topUsers = ShowQueries.getTopUsers(sql); + if (topUsers.size() > 0) { + for (String user : topUsers) { + msg.append("\n@").append(user); + } + } else { + msg.append("\nNo top users. Empty DB? ;)"); + } + return new ProtocolReply(msg.toString(), Optional.empty()); + } + + @UserCommand(pattern = "\\*", help = "* - Show your tags") + public ProtocolReply commandTags(User currentUser, String... args) { + List tags = TagQueries.getUserTagsAll(sql, currentUser.getUid()); + String msg = "Your tags: (tag - messages)\n" + + tags.stream() + .map(t -> String.format("\n*%s - %d", t.getName(), t.UsageCnt)).collect(Collectors.joining()); + return new ProtocolReply(msg, Optional.empty()); + } + + @UserCommand(pattern = "!", help = "! - Show your favorite messages") + public ProtocolReply commandFavorites(User currentUser, String... args) { + List mids = MessagesQueries.getUserRecommendations(sql, currentUser.getUid(), 0); + if (mids.size() > 0) { + List messages = MessagesQueries.getMessages(sql, mids); + return new ProtocolReply("Favorite messages: \n" + String.join("\n", messages.stream().map(PlainTextFormatter::formatPost) + .collect(Collectors.toList())), Optional.of(json.serializeList(messages))); + } + return new ProtocolReply("No favorite messages, try to \"like\" something ;)", Optional.empty()); + } + + @UserCommand(pattern = "^\\@([^\\s\\n\\+]+)(\\+?)$", + help = "@username+ - Show user's info and last 10 messages (@username++ - second page, ..)") + public ProtocolReply commandUser(User user, String... arguments) { + User blogUser = UserQueries.getUserByName(sql, arguments[0]); + int page = arguments[1].length(); + if (blogUser != null) { + List mids = MessagesQueries.getUserBlog(sql, blogUser.getUid(), 0, page); + List messages = MessagesQueries.getMessages(sql, mids); + return new ProtocolReply(String.format("Last messages from @%s:\n%s", arguments[0], + String.join("\n", messages.stream() + .map(Object::toString).collect(Collectors.toList()))), + Optional.of(json.serializeList(messages))); + } + return new ProtocolReply("User not found", Optional.empty()); + } + + @UserCommand(pattern = "^\\s*d\\s*\\#([0-9]+)\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "D #12345 - delete the message") + public ProtocolReply commandDel(User user, String... args) { + try { + int mid = Integer.parseInt(args[0]); + if (MessagesQueries.deleteMessage(sql, user.getUid(), mid)) { + return new ProtocolReply(String.format("Message %s deleted", mid), Optional.empty()); + } + } catch (NumberFormatException e) { + return new ProtocolReply("Error", Optional.empty()); + } + return new ProtocolReply("Error", Optional.empty()); + } + + @UserCommand(pattern = "^\\s*login\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "LOGIN - log in to Juick website") + public ProtocolReply commandLogin(User user, String... arguments) { + return new ProtocolReply(baseUri + "?" + UserQueries.getHashByUID(sql, user.getUid()), + Optional.empty()); + } + + @UserCommand(pattern = "^(#+)$", help = "# - Show last messages from your feed (## - second page, ...)") + public ProtocolReply commandMyFeed(User user, String... arguments) { + // number of # is the page count + int page = arguments[0].length() - 1; + List mids = MessagesQueries.getMyFeed(sql, user.getUid(), page); + List messages = MessagesQueries.getMessages(sql, mids); + // TODO: add instructions for empty feed + return new ProtocolReply("Your feed: \n" + String.join("\n", + messages.stream().map(PlainTextFormatter::formatPost).collect(Collectors.toList())), + Optional.of(json.serializeList(messages))); + } + + @UserCommand(pattern = "^\\s*(on|off)\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "ON/OFF - Enable/disable subscriptions delivery") + public ProtocolReply commandOnOff(User user, String[] input) { + UserQueries.ActiveStatus newStatus; + String retValUpdated; + if (input[0].toLowerCase().equals("on")) { + newStatus = UserQueries.ActiveStatus.Active; + retValUpdated = "Notifications are activated for " + user.getJID(); + } else { + newStatus = UserQueries.ActiveStatus.Inactive; + retValUpdated = "Notifications are disabled for " + user.getJID(); + } + + if (UserQueries.setActiveStatusForJID(sql, user.getJID(), newStatus)) { + return new ProtocolReply(retValUpdated, Optional.empty()); + } else { + return new ProtocolReply(String.format("Subscriptions status for %s was not changed", user.getJID()), + Optional.empty()); + } + } + + @UserCommand(pattern = "^\\s*ping\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "PING - returns you a PONG") + public ProtocolReply commandPing(User user, String[] input) { + return new ProtocolReply("PONG", Optional.empty()); + } + + @UserCommand(pattern = "^\\@(\\S+)\\s+([\\s\\S]+)$", help = "@username message - send PM to username") + public ProtocolReply commandPM(User user_from, String... arguments) { + String user_to = arguments[0]; + String body = arguments[1]; + int ret = 0; + + int uid_to = 0; + String jid_to = null; + boolean haveInRoster = false; + + if (user_to.indexOf('@') > 0) { + uid_to = UserQueries.getUIDbyJID(sql, user_to); + } else { + uid_to = UserQueries.getUIDbyName(sql, user_to); + } + + if (uid_to > 0) { + if (!UserQueries.isInBLAny(sql, uid_to, user_from.getUid())) { + if (PMQueries.createPM(sql, user_from.getUid(), uid_to, body)) { + //jid_to = UserQueries.getJIDsbyUID(sql, uid_to); + if (jid_to != null) { + haveInRoster = PMQueries.havePMinRoster(sql, user_from.getUid(), jid_to); + } + ret = 200; + } else { + ret = 500; + } + } else { + ret = 403; + } + } else { + ret = 404; + } + + + if (ret == 200) { + Message jmsg = new Message(); + jmsg.setUser(user_from); + jmsg.setText(body); + // TODO: add PM payload + //app.events().publishEvent(new JuickMessageEvent(jmsg)); + /* TODO: move to XMPP component + if (jid_to != null) { + Message mm = new Message(); + mm.to = new JID(jid_to); + mm.type = Message.Type.chat; + if (haveInRoster) { + mm.from = new JID(user_from.getName(), getDomain(), "Juick"); + mm.body = body; + } else { + mm.from = new JID("juick", getDomain(), "Juick"); + mm.body = "Private message from @" + user_from.getName() + ":\n" + body; + } + return Collections.singletonList(mm); + } + */ + } + if (ret == 200) { + return new ProtocolReply("Private message sent", Optional.empty()); + } else { + return new ProtocolReply("Error " + ret, Optional.empty()); + } + } + + @UserCommand(pattern = "^#(\\d+)(\\+?)$", help = "#1234 - Show message (#1234+ - message with replies)") + public ProtocolReply commandShow(User user, String... arguments) { + boolean showReplies = arguments[1].length() > 0; + int mid; + try { + mid = Integer.parseInt(arguments[0]); + } catch (NumberFormatException e) { + return new ProtocolReply("Error", Optional.empty()); + } + Message msg = MessagesQueries.getMessage(sql, mid); + if (msg != null) { + if (showReplies) { + List replies = MessagesQueries.getReplies(sql, mid); + replies.add(0, msg); + return new ProtocolReply(String.join("\n", + replies.stream().map(PlainTextFormatter::formatPost).collect(Collectors.toList())), + Optional.of(json.serializeList(replies))); + } + return new ProtocolReply(PlainTextFormatter.formatPost(msg), Optional.of(json.serializeList(Collections.singletonList(msg)))); + } + return new ProtocolReply("Message not found", Optional.empty()); + } + @UserCommand(pattern = "^(#|\\.)(\\d+)((\\.|\\-|\\/)(\\d+))?\\s([\\s\\S]+)", + help = "#1234 *tag *tag2 - edit tags\n#1234 text - reply to message") + public ProtocolReply EditOrReply(User user, String... args) { + int mid; + try { + mid = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + return new ProtocolReply("Error", Optional.empty()); + } + int rid; + try { + rid = Integer.parseInt(args[4]); + } catch (NumberFormatException e) { + rid = 0; + } + String txt = args[5]; + List messageTags = TagQueries.fromString(sql, txt, true); + if (messageTags.size() > 0) { + if (user.getUid() != MessagesQueries.getMessageAuthor(sql, mid).getUid()) { + return new ProtocolReply("It is not your message", Optional.empty()); + } + TagQueries.updateTags(sql, mid, messageTags); + return new ProtocolReply("Tags are updated", Optional.empty()); + } else { + int newrid = MessagesQueries.createReply(sql, mid, rid, user.getUid(), txt, null); + return new ProtocolReply("Reply posted.\n#" + mid + "/" + newrid + " " + + baseUri + mid + "/" + newrid, + Optional.of(json.serializeList(Collections.singletonList(MessagesQueries.getReply(sql, mid, newrid))))); + } + } + + @UserCommand(pattern = "^(s|u)\\s+#(\\d+)$", help = "S #1234 - subscribe to comments", + patternFlags = Pattern.CASE_INSENSITIVE) + public ProtocolReply commandSubscribeMessage(User user, String... args) { + boolean subscribe = args[0].equalsIgnoreCase("s"); + int mid; + try { + mid = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + return new ProtocolReply("Error", Optional.empty()); + } + if (subscribe) { + if (SubscriptionsQueries.subscribeMessage(sql, mid, user.getUid())) { + return new ProtocolReply("Subscribed", Optional.empty()); + } + } else { + if (SubscriptionsQueries.unSubscribeMessage(sql, mid, user.getUid())) { + return new ProtocolReply("Unsubscribed from #" + mid, Optional.empty()); + } + return new ProtocolReply("You was not subscribed to #" + mid, Optional.empty()); + } + return new ProtocolReply("Error", Optional.empty()); + } + @UserCommand(pattern = "^(s|u)\\s+\\@(\\S+)$", help = "S @user - subscribe to user's posts", + patternFlags = Pattern.CASE_INSENSITIVE) + public ProtocolReply commandSubscribeUser(User user, String... args) { + boolean subscribe = args[0].equalsIgnoreCase("s"); + User toUser = UserQueries.getUserByName(sql, args[1]); + if (toUser.getUid() > 0) { + if (subscribe) { + if (SubscriptionsQueries.subscribeUser(sql, user, toUser)) { + return new ProtocolReply("Subscribed", Optional.empty()); + // TODO: notification + // TODO: already subscribed case + } + } else { + if (SubscriptionsQueries.unSubscribeUser(sql, user, toUser)) { + return new ProtocolReply("Unsubscribed from @" + toUser.getName(), Optional.empty()); + } + return new ProtocolReply("You was not subscribed to @" + toUser.getName(), Optional.empty()); + } + } + return new ProtocolReply("Error", Optional.empty()); + } + @UserCommand(pattern = "^(s|u)\\s+\\*(\\S+)$", help = "S *tag - subscribe to tag" + + "\nU *tag - unsubscribe from tag", patternFlags = Pattern.CASE_INSENSITIVE) + public ProtocolReply commandSubscribeTag(User user, String... args) { + boolean subscribe = args[0].equalsIgnoreCase("s"); + Tag tag = TagQueries.getTag(sql, args[1], true); + if (subscribe) { + if (SubscriptionsQueries.subscribeTag(sql, user, tag)) { + return new ProtocolReply("Subscribed", Optional.empty()); + } + } else { + if (SubscriptionsQueries.unSubscribeTag(sql, user, tag)) { + return new ProtocolReply("Unsubscribed from " + tag.getName(), Optional.empty()); + } + return new ProtocolReply("You was not subscribed to " + tag.getName(), Optional.empty()); + } + return new ProtocolReply("Error", Optional.empty()); + } + + @UserCommand(pattern = "^\\s*help\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, + help = "HELP - returns this help message") + public ProtocolReply commandHelp(User user, String[] input) { + List commandsHelp = Arrays.stream(getClass().getDeclaredMethods()) + .filter(m -> m.isAnnotationPresent(UserCommand.class)) + .map(m -> m.getAnnotation(UserCommand.class).help()) + .collect(Collectors.toList()); + return new ProtocolReply(String.join("\n", commandsHelp), Optional.empty()); + } +} diff --git a/juick-server/src/main/java/com/juick/server/protocol/ProtocolReply.java b/juick-server/src/main/java/com/juick/server/protocol/ProtocolReply.java new file mode 100644 index 00000000..d9d36a5d --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/protocol/ProtocolReply.java @@ -0,0 +1,23 @@ +package com.juick.server.protocol; + +import java.util.Optional; + +/** + * Created by vitalyster on 08.04.2016. + */ +public class ProtocolReply { + + private Optional json; + private String description; + + public ProtocolReply(String text, Optional json) { + this.description = text; + this.json = json; + } + public String getDescription() { + return description; + } + public Optional getJson() { + return json; + } +} diff --git a/juick-server/src/main/java/com/juick/server/protocol/annotation/UserCommand.java b/juick-server/src/main/java/com/juick/server/protocol/annotation/UserCommand.java new file mode 100644 index 00000000..af7c4924 --- /dev/null +++ b/juick-server/src/main/java/com/juick/server/protocol/annotation/UserCommand.java @@ -0,0 +1,31 @@ +package com.juick.server.protocol.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by oxpa on 22.03.16. + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserCommand { + /** + * + * @return a command pattern + */ + String pattern() default ""; + + /** + * + * @return pattern flags + */ + int patternFlags() default 0; + + /** + * + * @return a string used in HELP command output. Basically, only 1 string + */ + String help() default ""; +} diff --git a/juick-server/src/main/java/com/juick/service/AdsService.java b/juick-server/src/main/java/com/juick/service/AdsService.java new file mode 100644 index 00000000..f8a0f5cf --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/AdsService.java @@ -0,0 +1,11 @@ +package com.juick.service; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface AdsService { + + int getAdMid(int uid); + + int logAdMid(int uid, int mid); +} diff --git a/juick-server/src/main/java/com/juick/service/AdsServiceImpl.java b/juick-server/src/main/java/com/juick/service/AdsServiceImpl.java new file mode 100644 index 00000000..a6a5c85d --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/AdsServiceImpl.java @@ -0,0 +1,51 @@ +package com.juick.service; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.Transactional; + +import javax.inject.Inject; +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +@Transactional +public class AdsServiceImpl extends BaseJdbcService implements AdsService { + + @Inject + public AdsServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Transactional(readOnly = true) + @Override + public int getAdMid(final int uid) { + List list; + + if (uid > 0) + list = getJdbcTemplate().queryForList( + "SELECT message_id FROM ads_messages " + + "WHERE message_id NOT IN (SELECT message_id FROM ads_messages_log WHERE user_id = ? " + + "AND ts > UNIX_TIMESTAMP() - 60*60*24 GROUP BY message_id HAVING COUNT(*) > 2) ORDER BY RAND() LIMIT 1", + Integer.class, + uid); + + else + list = getJdbcTemplate().queryForList( + "SELECT message_id FROM ads_messages ORDER BY RAND() LIMIT 1", + Integer.class); + + return list.isEmpty() ? + 0 : list.get(0); + } + + @Override + public int logAdMid(final int uid, final int mid) { + return getJdbcTemplate().update( + "INSERT INTO ads_messages_log(user_id, message_id, ts) VALUES (?, ?, UNIX_TIMESTAMP())", + uid, mid); + } +} diff --git a/juick-server/src/main/java/com/juick/service/BaseJdbcService.java b/juick-server/src/main/java/com/juick/service/BaseJdbcService.java new file mode 100644 index 00000000..fe544efe --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/BaseJdbcService.java @@ -0,0 +1,55 @@ +package com.juick.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.util.Assert; + +import javax.sql.DataSource; + +/** + * Created by aalexeev on 11/13/16. + */ +public abstract class BaseJdbcService { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + private final JdbcTemplate jdbcTemplate; + private final TransactionTemplate transactionTemplate; + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + + protected BaseJdbcService(JdbcTemplate jdbcTemplate, PlatformTransactionManager transactionManager) { + Assert.notNull(jdbcTemplate); + + this.jdbcTemplate = jdbcTemplate; + this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); + this.transactionTemplate = (transactionManager == null) ? + null : new TransactionTemplate(transactionManager); + + } + + protected BaseJdbcService(DataSource dataSource, PlatformTransactionManager transactionManager) { + Assert.notNull(dataSource); + + this.jdbcTemplate = new JdbcTemplate(dataSource); + this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); + this.transactionTemplate = (transactionManager == null) ? + null : new TransactionTemplate(transactionManager); + + } + + protected JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + protected NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() { + return namedParameterJdbcTemplate; + } + + protected TransactionTemplate getTransactionTemplate() { + return transactionTemplate; + } +} diff --git a/juick-server/src/main/java/com/juick/service/CrosspostService.java b/juick-server/src/main/java/com/juick/service/CrosspostService.java new file mode 100644 index 00000000..88821b60 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/CrosspostService.java @@ -0,0 +1,24 @@ +package com.juick.service; + +import com.juick.server.helpers.ApplicationStatus; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.Optional; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface CrosspostService { + + Optional> getTwitterTokens(int uid); + + Optional getFacebookToken(int uid); + + ApplicationStatus getFbCrossPostStatus(int uid); + + String getTwitterName(int uid); + + String getTelegramName(int uid); + + Optional> getVkTokens(int uid); +} diff --git a/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java b/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java new file mode 100644 index 00000000..ed1cd676 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/CrosspostServiceImpl.java @@ -0,0 +1,96 @@ +package com.juick.service; + +import com.juick.server.helpers.ApplicationStatus; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.inject.Inject; +import java.util.List; +import java.util.Optional; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +@Transactional(readOnly = true) +public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostService { + + @Inject + public CrosspostServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Override + public Optional> getTwitterTokens(final int uid) { + List>> list = getJdbcTemplate().query( + "SELECT access_token,access_token_secret FROM twitter WHERE user_id = ? AND crosspost = 1", + (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), + uid); + + return list.isEmpty() ? + Optional.empty() : list.get(0); + } + + @Override + public Optional getFacebookToken(final int uid) { + List list = getJdbcTemplate().queryForList( + "SELECT access_token FROM facebook WHERE user_id = ? AND access_token IS NOT NULL AND crosspost = 1", + String.class, + uid); + return list.isEmpty() ? + Optional.empty() : Optional.of(list.get(0)); + } + + @Override + public ApplicationStatus getFbCrossPostStatus(final int uid) { + List list = getJdbcTemplate().query( + "SELECT 1, crosspost FROM facebook WHERE user_id = ? LIMIT 1", + (rs, num) -> { + ApplicationStatus status = new ApplicationStatus(); + + status.setConnected(rs.getInt(1) > 0); + status.setCrosspostEnabled(rs.getBoolean(2)); + + return status; + }, + uid); + + return list.isEmpty() ? + new ApplicationStatus() : list.get(0); + } + + @Override + public String getTwitterName(final int uid) { + List list = getJdbcTemplate().queryForList( + "SELECT uname FROM twitter WHERE user_id = ?", + String.class, + uid); + + return list.isEmpty() ? + "" : list.get(0); + } + + @Override + public String getTelegramName(final int uid) { + List list = getJdbcTemplate().queryForList( + "SELECT tg_name FROM telegram WHERE user_id = ?", + String.class, + uid); + + return list.isEmpty() ? + "" : list.get(0); + } + + @Override + public Optional> getVkTokens(final int uid) { + 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); + + return list.isEmpty() ? + Optional.empty() : list.get(0); + } +} diff --git a/juick-server/src/main/java/com/juick/service/MessagesService.java b/juick-server/src/main/java/com/juick/service/MessagesService.java new file mode 100644 index 00000000..00f97b75 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/MessagesService.java @@ -0,0 +1,81 @@ +package com.juick.service; + +import com.juick.User; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface MessagesService { + int createMessage(int uid, String txt, String attachment, List tags); + + int createReply(int mid, int rid, int uid, String txt, String attachment); + + int getReplyIDIncrement(int mid); + + boolean recommendMessage(int mid, int vuid); + + boolean canViewThread(int mid, int uid); + + boolean isReadOnly(int mid); + + boolean isSubscribed(int uid, int mid); + + int getMessagePrivacy(int mid); + + com.juick.Message getMessage(int mid); + + com.juick.Message getReply(int mid, int rid); + + User getMessageAuthor(int mid); + + List getMessageTags(int mid); + + List getMessageTagsIDs(int mid); + + List getMessageRecommendations(int mid); + + List getAll(int visitor_uid, int before); + + List getTag(int tid, int visitor_uid, int before, int cnt); + + List getTags(String tids, int visitor_uid, int before, int cnt); + + List getPlace(int place_id, int visitor_uid, int before); + + List getMyFeed(int uid, int before); + + List getPrivate(int uid, int before); + + List getDiscussions(int uid, int before); + + List getRecommended(int uid, int before); + + List getPopular(int visitor_uid, int before); + + List getPhotos(int visitor_uid, int before); + + List getSearch(JdbcTemplate sqlSearch, String search, int before); + + List getUserBlog(int UID, int privacy, int before); + + List getUserTag(int UID, int TID, int privacy, int before); + + List getUserRecommendations(int UID, int before); + + List getUserPhotos(int UID, int privacy, int before); + + List getUserSearch(JdbcTemplate sqlSearch, int UID, String search, int privacy, int before); + + List getMessages(List mids); + + List getReplies(int mid); + + boolean setMessagePopular(int mid, int popular); + + boolean setMessagePrivacy(int mid); + + boolean deleteMessage(int uid, int mid); +} diff --git a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java new file mode 100644 index 00000000..bb030ed4 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java @@ -0,0 +1,857 @@ +package com.juick.service; + +import com.juick.Message; +import com.juick.Tag; +import com.juick.User; +import com.juick.server.helpers.PrivacyOpts; +import com.juick.util.MessageUtils; +import org.apache.commons.lang3.StringEscapeUtils; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.dao.IncorrectResultSizeDataAccessException; +import org.springframework.jdbc.core.ConnectionCallback; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +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.util.Assert; +import org.springframework.util.StringUtils; + +import javax.inject.Inject; +import java.sql.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +public class MessagesServiceImpl extends BaseJdbcService implements MessagesService { + private final UserService userService; + + @Inject + public MessagesServiceImpl(JdbcTemplate jdbcTemplate, UserService userService) { + super(jdbcTemplate, null); + + Assert.notNull(userService); + this.userService = userService; + } + + private class MessageMapper implements RowMapper { + @Override + public Message mapRow(ResultSet rs, int rowNum) throws SQLException { + Message msg = new Message(); + msg.setMid(rs.getInt(1)); + msg.setRid(rs.getInt(2)); + msg.setReplyto(rs.getInt(3)); + User user = new User(); + user.setUid(rs.getInt(4)); + user.setName(rs.getString(5)); + user.setBanned(rs.getBoolean(6)); + msg.setUser(user); + msg.TimeAgo = rs.getInt(7); + msg.setDate(rs.getTimestamp(8)); + msg.ReadOnly = rs.getBoolean(9); + msg.setPrivacy(rs.getInt(10)); + msg.FriendsOnly = msg.getPrivacy() < 0; + msg.Replies = rs.getInt(11); + msg.AttachmentType = rs.getString(12); + if (rs.getDouble(13) != 0) { + msg.Place = new com.juick.Place(); + msg.Place.lat = rs.getDouble(14); + msg.Place.lon = rs.getDouble(15); + } + msg.Likes = rs.getInt(16); + msg.Hidden = rs.getBoolean(17); + // parse tags string + String tagsStr = rs.getString(18); + if (tagsStr != null) { + Arrays.stream(tagsStr.split(" ")).forEach(t -> msg.getTags().add(new Tag(t))); + } + msg.RepliesBy = rs.getString(19); + msg.setText(rs.getString(20)); + msg.setReplyQuote(MessageUtils.formatQuote(rs.getString(21))); + return msg; + } + } + + @Transactional + @Override + public int createMessage(final int uid, final String txt, final String attachment, final List tags) { + KeyHolder holder = new GeneratedKeyHolder(); + getJdbcTemplate().update(con -> { + PreparedStatement stmt = con.prepareStatement( + "INSERT INTO messages(user_id,attach) VALUES (?,?)", + Statement.RETURN_GENERATED_KEYS); + stmt.setInt(1, uid); + if (attachment != null) { + stmt.setString(2, attachment); + } else { + stmt.setNull(2, Types.VARCHAR); + } + return stmt; + }, holder); + + int mid = holder.getKey().intValue(); + + if (mid > 0) { + String tagsNames = ""; + String tagsIDs = ""; + + for (int i = 0; i < tags.size(); i++) { + if (i > 0) { + tagsNames += " "; + tagsIDs += ","; + } + tagsNames += tags.get(i).getName(); + tagsIDs += "(" + mid + "," + tags.get(i).TID + ")"; + } + if (tags.size() > 0) { + getJdbcTemplate().execute( + "INSERT INTO messages_tags(message_id,tag_id) VALUES " + tagsIDs); + } + final String finalTagsNames = tagsNames; + getJdbcTemplate().update(con -> { + PreparedStatement stmt = con.prepareStatement( + "INSERT INTO messages_txt(message_id,tags,txt) " + + "VALUES (?,?,?)", Statement.NO_GENERATED_KEYS); + stmt.setInt(1, mid); + if (finalTagsNames.isEmpty()) { + stmt.setNull(2, Types.VARCHAR); + } else { + stmt.setString(2, finalTagsNames); + } + stmt.setString(3, txt); + return stmt; + }); + } + + return mid; + } + + @Transactional + @Override + public int createReply(final int mid, final int rid, final int uid, final String txt, final String attachment) { + int ridnew = getReplyIDIncrement(mid); + + getJdbcTemplate().update(con -> { + PreparedStatement stmt = con.prepareStatement( + "INSERT INTO replies(message_id,reply_id,user_id,replyto,attach,txt) VALUES (?,?,?,?,?,?)", + Statement.NO_GENERATED_KEYS); + stmt.setInt(1, mid); + stmt.setInt(2, ridnew); + stmt.setInt(3, uid); + stmt.setInt(4, rid); + if (attachment != null) { + stmt.setString(5, attachment); + } else { + stmt.setNull(5, Types.VARCHAR); + } + stmt.setString(6, txt); + return stmt; + }); + + if (ridnew > 0) + getJdbcTemplate().update( + "UPDATE messages SET replies=replies+1 WHERE message_id=?", + mid); + + return ridnew; + } + + @Override + public int getReplyIDIncrement(final int mid) { + return getJdbcTemplate().execute((ConnectionCallback) conn -> { + conn.setAutoCommit(false); + final int replyNo; + try (PreparedStatement ps = conn.prepareStatement("START TRANSACTION")) { + ps.executeUpdate(); + } + try (PreparedStatement ps = conn.prepareStatement("SELECT maxreplyid+1 FROM messages WHERE message_id=? FOR UPDATE")) { + ps.setInt(1, mid); + try (ResultSet resultSet = ps.executeQuery()) { + if (resultSet.next()) { + replyNo = resultSet.getInt(1); + } else { + throw new IncorrectResultSizeDataAccessException("while getting getReplyIDIncrement, mid=" + mid, 1, 0); + } + } + } + try (PreparedStatement ps = conn.prepareStatement("UPDATE messages SET maxreplyid=? WHERE message_id=?")) { + ps.setInt(1, replyNo); + ps.setInt(2, mid); + if (ps.executeUpdate() != 1) { + throw new IncorrectResultSizeDataAccessException("Cannot find a message to update: " + mid, 1, 0); + } + } + conn.commit(); + return replyNo; + }); + + } + + @Transactional + @Override + public boolean recommendMessage(final int mid, final int vuid) { + boolean res = getJdbcTemplate().update( + "INSERT IGNORE INTO favorites(user_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; + if (res) { + getJdbcTemplate().update( + "UPDATE messages SET likes=likes+1 WHERE message_id=?", + mid); + } + return res; + } + + @Transactional(readOnly = true) + @Override + public boolean canViewThread(final int mid, final int uid) { + PrivacyOpts privacyOpts; + try { + privacyOpts = getJdbcTemplate().queryForObject( + "SELECT user_id,privacy FROM messages WHERE messages.message_id=?", + (rs, rowNum) -> { + PrivacyOpts res = new PrivacyOpts(); + res.setUid(rs.getInt(1)); + res.setPrivacy(rs.getInt(2)); + return res; + }, mid); + } catch (EmptyResultDataAccessException e) { + return true; + } + return privacyOpts.getPrivacy() >= 0 + || uid == privacyOpts.getUid() + || ((privacyOpts.getPrivacy() == -1 || privacyOpts.getPrivacy() == -2) && uid > 0 + && userService.isInWL(privacyOpts.getUid(), uid)); + } + + @Transactional(readOnly = true) + @Override + public boolean isReadOnly(final int mid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT readonly FROM messages WHERE message_id=?", + new Object[]{mid}, + Integer.class) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public boolean isSubscribed(final int uid, final int mid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT 1 FROM subscr_messages WHERE suser_id=? AND message_id=?", + new Object[]{uid, mid}, + Integer.class) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public int getMessagePrivacy(final int mid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT privacy FROM messages WHERE message_id=?", + new Object[]{mid}, + Integer.class); + } catch (EmptyResultDataAccessException e) { + return -4; + } + } + + @Transactional(readOnly = true) + @Override + public com.juick.Message getMessage(final int mid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT messages.message_id, 0 as rid, 0 as replyto, " + + "messages.user_id,users.nick, 0 as banned, " + + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," + + "messages.ts," + + "messages.readonly,messages.privacy,messages.replies," + + "messages.attach,messages.place_id,messages.lat," + + "messages.lon,messages.likes,messages.hidden," + + "txt.tags,txt.repliesby,txt.txt, '' as q FROM messages " + + "INNER JOIN users ON messages.user_id=users.id " + + "INNER JOIN messages_txt AS txt " + + "ON messages.message_id=txt.message_id " + + "WHERE messages.message_id=?", + new MessageMapper(), + mid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public com.juick.Message getReply(final int mid, final int rid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT replies.user_id,users.nick," + + "replies.replyto,replies.ts," + + "replies.attach,replies.txt, IFNULL(q.txt,t.txt) as quote FROM replies INNER JOIN users " + + "ON replies.user_id=users.id " + + "LEFT JOIN replies q " + + "ON replies.message_id=q.message_id and replies.replyto=q.reply_id " + + "LEFT JOIN messages_txt t ON replies.message_id=t.message_id " + + "WHERE replies.message_id=? AND replies.reply_id=?", + (rs, num) -> { + Message msg = new Message(); + msg.setMid(mid); + msg.setRid(rid); + msg.setUser(new User()); + msg.getUser().setUid(rs.getInt(1)); + msg.getUser().setName(rs.getString(2)); + msg.setReplyto(rs.getInt(3)); + msg.setDate(rs.getTimestamp(4)); + msg.AttachmentType = rs.getString(5); + msg.setText(rs.getString(6)); + String quote = rs.getString(7); + if (!StringUtils.isEmpty(quote)) { + msg.setReplyQuote(MessageUtils.formatQuote(quote)); + } + return msg; + }, mid, rid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public User getMessageAuthor(final int mid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT messages.user_id,users.nick " + + "FROM messages INNER JOIN users " + + "ON messages.user_id=users.id WHERE messages.message_id=?", + new Object[]{mid}, (rs, num) -> { + User res = new com.juick.User(); + res.setUid(rs.getInt(1)); + res.setName(rs.getString(2)); + return res; + }); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public List getMessageTags(final int mid) { + return getJdbcTemplate().query( + "SELECT tags.tag_id,synonym_id,name,stat_messages FROM tags " + + "INNER JOIN messages_tags ON (messages_tags.message_id=? AND messages_tags.tag_id=tags.tag_id)", + new Object[]{mid}, (rs, num) -> { + com.juick.Tag t = new com.juick.Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); + t.TID = rs.getInt(1); + t.SynonymID = rs.getInt(2); + t.UsageCnt = rs.getInt(4); + return t; + }); + } + + @Transactional(readOnly = true) + @Override + public List getMessageTagsIDs(final int mid) { + return getJdbcTemplate().queryForList( + "SELECT tag_id FROM messages_tags WHERE message_id=?", + new Object[]{mid}, + Integer.class); + } + + @Transactional(readOnly = true) + @Override + public List getMessageRecommendations(final int mid) { + return getJdbcTemplate().queryForList( + "SELECT users.nick FROM favorites INNER JOIN users " + + "ON (favorites.message_id=? AND favorites.user_id=users.id)", + new Object[]{mid}, + String.class); + } + + @Transactional(readOnly = true) + @Override + public List getAll(final int visitor_uid, final int before) { + if (visitor_uid > 1) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE message_id0 OR user_id=?) AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", + new Object[]{before, visitor_uid, visitor_uid}, + Integer.class); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE hidden=0" + + " AND (privacy>0 OR user_id=?)" + + " AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", + new Object[]{visitor_uid, visitor_uid}, + Integer.class); + } + } else { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE message_id0 AND user_id NOT IN (SELECT id from users WHERE banned=1) " + + " ORDER BY message_id DESC LIMIT 20", + new Object[]{before}, + Integer.class); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE hidden=0 AND privacy>0" + + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", + Integer.class); + } + } + } + + @Transactional(readOnly = true) + @Override + public List getTag(final int tid, final int visitor_uid, final int before, final int cnt) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM (tags INNER JOIN messages_tags " + + "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + + "INNER JOIN messages USING(message_id) WHERE messages.message_id0 OR messages.user_id=?) ORDER BY message_id DESC LIMIT ?", + new Object[]{tid, tid, before, visitor_uid, cnt}, + Integer.class); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM (tags INNER JOIN messages_tags " + + "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + + "INNER JOIN messages USING(message_id) WHERE messages.privacy>0 OR messages.user_id=? " + + "ORDER BY message_id DESC LIMIT ?", + new Object[]{tid, tid, visitor_uid, cnt}, + Integer.class); + } + } + + @Transactional(readOnly = true) + @Override + public List getTags(final String tids, final int visitor_uid, final int before, final int cnt) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT messages.message_id FROM messages_tags " + + "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + + "AND messages.message_id0 OR messages.user_id=?) " + + "ORDER BY messages.message_id DESC LIMIT ?", + new Object[]{before, visitor_uid, cnt}, + Integer.class); + } else { + return getJdbcTemplate().queryForList( + "SELECT messages.message_id FROM messages_tags " + + "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + + "AND (messages.privacy>0 OR messages.user_id=?) " + + "ORDER BY messages.message_id DESC LIMIT ?", + new Object[]{visitor_uid, cnt}, Integer.class); + } + } + + @Transactional(readOnly = true) + @Override + public List getPlace(final int place_id, final int visitor_uid, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE place_id=? AND message_id0 OR user_id=?) ORDER BY message_id DESC LIMIT 20", + new Object[]{place_id, before, visitor_uid}, + Integer.class); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE place_id=? AND (privacy>0 OR user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", + new Object[]{place_id, visitor_uid}, + Integer.class); + } + } + + @Transactional(readOnly = true) + @Override + public List getMyFeed(final int uid, final int before) { + List mids; + if (before > 0) { + mids = getJdbcTemplate().queryForList( + "SELECT message_id FROM messages " + + "INNER JOIN subscr_users ON (subscr_users.suser_id=? AND subscr_users.user_id=messages.user_id) " + + "WHERE message_id=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + + "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", + Integer.class, + uid, + before, + uid); + } else { + mids = getJdbcTemplate().queryForList( + "SELECT message_id FROM messages " + + "INNER JOIN subscr_users ON (subscr_users.suser_id=? " + + "AND subscr_users.user_id=messages.user_id) " + + "WHERE (privacy>=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + + "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", + Integer.class, + uid, + uid); + } + + if (before > 0) { + mids.addAll(getJdbcTemplate().queryForList( + "SELECT message_id FROM messages " + + "WHERE user_id=? AND message_id getPrivate(final int uid, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList + ("SELECT message_id FROM messages WHERE user_id=? AND privacy<0 AND message_id getDiscussions(final int uid, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM subscr_messages WHERE suser_id=? AND message_id getRecommended(final int uid, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM favorites WHERE user_id " + + "IN (SELECT user_id FROM subscr_users WHERE suser_id=?) AND message_id getPopular(final int visitor_uid, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE message_id0 " + + "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", + Integer.class, + before, + visitor_uid); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE privacy>0 " + + "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", + Integer.class, + visitor_uid); + } + } + + @Transactional(readOnly = true) + @Override + public List getPhotos(final int visitor_uid, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE message_id0 OR user_id=?) " + + "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + + "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", + Integer.class, + before, + visitor_uid, + visitor_uid); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE (privacy>0 OR user_id=?) " + + "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + + "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "ORDER BY message_id DESC LIMIT 20", + Integer.class, + visitor_uid, + visitor_uid); + } + } + + @Transactional(readOnly = true) + @Override + public List getSearch(final JdbcTemplate sqlSearch, final String search, final int before) { + List mids; + + if (before > 0) { + mids = sqlSearch.queryForList( + "SELECT id AS message_id FROM messages WHERE MATCH(?) AND id 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE message_id " + + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>0 ORDER BY message_id DESC LIMIT 20", + Integer.class); + } + return mids; + } + + @Transactional(readOnly = true) + @Override + public List getUserBlog(final int UID, final int privacy, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE user_id=? AND message_id=" + + privacy + " ORDER BY message_id DESC LIMIT 20", + Integer.class, + UID, + before); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + + " ORDER BY message_id DESC LIMIT 20", + Integer.class, + UID); + } + } + + @Transactional(readOnly = true) + @Override + public List getUserTag(final int UID, final int TID, final int privacy, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT messages.message_id FROM messages_tags INNER JOIN messages " + + "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + + "AND messages.message_id=" + privacy + + " ORDER BY messages.message_id DESC LIMIT 20", + Integer.class, + UID, + TID, + before); + } else { + return getJdbcTemplate().queryForList( + "SELECT messages.message_id FROM messages_tags INNER JOIN messages " + + "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + + "AND messages.privacy>=" + privacy + " ORDER BY messages.message_id DESC LIMIT 20", + Integer.class, + UID, + TID); + } + } + + @Transactional(readOnly = true) + @Override + public List getUserRecommendations(final int UID, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM favorites " + + "WHERE user_id=? AND message_id getUserPhotos(final int UID, final int privacy, final int before) { + if (before > 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE user_id=? AND message_id=" + + privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", + new Object[]{UID, before}, + Integer.class); + } else { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", + new Object[]{UID}, + Integer.class); + } + } + + @Transactional(readOnly = true) + @Override + public List getUserSearch(final JdbcTemplate sqlSearch, final int UID, final String search, final int privacy, final int before) { + List mids; + + if (before > 0) { + mids = sqlSearch.queryForList( + "SELECT id AS message_id FROM messages WHERE user_id=? AND MATCH(?) AND id 0) { + return getJdbcTemplate().queryForList( + "SELECT message_id FROM messages WHERE message_id IN (" + + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>=" + privacy + " ORDER BY message_id DESC", + Integer.class); + } + return mids; + } + + @Transactional(readOnly = true) + @Override + public List getMessages(final List mids) { + if (!mids.isEmpty()) { + return getJdbcTemplate().query( + "SELECT messages.message_id, 0 as rid, 0 as replyto, " + + "messages.user_id,users.nick, 0 as banned, " + + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," + + "messages.ts," + + "messages.readonly,messages.privacy,messages.replies," + + "messages.attach,messages.place_id,messages.lat," + + "messages.lon,messages.likes,messages.hidden," + + "messages_txt.tags,messages_txt.repliesby, messages_txt.txt, '' as q " + + "FROM (messages INNER JOIN messages_txt " + + "ON messages.message_id=messages_txt.message_id) " + + "INNER JOIN users ON messages.user_id=users.id " + + "WHERE messages.message_id " + + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") " + + "ORDER BY messages.message_id DESC", + new MessageMapper()); + } + return Collections.emptyList(); + } + + @Transactional(readOnly = true) + @Override + public List getReplies(final int mid) { + return getJdbcTemplate().query( + "SELECT ? as mid, replies.reply_id,replies.replyto, " + + "replies.user_id,users.nick,users.banned, " + + "TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts," + + "0 as readonly, 0 as privacy, 0 as replies," + + "replies.attach, 0 as place_id, 0 as lat," + + "0 as lon, 0 as likes, 0 as hidden," + + "NULL as tags,NULL as repliesby, replies.txt, " + + "IFNULL(qw.txt, t.txt) as q " + + "FROM replies INNER JOIN users " + + "ON replies.user_id=users.id " + + "LEFT JOIN replies qw ON replies.message_id=qw.message_id and replies.replyto=qw.reply_id " + + "LEFT JOIN messages_txt t on replies.message_id=t.message_id " + + "WHERE replies.message_id=? " + + "ORDER BY replies.reply_id ASC", + new MessageMapper(), + mid, + mid); + } + + @Transactional + @Override + public boolean setMessagePopular(final int mid, final int popular) { + boolean ret; + switch (popular) { + case -2: + ret = getJdbcTemplate().update("UPDATE messages SET hidden=1 WHERE message_id=?", mid) > 0; + break; + case -1: + ret = getJdbcTemplate().update("UPDATE messages SET popular=0 WHERE message_id=?", mid) > 0; + break; + default: + ret = getJdbcTemplate().update("UPDATE messages SET popular=? WHERE message_id=?", popular, mid) > 0; + break; + } + if (popular == -1) { + ret = getJdbcTemplate().update("INSERT INTO top_ignore_messages VALUES (?)", mid) > 0; + } + return ret; + } + + @Transactional + @Override + public boolean setMessagePrivacy(final int mid) { + return getJdbcTemplate().update("UPDATE messages SET privacy=1 WHERE message_id=?", + mid) > 0; + } + + @Transactional + @Override + public boolean deleteMessage(final int uid, final int mid) { + if (getJdbcTemplate().update("DELETE FROM messages WHERE message_id=? AND user_id=?", mid, uid) > 0) { + getJdbcTemplate().update("DELETE FROM messages_txt WHERE message_id=?", mid); + getJdbcTemplate().update("DELETE FROM replies WHERE message_id=?", mid); + getJdbcTemplate().update("DELETE FROM subscr_messages WHERE message_id=?", mid); + getJdbcTemplate().update("DELETE FROM messages_tags WHERE message_id=?", mid); + return true; + } + return false; + } +} diff --git a/juick-server/src/main/java/com/juick/service/PMQueriesService.java b/juick-server/src/main/java/com/juick/service/PMQueriesService.java new file mode 100644 index 00000000..df332870 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/PMQueriesService.java @@ -0,0 +1,28 @@ +package com.juick.service; + +import com.juick.User; + +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface PMQueriesService { + boolean createPM(int uid_from, int uid_to, String body); + + boolean addPMinRoster(int uid, String jid); + + boolean removePMinRoster(int uid, String jid); + + boolean havePMinRoster(int uid, String jid); + + String getLastView(int uid_from, int uid_to); + + List getPMLastConversationsUsers(int uid, int cnt); + + List getPMMessages(int uid, int uid_to); + + List getLastPMInbox(int uid); + + List getLastPMSent(int uid); +} diff --git a/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java b/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java new file mode 100644 index 00000000..5c28c2ba --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/PMQueriesServiceImpl.java @@ -0,0 +1,165 @@ +package com.juick.service; + +import com.juick.User; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.inject.Inject; +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesService { + + @Inject + public PMQueriesServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Transactional + @Override + public boolean createPM(final int uid_from, final int uid_to, final String body) { + boolean ret = getJdbcTemplate().update( + "INSERT INTO pm(user_id,user_id_to,txt) VALUES (?,?,?)", + uid_from, uid_to, body) > 0; + + if (ret) { + getJdbcTemplate().update( + "INSERT INTO pm_streams(user_id,user_id_to,lastmessage,unread) " + + "VALUES (?,?,NOW(),1) " + + "ON DUPLICATE KEY UPDATE lastmessage=NOW(),unread=unread+1", + uid_from, uid_to); + } + return ret; + } + + @Transactional + @Override + public boolean addPMinRoster(final int uid, final String jid) { + return getJdbcTemplate().update( + "INSERT INTO pm_inroster(user_id,jid) VALUES (?,?)", + uid, jid) > 0; + } + + @Transactional + @Override + public boolean removePMinRoster(final int uid, final String jid) { + return getJdbcTemplate().update( + "DELETE FROM pm_inroster WHERE user_id=? AND jid=?", uid, jid) > 0; + } + + @Transactional + @Override + public boolean havePMinRoster(final int uid, final String jid) { + List res = getJdbcTemplate().queryForList( + "SELECT 1 FROM pm_inroster WHERE user_id=? AND jid=?", + Integer.class, + uid, + jid); + return res.size() > 0; + } + + @Transactional(readOnly = true) + @Override + public String getLastView(final int uid_from, final int uid_to) { + try { + return getJdbcTemplate().queryForObject( + "SELECT lastview FROM pm_streams WHERE user_id=? AND user_id_to=?", + String.class, + uid_from, + uid_to); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public List getPMLastConversationsUsers(final int uid, 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 " + + "WHERE pm_streams.user_id_to=? " + + "ORDER BY pm_streams.unread DESC, pm_streams.lastmessage DESC LIMIT " + cnt, + (rs, rowNum) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + u.setUnreadCount(rs.getInt(3)); + return u; + }, + uid); + } + + @Transactional + @Override + public List getPMMessages(final int uid, final int uid_to) { + List msgs = getJdbcTemplate().query( + "SELECT user_id,txt,ts FROM pm " + + "WHERE (user_id=? AND user_id_to=?) " + + "OR (user_id_to=? AND user_id=?) ORDER BY ts DESC LIMIT 20", + (rs, rowNum) -> { + com.juick.Message msg = new com.juick.Message(); + int uuid = rs.getInt(1); + msg.setUser(new User()); + msg.getUser().setUid(uuid); + msg.setText(rs.getString(2)); + msg.setDate(rs.getTimestamp(3)); + return msg; + }, + uid, + uid_to, + uid, + uid_to); + + getJdbcTemplate().update( + "UPDATE pm_streams SET lastview=NOW(),unread=0 WHERE user_id_to=? AND user_id=?", + uid, + uid_to); + + return msgs; + } + + @Transactional(readOnly = true) + @Override + public List getLastPMInbox(final int uid) { + return getJdbcTemplate().query( + "SELECT pm.user_id,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW()),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", + (rs, num) -> { + com.juick.Message msg = new com.juick.Message(); + msg.setUser(new User()); + msg.getUser().setUid(rs.getInt(1)); + msg.getUser().setName(rs.getString(2)); + msg.setText(rs.getString(3)); + msg.TimeAgo = rs.getInt(4); + msg.setDate(rs.getTimestamp(5)); + return msg; + }, + uid); + } + + @Transactional(readOnly = true) + @Override + public List getLastPMSent(final int uid) { + return getJdbcTemplate().query( + "SELECT pm.user_id_to,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW())," + + "pm.ts FROM pm INNER JOIN users ON pm.user_id_to=users.id " + + "WHERE pm.user_id=? ORDER BY pm.ts DESC LIMIT 20", + (rs, num) -> { + com.juick.Message msg = new com.juick.Message(); + msg.setUser(new User()); + msg.getUser().setUid(rs.getInt(1)); + msg.getUser().setName(rs.getString(2)); + msg.setText(rs.getString(3)); + msg.TimeAgo = rs.getInt(4); + msg.setDate(rs.getTimestamp(5)); + return msg; + }, + uid); + } +} diff --git a/juick-server/src/main/java/com/juick/service/PrivacyQueriesService.java b/juick-server/src/main/java/com/juick/service/PrivacyQueriesService.java new file mode 100644 index 00000000..61eb199b --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/PrivacyQueriesService.java @@ -0,0 +1,17 @@ +package com.juick.service; + +import com.juick.Tag; +import com.juick.User; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface PrivacyQueriesService { + enum PrivacyResult { + Removed, Added + } + + PrivacyResult blacklistUser(User user, User target); + + PrivacyResult blacklistTag(User user, Tag tag); +} diff --git a/juick-server/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java b/juick-server/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java new file mode 100644 index 00000000..7dac4073 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java @@ -0,0 +1,56 @@ +package com.juick.service; + +import com.juick.Tag; +import com.juick.User; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.inject.Inject; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +@Transactional +public class PrivacyQueriesServiceImpl extends BaseJdbcService implements PrivacyQueriesService { + + @Inject + public PrivacyQueriesServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Override + public PrivacyResult blacklistUser(final User user, final User target) { + int result = getJdbcTemplate().update( + "DELETE FROM bl_users WHERE user_id=? AND bl_user_id=?", + user.getUid(), + target.getUid()); + if (result > 0) { + return PrivacyResult.Removed; + } else { + getJdbcTemplate().update( + "INSERT INTO bl_users(user_id,bl_user_id) VALUES (?,?)", + user.getUid(), + target.getUid()); + return PrivacyResult.Added; + } + } + + @Override + public PrivacyResult blacklistTag(final User user, final Tag tag) { + int result = getJdbcTemplate().update( + "DELETE FROM bl_tags WHERE user_id=? AND tag_id=?", + user.getUid(), + tag.TID); + if (result > 0) { + return PrivacyResult.Removed; + } else { + getJdbcTemplate().update( + "INSERT INTO bl_tags(user_id,tag_id) VALUES (?,?)", + user.getUid(), + tag.TID); + return PrivacyResult.Added; + } + } +} diff --git a/juick-server/src/main/java/com/juick/service/PushQueriesService.java b/juick-server/src/main/java/com/juick/service/PushQueriesService.java new file mode 100644 index 00000000..8e7ce543 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/PushQueriesService.java @@ -0,0 +1,20 @@ +package com.juick.service; + +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface PushQueriesService { + List getAndroidRegID(int uid); + + List getAndroidTokens(List uids); + + List getWinPhoneURL(int uid); + + List getWindowsTokens(List uids); + + List getAPNSToken(int uid); + + List getAPNSTokens(List uids); +} diff --git a/juick-server/src/main/java/com/juick/service/PushQueriesServiceImpl.java b/juick-server/src/main/java/com/juick/service/PushQueriesServiceImpl.java new file mode 100644 index 00000000..91861bd9 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/PushQueriesServiceImpl.java @@ -0,0 +1,70 @@ +package com.juick.service; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import javax.inject.Inject; +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +@Transactional(readOnly = true) +public class PushQueriesServiceImpl extends BaseJdbcService implements PushQueriesService { + + @Inject + public PushQueriesServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Override + public List getAndroidRegID(final int uid) { + return getJdbcTemplate().queryForList( + "SELECT regid FROM android WHERE user_id=?", + String.class, + uid); + } + + @Override + public List getAndroidTokens(final List uids) { + return getJdbcTemplate().queryForList( + "SELECT regid FROM android INNER JOIN users " + + "ON (users.id=android.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", + String.class); + } + + @Override + public List getWinPhoneURL(final int uid) { + return getJdbcTemplate().queryForList( + "SELECT url FROM winphone WHERE user_id=?", + String.class, + uid); + } + + @Override + public List getWindowsTokens(final List uids) { + return getJdbcTemplate().queryForList( + "SELECT url FROM winphone INNER JOIN users " + + "ON (users.id=winphone.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", + String.class); + } + + @Override + public List getAPNSToken(final int uid) { + return getJdbcTemplate().queryForList( + "SELECT token from ios WHERE user_id=?", + String.class, + uid); + } + + @Override + public List getAPNSTokens(final List uids) { + return getJdbcTemplate().queryForList( + "SELECT token FROM ios INNER JOIN users " + + "ON (users.id=ios.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", + String.class); + } +} diff --git a/juick-server/src/main/java/com/juick/service/ShowQueriesService.java b/juick-server/src/main/java/com/juick/service/ShowQueriesService.java new file mode 100644 index 00000000..a7e1c364 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/ShowQueriesService.java @@ -0,0 +1,14 @@ +package com.juick.service; + +import com.juick.User; + +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface ShowQueriesService { + List getRecommendedUsers(User forUser); + + List getTopUsers(); +} diff --git a/juick-server/src/main/java/com/juick/service/ShowQueriesServiceImpl.java b/juick-server/src/main/java/com/juick/service/ShowQueriesServiceImpl.java new file mode 100644 index 00000000..2ddfeb84 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/ShowQueriesServiceImpl.java @@ -0,0 +1,50 @@ +package com.juick.service; + +import com.juick.User; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.inject.Inject; +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +@Transactional(readOnly = true) +public class ShowQueriesServiceImpl extends BaseJdbcService implements ShowQueriesService { + + @Inject + public ShowQueriesServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Override + public List getRecommendedUsers(final User forUser) { + return getJdbcTemplate().queryForList( + "SELECT users.nick FROM subscr_users INNER JOIN users " + + "ON subscr_users.user_id=users.id " + + "WHERE subscr_users.user_id NOT IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + + "AND subscr_users.suser_id IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + + "AND subscr_users.user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + + "AND subscr_users.user_id!=? AND users.lastmessage>UNIX_TIMESTAMP()-259200 " + + "GROUP BY subscr_users.user_id ORDER BY count(*) DESC LIMIT 10", + String.class, + forUser.getUid(), + forUser.getUid(), + forUser.getUid(), + forUser.getUid()); + } + + @Override + public List getTopUsers() { + return getJdbcTemplate().queryForList( + "SELECT users.nick,COUNT(subscr_users.suser_id) AS cnt " + + "FROM (subscr_users INNER JOIN users ON subscr_users.user_id=users.id) " + + "INNER JOIN useroptions ON users.id=useroptions.user_id " + + "WHERE useroptions.privacy_view>0 AND users.lastmessage > UNIX_TIMESTAMP() - 259200 " + + "AND users.id!=2 GROUP BY subscr_users.user_id ORDER BY cnt DESC LIMIT 10", + String.class); + } +} diff --git a/juick-server/src/main/java/com/juick/service/SubscriptionService.java b/juick-server/src/main/java/com/juick/service/SubscriptionService.java new file mode 100644 index 00000000..00aee15d --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/SubscriptionService.java @@ -0,0 +1,36 @@ +package com.juick.service; + +import com.juick.Tag; +import com.juick.User; +import com.juick.server.helpers.NotifyOpts; + +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface SubscriptionService { + List getJIDSubscribedToUser(int uid, boolean friendsonly); + + List getSubscribedUsers(int uid, int mid); + + List getUsersSubscribedToComments(int mid, int ignore_uid); + + List getUsersSubscribedToUserRecommendations(int uid, int mid, int muid); + + boolean subscribeMessage(int mid, int vuid); + + boolean unSubscribeMessage(int mid, int vuid); + + boolean subscribeUser(User user, User toUser); + + boolean unSubscribeUser(User user, User fromUser); + + boolean subscribeTag(User user, Tag toTag); + + boolean unSubscribeTag(User user, Tag toTag); + + NotifyOpts getNotifyOptions(User user); + + boolean setNotifyOptions(User user, NotifyOpts options); +} diff --git a/juick-server/src/main/java/com/juick/service/SubscriptionServiceImpl.java b/juick-server/src/main/java/com/juick/service/SubscriptionServiceImpl.java new file mode 100644 index 00000000..f6ecb658 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/SubscriptionServiceImpl.java @@ -0,0 +1,196 @@ +package com.juick.service; + +import com.juick.Tag; +import com.juick.User; +import com.juick.server.helpers.NotifyOpts; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import javax.inject.Inject; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +public class SubscriptionServiceImpl extends BaseJdbcService implements SubscriptionService { + private final UserService userService; + private final MessagesService messagesService; + + @Inject + public SubscriptionServiceImpl(JdbcTemplate jdbcTemplate, UserService userService, MessagesService messagesService) { + super(jdbcTemplate, null); + + Assert.notNull(userService); + this.userService = userService; + + Assert.notNull(messagesService); + this.messagesService = messagesService; + } + + @Transactional(readOnly = true) + @Override + public List getJIDSubscribedToUser(final int uid, final boolean friendsonly) { + if (friendsonly == false) { + return getJdbcTemplate().queryForList( + "SELECT jids.jid FROM subscr_users INNER JOIN jids " + + "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1", + String.class, + uid); + } else { + return getJdbcTemplate().queryForList( + "SELECT jids.jid FROM subscr_users INNER JOIN jids " + + "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1 " + + "AND jids.user_id IN (SELECT wl_user_id FROM wl_users WHERE user_id=?)", + String.class, + uid, + uid); + } + } + + @Transactional(readOnly = true) + @Override + public List getSubscribedUsers(final int uid, final int mid) { + User author = messagesService.getMessageAuthor(mid); + + List userids = userService.getUserReaders(uid); + + Set set = new HashSet<>(); + set.addAll(userids.stream().map(User::getUid).collect(Collectors.toList())); + List tags = messagesService.getMessageTagsIDs(mid); + if (tags.size() > 0) { + List tagUsers = getJdbcTemplate().queryForList( + "SELECT suser_id FROM subscr_tags " + + "WHERE tag_id IN (" + StringUtils.arrayToCommaDelimitedString(tags.toArray()) + ") AND suser_id!=? " + + " AND suser_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=?)", + Integer.class, + uid, + author.getUid()); + set.addAll(tagUsers); + } + return userService.getUsersByID(new ArrayList<>(set)); + } + + @Transactional(readOnly = true) + @Override + public List getUsersSubscribedToComments(final int mid, final int ignore_uid) { + List userids = getJdbcTemplate().queryForList( + "SELECT suser_id FROM subscr_messages WHERE message_id=? AND suser_id!=?", + Integer.class, + mid, + ignore_uid); + if (userids.size() > 0) { + return userService.getUsersByID(userids); + } else { + return Collections.emptyList(); + } + } + + @Transactional(readOnly = true) + @Override + public List getUsersSubscribedToUserRecommendations(final int uid, final int mid, final int muid) { + List tags = messagesService.getMessageTagsIDs(mid); + + String query = "SELECT suser_id FROM subscr_users WHERE user_id=" + uid; + query += " AND user_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=" + muid + ")"; + query += " AND user_id NOT IN (SELECT suser_id FROM subscr_users WHERE user_id=" + muid + ")"; + query += " AND user_id NOT IN (SELECT suser_id FROM subscr_messages WHERE message_id=" + mid + ")"; + query += " AND user_id NOT IN (SELECT user_id FROM favorites WHERE message_id=" + mid + ")"; + query += " AND user_id NOT IN (SELECT subscr_users.suser_id FROM subscr_users INNER JOIN favorites ON (favorites.message_id=" + mid + " AND subscr_users.user_id=favorites.user_id AND favorites.user_id!=" + uid + "))"; + + if (!tags.isEmpty()) { + String tagsStr = StringUtils.arrayToCommaDelimitedString(tags.toArray()); + query += " AND user_id NOT IN (SELECT suser_id FROM subscr_tags WHERE tag_id IN (" + tagsStr + "))"; + query += " AND user_id NOT IN (SELECT user_id FROM bl_tags WHERE tag_id IN (" + tagsStr + "))"; + } + + List userids = getJdbcTemplate().queryForList(query, Integer.class); + + return userService.getUsersByID(userids); + } + + @Transactional + @Override + public boolean subscribeMessage(final int mid, final int vuid) { + return getJdbcTemplate().update( + "INSERT IGNORE INTO subscr_messages(suser_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; + } + + @Transactional + @Override + public boolean unSubscribeMessage(final int mid, final int vuid) { + return getJdbcTemplate().update( + "DELETE FROM subscr_messages WHERE message_id=? AND suser_id=?", + mid, vuid) > 0; + } + + @Transactional + @Override + public boolean subscribeUser(final User user, final User toUser) { + return getJdbcTemplate().update( + "INSERT IGNORE INTO subscr_users(user_id,suser_id) VALUES (?,?)", + toUser.getUid(), user.getUid()) == 1; + } + + @Transactional + @Override + public boolean unSubscribeUser(final User user, final User fromUser) { + return getJdbcTemplate().update( + "DELETE FROM subscr_users WHERE suser_id=? AND user_id=?", + user.getUid(), fromUser.getUid()) > 0; + } + + @Transactional + @Override + public boolean subscribeTag(final User user, final Tag toTag) { + return getJdbcTemplate().update( + "INSERT IGNORE INTO subscr_tags(tag_id,suser_id) VALUES (?,?)", + toTag.TID, user.getUid()) == 1; + } + + @Transactional + @Override + public boolean unSubscribeTag(final User user, final Tag toTag) { + return getJdbcTemplate().update( + "DELETE FROM subscr_tags WHERE tag_id=? AND suser_id=?", + toTag.TID, user.getUid()) > 0; + } + + @Transactional(readOnly = true) + @Override + public NotifyOpts getNotifyOptions(final User user) { + try { + return getJdbcTemplate().queryForObject( + "SELECT jnotify,subscr_notify,recommendations FROM useroptions WHERE user_id=?", + (rs, num) -> { + NotifyOpts options = new NotifyOpts(); + options.setRepliesEnabled(rs.getInt(1) > 0); + options.setSubscriptionsEnabled(rs.getInt(2) > 0); + options.setRecommendationsEnabled(rs.getInt(3) > 0); + return options; + }, + user.getUid()); + } catch (EmptyResultDataAccessException e) { + return new NotifyOpts(); + } + } + + @Transactional + @Override + public boolean setNotifyOptions(final User user, final NotifyOpts options) { + return getJdbcTemplate().update( + "UPDATE useroptions SET jnotify=? WHERE user_id=?", options.isRepliesEnabled() ? 1 : 0, + user.getUid()) > 0 && + getJdbcTemplate().update( + "UPDATE useroptions SET subscr_notify=? WHERE user_id=?", options.isSubscriptionsEnabled() ? 1 : 0, + user.getUid()) > 0 && + getJdbcTemplate().update( + "UPDATE useroptions SET recommendations=? WHERE user_id=?", options.isRecommendationsEnabled() ? 1 : 0, + user.getUid()) > 0; + } +} diff --git a/juick-server/src/main/java/com/juick/service/TagService.java b/juick-server/src/main/java/com/juick/service/TagService.java new file mode 100644 index 00000000..d5f63e3a --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/TagService.java @@ -0,0 +1,30 @@ +package com.juick.service; + +import com.juick.Tag; + +import java.util.List; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface TagService { + com.juick.Tag getTag(int tid); + + com.juick.Tag getTag(String tag, boolean autoCreate); + + List getTags(String[] tags, boolean autoCreate); + + boolean getTagNoIndex(int tag_id); + + int createTag(String name); + + List getUserTagsAll(int uid); + + List getUserBLTags(int uid); + + List getPopularTags(); + + List updateTags(int mid, List newTags); + + List fromString(String txt, boolean tagsOnly); +} diff --git a/juick-server/src/main/java/com/juick/service/TagServiceImpl.java b/juick-server/src/main/java/com/juick/service/TagServiceImpl.java new file mode 100644 index 00000000..d63159cf --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/TagServiceImpl.java @@ -0,0 +1,190 @@ +package com.juick.service; + +import com.juick.Tag; +import org.apache.commons.lang3.StringEscapeUtils; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +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.util.Assert; + +import javax.inject.Inject; +import java.sql.PreparedStatement; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +public class TagServiceImpl extends BaseJdbcService implements TagService { + private static final Pattern TAGS_PATTERN1 = Pattern.compile("^(?:(?:\\*[^ \\r\\n\\t]+)|\\s)+$"); + private static final Pattern TAGS_PATTERN2 = Pattern.compile("^\\*([^ \\r\\n\\t]+)\\s+([\\s\\S]+)"); + private static final Pattern TAG_PATTERN = Pattern.compile("\\*([^ \\r\\n\\t]+)"); + + private final MessagesService messagesService; + + @Inject + public TagServiceImpl(JdbcTemplate jdbcTemplate, MessagesService messagesService) { + super(jdbcTemplate, null); + Assert.notNull(messagesService); + this.messagesService = messagesService; + } + + @Transactional(readOnly = true) + @Override + public com.juick.Tag getTag(final int tid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT synonym_id,name FROM tags WHERE tag_id=?", + (rs, num) -> { + Tag ret = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(2))); + ret.TID = tid; + ret.SynonymID = rs.getInt(1); + return ret; + }, + tid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public com.juick.Tag getTag(final String tag, final boolean autoCreate) { + Tag ret = null; + try { + ret = getJdbcTemplate().queryForObject( + "SELECT tag_id,synonym_id,name FROM tags WHERE name=?", + (rs, rowNum) -> { + Tag ret1 = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); + ret1.TID = rs.getInt(1); + ret1.SynonymID = rs.getInt(2); + return ret1; + }, + StringEscapeUtils.escapeHtml4(tag)); + } catch (EmptyResultDataAccessException e) { + // tag not found + } + if (ret == null && autoCreate) { + ret = new com.juick.Tag(tag); + ret.TID = createTag(tag); + } + + return ret; + } + + @Override + public List getTags(final String[] tags, final boolean autoCreate) { + List ret = new ArrayList<>(); + + for (String tag : tags) { + if (!tag.isEmpty()) { + Tag t = getTag(tag, autoCreate); + if (t != null) { + ret.add(t); + } + } + } + + return ret; + } + + @Transactional(readOnly = true) + @Override + public boolean getTagNoIndex(final int tag_id) { + try { + return getJdbcTemplate().queryForObject( + "SELECT noindex FROM tags WHERE tag_id=?", Integer.class, tag_id) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional + @Override + public int createTag(final String name) { + KeyHolder holder = new GeneratedKeyHolder(); + getJdbcTemplate().update(con -> { + PreparedStatement stmt = con.prepareStatement( + "INSERT INTO tags(name) VALUES (?)", + Statement.RETURN_GENERATED_KEYS); + stmt.setString(1, StringEscapeUtils.escapeHtml4(name)); + return stmt; + }, holder); + + return holder.getKey().intValue(); + } + + @Transactional(readOnly = true) + @Override + public List getUserTagsAll(final int uid) { + return getJdbcTemplate().query( + "SELECT tags.name,COUNT(messages.message_id) " + + "FROM (messages INNER JOIN messages_tags ON (messages.user_id=? " + + "AND messages.message_id=messages_tags.message_id)) " + + "INNER JOIN tags ON messages_tags.tag_id=tags.tag_id GROUP BY tags.tag_id ORDER BY tags.name ASC", + (rs, rowNum) -> { + Tag t = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(1))); + t.UsageCnt = rs.getInt(2); + return t; + }, uid); + } + + @Transactional(readOnly = true) + @Override + public List getUserBLTags(final int uid) { + return getJdbcTemplate().queryForList( + "SELECT tags.name FROM tags INNER JOIN bl_tags " + + "ON (bl_tags.user_id=? AND bl_tags.tag_id=tags.tag_id) ORDER BY tags.name", + String.class, uid); + } + + @Transactional(readOnly = true) + @Override + public List getPopularTags() { + return getJdbcTemplate().queryForList( + "SELECT name FROM tags WHERE top=1 ORDER BY name ASC", String.class).stream() + .map(StringEscapeUtils::unescapeHtml4).collect(Collectors.toList()); + } + + @Transactional + @Override + public List updateTags(final int mid, final List newTags) { + List currentTags = messagesService.getMessageTags(mid); + newTags.stream().filter(currentTags::contains) + .forEach(t -> getJdbcTemplate().update( + "DELETE FROM messages_tags WHERE message_id=? AND tag_id=?", + mid, + t.TID)); + newTags.stream().filter(t -> !currentTags.contains(t)) + .forEach(t -> getJdbcTemplate().update( + "INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)", mid, t.TID)); + return messagesService.getMessageTags(mid); + } + + @Override + public List fromString(final String txt, final boolean tagsOnly) { + Pattern tagsPattern = tagsOnly ? TAGS_PATTERN1 : TAGS_PATTERN2; + + if (tagsPattern.matcher(txt).matches()) { + Matcher tagMatcher = TAG_PATTERN.matcher(txt); + List tags = new ArrayList<>(); + // TODO: process readonly, private, friends, public + while (tagMatcher.find()) { + for (int i = 1; i <= tagMatcher.groupCount(); i++) { + tags.add(getTag(tagMatcher.group(i), true)); + } + } + return tags; + } + return Collections.emptyList(); + } +} diff --git a/juick-server/src/main/java/com/juick/service/UserService.java b/juick-server/src/main/java/com/juick/service/UserService.java new file mode 100644 index 00000000..e970afb7 --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/UserService.java @@ -0,0 +1,107 @@ +package com.juick.service; + +import com.juick.User; +import com.juick.server.helpers.Auth; +import com.juick.server.helpers.EmailOpts; +import com.juick.server.helpers.UserInfo; + +import java.util.List; +import java.util.Optional; + +/** + * Created by aalexeev on 11/13/16. + */ +public interface UserService { + enum ActiveStatus { + Inactive, + Active + } + + String getSignUpHashByJID(String jid); + + String getSignUpHashByTelegramID(Long telegramId, String username); + + int createUser(String username, String password); + + Optional getUserByUID(int uid); + + User getUserByName(String username); + + User getUserByJID(String jid); + + List getUsersByName(List unames); + + List getUsersByID(List uids); + + List getUsersByJID(List jids); + + List getJIDsbyUID(int uid); + + int getUIDbyJID(String jid); + + int getUIDbyName(String uname); + + int getUIDbyHash(String hash); + + com.juick.User getUserByHash(String hash); + + String getHashByUID(int uid); + + int checkPassword(String username, String password); + + boolean updatePassword(User user, String newPassword); + + String updateSecretEmail(User user); + + int getUserOptionInt(int uid, String option, int defaultValue); + + void setUserOptionInt(int uid, String option, int value); + + UserInfo getUserInfo(User user); + + boolean updateUserInfo(User user, UserInfo info); + + boolean getCanMedia(int uid); + + boolean isInWL(int uid, int check); + + boolean isInBL(int uid, int check); + + boolean isInBLAny(int uid, int uid2); + + List checkBL(int visitor, List uids); + + boolean isSubscribed(int uid, int check); + + List getUserRead(int uid); + + List getUserReadLeastPopular(int uid, int cnt); + + List getUserReaders(int uid); + + List getUserFriends(int uid); + + List getUserBLUsers(int uid); + + boolean linkTwitterAccount(User user, String accessToken, String accessTokenSecret, String screenName); + + int getStatsIRead(int uid); + + int getStatsMyReaders(int uid); + + int getStatsMessages(int uid); + + int getStatsReplies(int uid); + + boolean setActiveStatusForJID(String JID, ActiveStatus jidStatus); + + List getAllJIDs(User user); + + List getAuthCodes(User user); + + List getEmails(User user); + + EmailOpts getEmailOpts(User user); + + String getEmailHash(User user); +} diff --git a/juick-server/src/main/java/com/juick/service/UserServiceImpl.java b/juick-server/src/main/java/com/juick/service/UserServiceImpl.java new file mode 100644 index 00000000..63785cff --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/UserServiceImpl.java @@ -0,0 +1,614 @@ +package com.juick.service; + +import com.juick.User; +import com.juick.server.helpers.Auth; +import com.juick.server.helpers.EmailOpts; +import com.juick.server.helpers.UserInfo; +import com.juick.util.UserUtils; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +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.util.StringUtils; + +import javax.inject.Inject; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.*; + +/** + * Created by aalexeev on 11/13/16. + */ +@Repository +public class UserServiceImpl extends BaseJdbcService implements UserService { + + private class UserMapper implements RowMapper { + @Override + public User mapRow(ResultSet rs, int rowNum) throws SQLException { + User user = new User(); + user.setUid(rs.getInt(1)); + user.setName(rs.getString(2)); + user.setBanned(rs.getBoolean(3)); + return user; + } + } + + @Inject + public UserServiceImpl(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate, null); + } + + @Transactional + @Override + public String getSignUpHashByJID(final String jid) { + String hash; + try { + hash = getJdbcTemplate().queryForObject( + "SELECT loginhash FROM jids WHERE jid=? AND user_id IS NULL", + String.class, + jid); + } catch (EmptyResultDataAccessException e) { + hash = UUID.randomUUID().toString(); + getJdbcTemplate().update("INSERT INTO jids(jid,loginhash) VALUES (?,?)", jid, hash); + } + return hash; + } + + @Transactional + @Override + public String getSignUpHashByTelegramID(final Long telegramId, final String username) { + try { + return getJdbcTemplate().queryForObject( + "SELECT loginhash FROM telegram WHERE tg_id=? AND user_id IS NULL", + String.class, + telegramId); + } catch (EmptyResultDataAccessException e) { + String hash = UUID.randomUUID().toString(); + getJdbcTemplate().update( + "INSERT INTO telegram(tg_id, loginhash, tg_name) VALUES (?, ?, ?)", telegramId, hash, username); + return hash; + } + } + + @Transactional + @Override + public int createUser(final String username, final String password) { + KeyHolder holder = new GeneratedKeyHolder(); + 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; + } + + 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) { + try { + return Optional.of( + getJdbcTemplate().queryForObject("SELECT id, nick,banned FROM users WHERE id=?", + new UserMapper(), + uid)); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } + } + + @Transactional(readOnly = true) + @Override + public User getUserByName(final String username) { + try { + return getJdbcTemplate().queryForObject( + "SELECT id,nick,banned FROM users WHERE nick=?", + new UserMapper(), + username); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public User getUserByJID(final String jid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT id,nick,banned FROM users WHERE id=(SELECT user_id FROM jids WHERE jid=?)", + new UserMapper(), + jid); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public List getUsersByName(final List unames) { + if (!unames.isEmpty()) { + return getJdbcTemplate().query( + "SELECT id,nick,banned FROM users WHERE nick IN (\"" + StringUtils.arrayToDelimitedString(unames.toArray(), "\",\"") + "\")", + new UserMapper()); + } + return Collections.emptyList(); + } + + @Transactional(readOnly = true) + @Override + public List getUsersByID(final List uids) { + if (!uids.isEmpty()) { + return getJdbcTemplate().query( + "SELECT id,nick,banned FROM users WHERE id IN (" + StringUtils.arrayToCommaDelimitedString(uids.toArray()) + ")", + new UserMapper()); + } + return Collections.emptyList(); + } + + @Transactional(readOnly = true) + @Override + public List getUsersByJID(final List jids) { + if (!jids.isEmpty()) { + return getJdbcTemplate().query( + "SELECT users.id,users.nick,jids.jid FROM users " + + "INNER JOIN jids ON jids.user_id=users.id " + + "WHERE jids.jid IN (\"" + StringUtils.arrayToDelimitedString(jids.toArray(), "\",\"") + "\")", + (rs, rowNum) -> { + com.juick.User user = new com.juick.User(); + user.setUid(rs.getInt(1)); + user.setName(rs.getString(2)); + user.setJID(rs.getString(3)); + return user; + }); + } + return Collections.emptyList(); + } + + @Transactional(readOnly = true) + @Override + public List getJIDsbyUID(final int uid) { + 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) { + try { + return getJdbcTemplate().queryForObject("SELECT user_id FROM jids WHERE jid=?", Integer.class, jid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional(readOnly = true) + @Override + public int getUIDbyName(final String uname) { + try { + return getJdbcTemplate().queryForObject("SELECT id FROM users WHERE nick=?", Integer.class, uname); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional(readOnly = true) + @Override + public int getUIDbyHash(final String hash) { + try { + return getJdbcTemplate().queryForObject("SELECT user_id FROM logins WHERE hash=?", Integer.class, hash); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional(readOnly = true) + @Override + public com.juick.User getUserByHash(final String hash) { + try { + User user = getJdbcTemplate().queryForObject( + "SELECT logins.user_id,users.nick, users.banned FROM logins " + + "INNER JOIN users ON logins.user_id=users.id WHERE logins.hash=?", + new UserMapper(), + hash); + user.setAuthHash(hash); + return user; + } catch (EmptyResultDataAccessException e) { + return new User(); + } + } + + @Transactional + @Override + public String getHashByUID(final int uid) { + try { + return getJdbcTemplate().queryForObject( + "SELECT hash FROM logins WHERE user_id=?", String.class, uid); + } catch (EmptyResultDataAccessException e) { + String hash = UserUtils.generateHash(16); + getJdbcTemplate().update(con -> { + PreparedStatement stmt = con.prepareStatement("INSERT INTO logins(user_id,hash) VALUES (?,?)"); + stmt.setInt(1, uid); + stmt.setString(2, hash); + return stmt; + }); + return hash; + } + } + + @Transactional(readOnly = true) + @Override + public int checkPassword(final String username, final String password) { + try { + String realPassword = getJdbcTemplate().queryForObject( + "SELECT passw FROM users WHERE nick=?", String.class, username); + if (realPassword.equals(password)) { + User user = getUserByName(username); + if (user != null) { + return user.getUid(); + } else { + return -1; + } + } else { + return -1; + } + } catch (EmptyResultDataAccessException e) { + return -1; + } + } + + @Transactional + @Override + public boolean updatePassword(final User user, final String newPassword) { + return user.getUid() > 0 && getJdbcTemplate().update("UPDATE users SET passw=? WHERE id=?", newPassword, user.getUid()) > 0; + } + + @Transactional + @Override + public String updateSecretEmail(final User user) { + String newHash = UserUtils.generateHash(16); + if (getJdbcTemplate().update( + "INSERT INTO mail(user_id,hash) VALUES (?,?) ON DUPLICATE KEY UPDATE hash=?", + user.getUid(), + newHash, + newHash) > 0) { + return newHash; + } + return ""; + } + + @Transactional(readOnly = true) + @Override + public int getUserOptionInt(final int uid, final String option, final int defaultValue) { + try { + return getJdbcTemplate().queryForObject("SELECT " + option + " FROM useroptions WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return defaultValue; + } + } + + @Transactional(readOnly = true) + @Override + public void setUserOptionInt(final int uid, final String option, final int value) { + getJdbcTemplate().update("UPDATE useroptions SET " + option + "=? WHERE user_id=?", value, uid); + } + + @Transactional(readOnly = true) + @Override + public UserInfo getUserInfo(final User user) { + try { + return getJdbcTemplate().queryForObject("SELECT fullname,country,url,descr FROM usersinfo WHERE user_id=?", + ((rs, rowNum) -> { + UserInfo info = new UserInfo(); + info.setFullName(rs.getString(1)); + info.setCountry(rs.getString(2)); + info.setUrl(rs.getString(3)); + info.setDescription(rs.getString(4)); + return info; + }), user.getUid()); + } catch (EmptyResultDataAccessException e) { + return new UserInfo(); + } + } + + @Transactional + @Override + public boolean updateUserInfo(final User user, final UserInfo info) { + return getJdbcTemplate().update( + "INSERT INTO usersinfo(user_id,fullname,country,url,descr) VALUES (?,?,?,?,?) " + + "ON DUPLICATE KEY UPDATE fullname=?,country=?,url=?,descr=?", + user.getUid(), + info.getFullName(), + info.getCountry(), + info.getUrl(), + info.getDescription(), + info.getFullName(), + info.getCountry(), + info.getUrl(), + info.getDescription()) > 0; + } + + @Transactional(readOnly = true) + @Override + public boolean getCanMedia(final int uid) { + try { + int res = getJdbcTemplate().queryForObject( + "SELECT users.lastphoto-UNIX_TIMESTAMP() FROM users WHERE id=?", + Integer.class, + uid); + return res < 3600; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public boolean isInWL(final int uid, final int check) { + try { + return getJdbcTemplate().queryForObject( + "SELECT 1 FROM wl_users WHERE user_id=? AND wl_user_id=?", + Integer.class, uid, check) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public boolean isInBL(final int uid, final int check) { + try { + return getJdbcTemplate().queryForObject("SELECT 1 FROM bl_users WHERE user_id=? AND bl_user_id=?", + Integer.class, uid, check) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public boolean isInBLAny(final int uid, final int uid2) { + try { + return getJdbcTemplate().queryForObject("SELECT 1 FROM bl_users " + + "WHERE (user_id=? AND bl_user_id=?) " + + "OR (user_id=? AND bl_user_id=?)", new Object[]{uid, uid2, uid2, uid}, Integer.class) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public List checkBL(final int visitor, final List uids) { + if (!uids.isEmpty()) { + return getJdbcTemplate().queryForList( + "SELECT user_id FROM bl_users WHERE bl_user_id=? and user_id IN (" + + StringUtils.collectionToCommaDelimitedString(uids) + ")", + Integer.class, + visitor); + } else { + return new ArrayList<>(); + } + } + + @Transactional(readOnly = true) + @Override + public boolean isSubscribed(final int uid, final int check) { + try { + return getJdbcTemplate().queryForObject( + "SELECT 1 FROM subscr_users WHERE suser_id=? AND user_id=?", + Integer.class, uid, check) == 1; + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + @Transactional(readOnly = true) + @Override + public List getUserRead(final int uid) { + return getJdbcTemplate().queryForList( + "SELECT user_id FROM subscr_users WHERE suser_id=?", Integer.class, uid); + } + + @Transactional(readOnly = true) + @Override + public List getUserReadLeastPopular(final int uid, final int cnt) { + return getJdbcTemplate().query( + "SELECT users.id,users.nick FROM (subscr_users " + + "INNER JOIN users_subscr ON (subscr_users.suser_id=? " + + "AND subscr_users.user_id=users_subscr.user_id)) INNER JOIN users " + + "ON subscr_users.user_id=users.id ORDER BY cnt LIMIT ?", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, + uid, + cnt); + } + + @Transactional(readOnly = true) + @Override + public List getUserReaders(final int uid) { + return getJdbcTemplate().query( + "SELECT users.id, users.nick FROM subscr_users " + + "INNER JOIN users ON subscr_users.suser_id=users.id " + + "WHERE subscr_users.user_id=? ORDER BY users.nick", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, + uid); + } + + @Transactional(readOnly = true) + @Override + public List getUserFriends(final int uid) { + return getJdbcTemplate().query( + "SELECT users.id,users.nick FROM subscr_users " + + "INNER JOIN users ON subscr_users.user_id=users.id " + + "WHERE subscr_users.suser_id=? AND users.id!=? " + + "ORDER BY users.nick", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, + uid, + uid); + } + + @Transactional(readOnly = true) + @Override + public List getUserBLUsers(final int uid) { + return getJdbcTemplate().query("SELECT users.id,users.nick FROM users INNER JOIN bl_users " + + "ON(bl_users.bl_user_id=users.id) WHERE bl_users.user_id=? ORDER BY users.nick", + (rs, num) -> { + com.juick.User u = new com.juick.User(); + u.setUid(rs.getInt(1)); + u.setName(rs.getString(2)); + return u; + }, uid); + } + + @Transactional + @Override + public boolean linkTwitterAccount( + final User user, final String accessToken, final String accessTokenSecret, final String screenName) { + if (getJdbcTemplate().update("INSERT INTO twitter(user_id,access_token,access_token_secret,uname) " + + "VALUES (?,?,?,?)" + + " ON DUPLICATE KEY UPDATE access_token=?,access_token_secret=?,uname=?", + user.getUid(), accessToken, accessTokenSecret, screenName, accessToken, accessTokenSecret, screenName) > 0) { + return getJdbcTemplate().update("INSERT INTO subscr_users(user_id,suser_id,jid) " + + "VALUES (?,1741,'juick\\@twitter.juick.com')", user.getUid()) > 0; + } + return false; + + } + + @Transactional(readOnly = true) + @Override + public int getStatsIRead(final int uid) { + try { + return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM subscr_users WHERE suser_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional(readOnly = true) + @Override + public int getStatsMyReaders(final int uid) { + try { + return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM subscr_users WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional(readOnly = true) + @Override + public int getStatsMessages(final int uid) { + try { + return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM messages WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional(readOnly = true) + @Override + public int getStatsReplies(final int uid) { + try { + return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM replies WHERE user_id=?", Integer.class, uid); + } catch (EmptyResultDataAccessException e) { + return 0; + } + } + + @Transactional + @Override + public boolean setActiveStatusForJID(final String JID, final UserService.ActiveStatus jidStatus) { + User user = getUserByJID(JID); + if (user != null) { + return getJdbcTemplate().update(con -> { + PreparedStatement preparedStatement = con.prepareStatement( + "UPDATE jids SET active=? WHERE user_id=? AND jid=?"); + int newStatus = jidStatus == UserService.ActiveStatus.Active ? 1 : 0; + preparedStatement.setInt(1, newStatus); + preparedStatement.setInt(2, user.getUid()); + preparedStatement.setString(3, JID); + return preparedStatement; + + }) >= 0; + } + return false; + } + + @Transactional(readOnly = true) + @Override + public List getAllJIDs(final User user) { + return getJdbcTemplate().queryForList( + "SELECT jid FROM jids WHERE user_id=?", String.class, user.getUid()); + } + + @Transactional(readOnly = true) + @Override + public List getAuthCodes(final User user) { + return getJdbcTemplate().query( + "SELECT account,authcode FROM auth WHERE user_id=? AND protocol='xmpp'", + (rs, num) -> new Auth(rs.getString(1), rs.getString(2)), + user.getUid()); + } + + @Transactional(readOnly = true) + @Override + public List getEmails(final User user) { + return getJdbcTemplate().queryForList("SELECT email FROM emails WHERE user_id=?", String.class, user.getUid()); + } + + @Transactional(readOnly = true) + @Override + public EmailOpts getEmailOpts(final User user) { + try { + return getJdbcTemplate().queryForObject( + "SELECT email,subscr_hour FROM emails WHERE user_id=? AND subscr_hour IS NOT NULL", + (rs, num) -> new EmailOpts(rs.getString(1), rs.getInt(2)), user.getUid()); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + @Transactional(readOnly = true) + @Override + public String getEmailHash(final User user) { + try { + return getJdbcTemplate().queryForObject( + "SELECT hash FROM mail WHERE user_id=?", + String.class, + user.getUid()) + + "@mail.juick.com"; + } catch (EmptyResultDataAccessException e) { + return ""; + } + } +} diff --git a/juick-server/src/main/java/com/juick/util/TagUtils.java b/juick-server/src/main/java/com/juick/util/TagUtils.java new file mode 100644 index 00000000..157522ab --- /dev/null +++ b/juick-server/src/main/java/com/juick/util/TagUtils.java @@ -0,0 +1,24 @@ +package com.juick.util; + +import com.juick.Tag; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Created by aalexeev on 11/13/16. + */ +public class TagUtils { + private TagUtils() { + throw new IllegalStateException(); + } + + public static String toString(final List tags) { + if (CollectionUtils.isEmpty(tags)) + return ""; + + return tags.stream().map(t -> " *" + t.getName()) + .collect(Collectors.joining()); + } +} diff --git a/juick-server/src/main/java/com/juick/util/ThreadHelper.java b/juick-server/src/main/java/com/juick/util/ThreadHelper.java new file mode 100644 index 00000000..64a56f7c --- /dev/null +++ b/juick-server/src/main/java/com/juick/util/ThreadHelper.java @@ -0,0 +1,37 @@ +package com.juick.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * Created by aalexeev on 11/11/16. + */ +public class ThreadHelper { + private ThreadHelper() { + throw new IllegalStateException(); + } + + private static Logger logger = LoggerFactory.getLogger(ThreadHelper.class); + + public static void shutdownAndAwaitTermination(ExecutorService pool) { + pool.shutdown(); // Disable new tasks from being submitted + try { + // Wait a while for existing tasks to terminate + if (!pool.awaitTermination(5, TimeUnit.SECONDS)) { + logger.info("Calls shutDownNow for pool"); + pool.shutdownNow(); // Cancel currently executing tasks + // Wait a while for tasks to respond to being cancelled + if (!pool.awaitTermination(5, TimeUnit.SECONDS)) + logger.error("Pool did not terminate"); + } + } catch (InterruptedException ie) { + // (Re-)Cancel if current thread also interrupted + pool.shutdownNow(); + // Preserve interrupt status + Thread.currentThread().interrupt(); + } + } +} diff --git a/juick-server/src/main/java/com/juick/util/UserUtils.java b/juick-server/src/main/java/com/juick/util/UserUtils.java new file mode 100644 index 00000000..611a3b15 --- /dev/null +++ b/juick-server/src/main/java/com/juick/util/UserUtils.java @@ -0,0 +1,27 @@ +package com.juick.util; + +import java.util.Random; + +/** + * Created by aalexeev on 11/14/16. + */ +public class UserUtils { + private UserUtils() { + throw new IllegalStateException(); + } + + private static final String ABCDEF = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public static String generateHash(final int len) { + Random rnd = new Random(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + sb.append(ABCDEF.charAt(rnd.nextInt(ABCDEF.length()))); + } + return sb.toString(); + } + + public static boolean checkUserNameValid(final String uname) { + return uname != null && uname.length() >= 2 && uname.length() <= 16 && uname.matches("[a-zA-Z0-9\\-]+"); + } +} diff --git a/juick-server/src/main/resources/juick.conf.example b/juick-server/src/main/resources/juick.conf.example new file mode 100644 index 00000000..c9411456 --- /dev/null +++ b/juick-server/src/main/resources/juick.conf.example @@ -0,0 +1,47 @@ +#Driver +datasource_driver=net.sf.log4jdbc.DriverSpy +!datasource_driver=com.mysql.jdbc.Driver + +#Url +!datasource_url=jdbc:mysql://localhost:3306/juick?autoReconnect=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF8 +datasource_url=jdbc:log4jdbc:mysql://localhost:3306/juick?autoReconnect=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF8 + +#Username +datasource_user= + +#Password +datasource_password= + +twitter_consumer_key= +twitter_consumer_secret= + +crosspost_jid= +ws_jid= +push_jid= + +xmpp_host= +xmpp_port= +xmpp_password= + +push_xmpp_password= + +wns_application_sip= +wns_client_secret= +gcm_key= + +hostname= +componentname= +component_name= +component_host= +component_port= +s2s_port= +xmppbot_jid=juick@juick.com/Juick + +keystore= +keystore_password= +broken_ssl_hosts= +banned_hosts= + +upload_tmp_dir= + +xmpp_disabled=false \ No newline at end of file diff --git a/juick-server/src/main/resources/logback.xml.example b/juick-server/src/main/resources/logback.xml.example new file mode 100644 index 00000000..05a3cfdf --- /dev/null +++ b/juick-server/src/main/resources/logback.xml.example @@ -0,0 +1,35 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/juick-server/src/main/resources/schema.sql b/juick-server/src/main/resources/schema.sql new file mode 100644 index 00000000..90bb4ed4 --- /dev/null +++ b/juick-server/src/main/resources/schema.sql @@ -0,0 +1,885 @@ +-- MySQL dump 10.13 Distrib 5.5.44, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: juick +-- ------------------------------------------------------ +-- Server version 5.5.44-0+deb8u1-log +use juick; +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `ads_messages` +-- + +DROP TABLE IF EXISTS `ads_messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ads_messages` ( + `message_id` int(10) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ads_messages_log` +-- + +DROP TABLE IF EXISTS `ads_messages_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ads_messages_log` ( + `user_id` int(10) unsigned NOT NULL, + `message_id` int(10) unsigned NOT NULL, + `ts` int(10) unsigned NOT NULL DEFAULT '0' +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `android` +-- + +DROP TABLE IF EXISTS `android`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `android` ( + `user_id` int(10) unsigned NOT NULL, + `regid` char(255) NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY `regid` (`regid`), + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth` +-- + +DROP TABLE IF EXISTS `auth`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `auth` ( + `user_id` int(10) unsigned NOT NULL, + `protocol` enum('xmpp','email','sms') NOT NULL, + `account` char(64) NOT NULL, + `authcode` char(8) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bl_tags` +-- + +DROP TABLE IF EXISTS `bl_tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `bl_tags` ( + `user_id` int(10) unsigned NOT NULL, + `tag_id` int(10) unsigned NOT NULL, + KEY `tag_id` (`tag_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `bl_users` +-- + +DROP TABLE IF EXISTS `bl_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `bl_users` ( + `user_id` int(10) unsigned NOT NULL, + `bl_user_id` int(10) unsigned NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`user_id`,`bl_user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captcha` +-- + +DROP TABLE IF EXISTS `captcha`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `captcha` ( + `jid` char(64) NOT NULL, + `hash` char(16) NOT NULL, + `confirmed` tinyint(4) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captchaimg` +-- + +DROP TABLE IF EXISTS `captchaimg`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `captchaimg` ( + `id` char(16) NOT NULL, + `txt` char(6) NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ip` char(16) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `emails` +-- + +DROP TABLE IF EXISTS `emails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `emails` ( + `user_id` int(10) unsigned NOT NULL, + `email` char(64) NOT NULL, + `subscr_hour` tinyint(4) DEFAULT NULL, + KEY `email` (`email`) USING HASH +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `facebook` +-- + +DROP TABLE IF EXISTS `facebook`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `facebook` ( + `user_id` int(10) unsigned DEFAULT NULL, + `fb_id` bigint(20) unsigned NOT NULL, + `loginhash` char(36) DEFAULT NULL, + `access_token` char(255) DEFAULT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `fb_name` char(64) NOT NULL, + `fb_link` char(64) NOT NULL, + `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1', + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `favorites` +-- + +DROP TABLE IF EXISTS `favorites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `favorites` ( + `user_id` int(10) unsigned NOT NULL, + `message_id` int(10) unsigned NOT NULL, + `ts` datetime NOT NULL, + UNIQUE KEY `user_id_2` (`user_id`,`message_id`), + KEY `user_id` (`user_id`), + KEY `message_id` (`message_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `friends_facebook` +-- + +DROP TABLE IF EXISTS `friends_facebook`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `friends_facebook` ( + `user_id` int(10) unsigned NOT NULL, + `friend_id` bigint(20) unsigned NOT NULL, + UNIQUE KEY `user_id` (`user_id`,`friend_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `images` +-- + +DROP TABLE IF EXISTS `images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `images` ( + `mid` int(10) unsigned NOT NULL, + `rid` int(10) unsigned NOT NULL, + `thumb` int(10) unsigned NOT NULL, + `small` int(10) unsigned NOT NULL, + `medium` int(10) unsigned NOT NULL, + `height` int(10) unsigned NOT NULL, + `width` int(10) unsigned NOT NULL, + PRIMARY KEY (`mid`,`rid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ios` +-- + +DROP TABLE IF EXISTS `ios`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ios` ( + `user_id` int(10) unsigned NOT NULL, + `token` char(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY `token` (`token`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `jids` +-- + +DROP TABLE IF EXISTS `jids`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `jids` ( + `user_id` int(10) unsigned DEFAULT NULL, + `jid` char(64) NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `loginhash` char(36) DEFAULT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY `jid` (`jid`), + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `logins` +-- + +DROP TABLE IF EXISTS `logins`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `logins` ( + `user_id` int(10) unsigned NOT NULL, + `hash` char(16) NOT NULL, + UNIQUE KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mail` +-- + +DROP TABLE IF EXISTS `mail`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `mail` ( + `user_id` int(10) unsigned NOT NULL, + `hash` char(16) NOT NULL, + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `meon` +-- + +DROP TABLE IF EXISTS `meon`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `meon` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(10) unsigned NOT NULL, + `link` char(255) NOT NULL, + `name` char(32) NOT NULL, + `ico` smallint(5) unsigned DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `messages` +-- + +DROP TABLE IF EXISTS `messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages` ( + `message_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(10) unsigned NOT NULL, + `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__', + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `replies` smallint(5) unsigned NOT NULL DEFAULT '0', + `maxreplyid` smallint(5) unsigned NOT NULL DEFAULT '0', + `privacy` tinyint(4) NOT NULL DEFAULT '1', + `readonly` tinyint(1) NOT NULL DEFAULT '0', + `attach` enum('jpg','mp4','png') DEFAULT NULL, + `place_id` int(10) unsigned DEFAULT NULL, + `lat` decimal(10,7) DEFAULT NULL, + `lon` decimal(10,7) DEFAULT NULL, + `popular` tinyint(4) NOT NULL DEFAULT '0', + `hidden` tinyint(3) unsigned NOT NULL DEFAULT '0', + `likes` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`message_id`), + KEY `user_id` (`user_id`), + KEY `ts` (`ts`), + KEY `attach` (`attach`), + KEY `place_id` (`place_id`), + KEY `popular` (`popular`), + KEY `hidden` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `messages_access` +-- + +DROP TABLE IF EXISTS `messages_access`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages_access` ( + `message_id` int(10) unsigned NOT NULL, + `user_id` int(10) unsigned NOT NULL, + KEY `message_id` (`message_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `messages_tags` +-- + +DROP TABLE IF EXISTS `messages_tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages_tags` ( + `message_id` int(10) unsigned NOT NULL, + `tag_id` int(10) unsigned NOT NULL, + UNIQUE KEY `message_id_2` (`message_id`,`tag_id`), + KEY `message_id` (`message_id`), + KEY `tag_id` (`tag_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `messages_txt` +-- + +DROP TABLE IF EXISTS `messages_txt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages_txt` ( + `message_id` int(10) unsigned NOT NULL, + `tags` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `repliesby` varchar(96) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `txt` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`message_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `messages_votes` +-- + +DROP TABLE IF EXISTS `messages_votes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages_votes` ( + `message_id` int(10) unsigned NOT NULL, + `user_id` int(10) unsigned NOT NULL, + `vote` tinyint(4) NOT NULL DEFAULT '1', + UNIQUE KEY `message_id` (`message_id`,`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `places` ( + `place_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `lat` decimal(10,7) NOT NULL, + `lon` decimal(10,7) NOT NULL, + `name` char(64) NOT NULL, + `descr` char(255) DEFAULT NULL, + `url` char(128) DEFAULT NULL, + `user_id` int(10) unsigned NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`place_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places_tags` +-- + +DROP TABLE IF EXISTS `places_tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `places_tags` ( + `place_id` int(10) unsigned NOT NULL, + `tag_id` int(10) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `pm` +-- + +DROP TABLE IF EXISTS `pm`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pm` ( + `user_id` int(10) unsigned NOT NULL, + `user_id_to` int(10) unsigned NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `txt` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `pm_inroster` +-- + +DROP TABLE IF EXISTS `pm_inroster`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pm_inroster` ( + `user_id` int(10) unsigned NOT NULL, + `jid` char(64) NOT NULL, + UNIQUE KEY `user_id_2` (`user_id`,`jid`), + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `pm_streams` +-- + +DROP TABLE IF EXISTS `pm_streams`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pm_streams` ( + `user_id` int(10) unsigned NOT NULL, + `user_id_to` int(10) unsigned NOT NULL, + `lastmessage` datetime NOT NULL, + `lastview` datetime DEFAULT NULL, + `unread` smallint(5) unsigned NOT NULL DEFAULT '0', + UNIQUE KEY `user_id` (`user_id`,`user_id_to`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `presence` +-- + +DROP TABLE IF EXISTS `presence`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `presence` ( + `user_id` int(10) unsigned NOT NULL, + `jid` char(64) DEFAULT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY `jid` (`jid`) +) ENGINE=MEMORY DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `reader_links` +-- + +DROP TABLE IF EXISTS `reader_links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `reader_links` ( + `link_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `rss_id` int(10) unsigned NOT NULL, + `url` char(255) NOT NULL, + `title` char(255) NOT NULL, + `ts` datetime NOT NULL, + PRIMARY KEY (`link_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `reader_rss` +-- + +DROP TABLE IF EXISTS `reader_rss`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `reader_rss` ( + `rss_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `url` char(255) NOT NULL, + `lastcheck` datetime NOT NULL, + PRIMARY KEY (`rss_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `replies` +-- + +DROP TABLE IF EXISTS `replies`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `replies` ( + `message_id` int(10) unsigned NOT NULL, + `reply_id` smallint(5) unsigned NOT NULL, + `user_id` int(10) unsigned NOT NULL, + `replyto` smallint(5) unsigned NOT NULL DEFAULT '0', + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `attach` enum('jpg','mp4','png') COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `txt` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + KEY `message_id` (`message_id`), + KEY `user_id` (`user_id`), + KEY `ts` (`ts`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `sphinx` +-- + +DROP TABLE IF EXISTS `sphinx`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `sphinx` ( + `counter_id` tinyint(3) unsigned NOT NULL, + `max_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`counter_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `subscr_messages` +-- + +DROP TABLE IF EXISTS `subscr_messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `subscr_messages` ( + `message_id` int(10) unsigned NOT NULL, + `suser_id` int(10) unsigned NOT NULL, + UNIQUE KEY `message_id` (`message_id`,`suser_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `subscr_tags` +-- + +DROP TABLE IF EXISTS `subscr_tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `subscr_tags` ( + `tag_id` int(10) unsigned NOT NULL, + `suser_id` int(10) unsigned NOT NULL, + `jid` char(64) NOT NULL, + `active` bit(1) NOT NULL DEFAULT b'1', + UNIQUE KEY `tag_id` (`tag_id`,`suser_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `subscr_users` +-- + +DROP TABLE IF EXISTS `subscr_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `subscr_users` ( + `user_id` int(10) unsigned NOT NULL, + `suser_id` int(10) unsigned NOT NULL, + `jid` char(64) DEFAULT NULL, + `active` bit(1) NOT NULL DEFAULT b'1', + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY `user_id` (`user_id`,`suser_id`), + KEY `suser_id` (`suser_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tags` +-- + +DROP TABLE IF EXISTS `tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tags` ( + `tag_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `synonym_id` int(10) unsigned DEFAULT NULL, + `name` char(70) DEFAULT NULL, + `top` tinyint(1) unsigned NOT NULL DEFAULT '0', + `noindex` tinyint(1) unsigned NOT NULL DEFAULT '0', + `stat_messages` int(10) unsigned NOT NULL DEFAULT '0', + `stat_users` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`tag_id`), + KEY `synonym_id` (`synonym_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tags_ignore` +-- + +DROP TABLE IF EXISTS `tags_ignore`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tags_ignore` ( + `tag_id` int(10) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tags_synonyms` +-- + +DROP TABLE IF EXISTS `tags_synonyms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tags_synonyms` ( + `name` char(64) NOT NULL, + `changeto` char(64) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `telegram` +-- + +DROP TABLE IF EXISTS `telegram`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `telegram` ( + `user_id` int(10) unsigned DEFAULT NULL, + `tg_id` bigint(20) NOT NULL, + `tg_name` char(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `loginhash` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `telegram_chats` +-- + +DROP TABLE IF EXISTS `telegram_chats`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `telegram_chats` ( + `chat_id` bigint(20) DEFAULT NULL, + UNIQUE KEY `chat_id` (`chat_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `top_ignore_messages` +-- + +DROP TABLE IF EXISTS `top_ignore_messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `top_ignore_messages` ( + `message_id` int(10) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `top_ignore_tags` +-- + +DROP TABLE IF EXISTS `top_ignore_tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `top_ignore_tags` ( + `tag_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`tag_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `top_ignore_users` +-- + +DROP TABLE IF EXISTS `top_ignore_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `top_ignore_users` ( + `user_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `twitter` +-- + +DROP TABLE IF EXISTS `twitter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `twitter` ( + `user_id` int(10) unsigned NOT NULL, + `access_token` char(64) NOT NULL, + `access_token_secret` char(64) NOT NULL, + `uname` char(64) NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `useroptions` +-- + +DROP TABLE IF EXISTS `useroptions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `useroptions` ( + `user_id` int(10) unsigned NOT NULL, + `jnotify` tinyint(1) NOT NULL DEFAULT '1', + `subscr_active` tinyint(1) NOT NULL DEFAULT '1', + `off_ts` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `xmppxhtml` tinyint(1) NOT NULL DEFAULT '0', + `subscr_notify` tinyint(1) NOT NULL DEFAULT '1', + `recommendations` tinyint(1) NOT NULL DEFAULT '1', + `privacy_view` tinyint(1) NOT NULL DEFAULT '1', + `privacy_reply` tinyint(1) NOT NULL DEFAULT '1', + `privacy_pm` tinyint(1) NOT NULL DEFAULT '1', + `repliesview` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`user_id`), + KEY `recommendations` (`recommendations`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `nick` char(64) NOT NULL, + `passw` char(32) NOT NULL, + `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__', + `banned` tinyint(3) unsigned NOT NULL DEFAULT '0', + `lastmessage` int(11) NOT NULL DEFAULT '0', + `lastpm` int(11) NOT NULL DEFAULT '0', + `lastphoto` int(11) NOT NULL DEFAULT '0', + `karma` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `nick` (`nick`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users_refs` +-- + +DROP TABLE IF EXISTS `users_refs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `users_refs` ( + `user_id` int(10) unsigned NOT NULL, + `ref` int(10) unsigned NOT NULL, + KEY `ref` (`ref`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users_subscr` +-- + +DROP TABLE IF EXISTS `users_subscr`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `users_subscr` ( + `user_id` int(10) unsigned NOT NULL, + `cnt` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `usersinfo` +-- + +DROP TABLE IF EXISTS `usersinfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `usersinfo` ( + `user_id` int(10) unsigned NOT NULL, + `jid` char(32) DEFAULT NULL, + `fullname` char(32) DEFAULT NULL, + `country` char(32) DEFAULT NULL, + `url` char(64) DEFAULT NULL, + `gender` char(32) DEFAULT NULL, + `bday` char(10) DEFAULT NULL, + `descr` varchar(255) DEFAULT NULL, + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vk` +-- + +DROP TABLE IF EXISTS `vk`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `vk` ( + `user_id` int(10) unsigned DEFAULT NULL, + `vk_id` bigint(20) NOT NULL, + `loginhash` char(36) DEFAULT NULL, + `access_token` char(128) NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `vk_name` char(64) NOT NULL, + `vk_link` char(64) NOT NULL, + `crosspost` tinyint(3) unsigned NOT NULL DEFAULT '1', + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `winphone` +-- + +DROP TABLE IF EXISTS `winphone`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `winphone` ( + `user_id` int(10) unsigned NOT NULL, + `url` char(255) NOT NULL, + `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY `url` (`url`), + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `wl_users` +-- + +DROP TABLE IF EXISTS `wl_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wl_users` ( + `user_id` int(10) unsigned NOT NULL, + `wl_user_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`user_id`,`wl_user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-09-03 14:32:11 diff --git a/juick-ws/build.gradle b/juick-ws/build.gradle index 4148b741..c0f62215 100644 --- a/juick-ws/build.gradle +++ b/juick-ws/build.gradle @@ -19,7 +19,7 @@ repositories { def springFrameworkVersion = '4.3.4.RELEASE' dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' compile 'org.bitbucket.sco0ter.babbler:xmpp-extensions-client:279e488e51' compile "org.springframework:spring-webmvc:${springFrameworkVersion}" diff --git a/juick-www/build.gradle b/juick-www/build.gradle index c6c2b637..69813f8d 100644 --- a/juick-www/build.gradle +++ b/juick-www/build.gradle @@ -26,7 +26,7 @@ repositories { def springFrameworkVersion = '4.3.4.RELEASE' dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' compile 'org.bitbucket.sco0ter.babbler:xmpp-extensions-client:279e488e51' compile 'com.github.scribejava:scribejava-apis:3.2.0' diff --git a/juick-xmpp-bot/build.gradle b/juick-xmpp-bot/build.gradle index 5f458fa9..b2a20b0e 100644 --- a/juick-xmpp-bot/build.gradle +++ b/juick-xmpp-bot/build.gradle @@ -11,7 +11,7 @@ repositories { def springFrameworkVersion = '4.3.4.RELEASE' dependencies { - compile project(':server-core') + compile project(':juick-server') compile "org.springframework:spring-webmvc:${springFrameworkVersion}" compile 'com.mitchellbosecke:pebble-spring4:2.2.3' compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' diff --git a/juick-xmpp-ft/build.gradle b/juick-xmpp-ft/build.gradle index 5f458fa9..b2a20b0e 100644 --- a/juick-xmpp-ft/build.gradle +++ b/juick-xmpp-ft/build.gradle @@ -11,7 +11,7 @@ repositories { def springFrameworkVersion = '4.3.4.RELEASE' dependencies { - compile project(':server-core') + compile project(':juick-server') compile "org.springframework:spring-webmvc:${springFrameworkVersion}" compile 'com.mitchellbosecke:pebble-spring4:2.2.3' compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51' diff --git a/juick-xmpp/build.gradle b/juick-xmpp/build.gradle index 892e23cb..cf9af133 100644 --- a/juick-xmpp/build.gradle +++ b/juick-xmpp/build.gradle @@ -13,7 +13,7 @@ def jacksonVersion = '2.8.4' def slf4jVersion = '1.7.21' dependencies { - compile project(':server-core') + compile project(':juick-server') compile 'com.github.juick:com.juick.xmpp:dbf603cfff' compile "org.slf4j:slf4j-api:${slf4jVersion}" compile "org.springframework:spring-webmvc:${springFrameworkVersion}" diff --git a/readme.txt b/readme.txt index 8af7c96e..ec4affed 100644 --- a/readme.txt +++ b/readme.txt @@ -8,7 +8,7 @@ mysql -u user -p create database juick; exit -mysql -u user -p < server-core/src/main/resources/schema.sql +mysql -u user -p < juick-server/src/main/resources/schema.sql mysql -u user -p use juick; diff --git a/server-core/build.gradle b/server-core/build.gradle deleted file mode 100644 index 705b7675..00000000 --- a/server-core/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -apply plugin: 'java' -apply plugin: 'com.github.ben-manes.versions' - -sourceCompatibility = 1.8 - -repositories { - mavenCentral() -} - -def jacksonVersion = '2.8.4' -def logbackVersion = '1.1.7' -def slf4jVersion = '1.7.21' -def springFrameworkVersion = '4.3.4.RELEASE' - -dependencies { - compile project(':juick-core') - compile "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" - compile "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" - compile "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" - compile "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jacksonVersion}" - - compile "ch.qos.logback:logback-classic:${logbackVersion}" - compile "ch.qos.logback:logback-core:${logbackVersion}" - compile "ch.qos.logback:logback-access:${logbackVersion}" - - compile "org.slf4j:slf4j-api:${slf4jVersion}" - compile "org.slf4j:jcl-over-slf4j:${slf4jVersion}" - compile "org.slf4j:log4j-over-slf4j:${slf4jVersion}" - compile "org.slf4j:jul-to-slf4j:${slf4jVersion}" - - compile 'org.apache.httpcomponents:httpclient:4.5.2' - compile 'org.apache.commons:commons-lang3:3.5' - compile 'org.apache.commons:commons-collections4:4.1' - compile 'commons-io:commons-io:2.5' - - compile "org.springframework:spring-context:${springFrameworkVersion}" - compile "org.springframework:spring-jdbc:${springFrameworkVersion}" - - compile 'org.apache.commons:commons-dbcp2:2.1.1' - compile 'org.json:json:20160810' - compile 'javax.inject:javax.inject:1' -} - -compileJava.options.encoding = 'UTF-8' - -configurations { - all*.exclude module: 'commons-logging' -} diff --git a/server-core/src/main/java/com/juick/configuration/DataConfiguration.java b/server-core/src/main/java/com/juick/configuration/DataConfiguration.java deleted file mode 100644 index 88fc00b3..00000000 --- a/server-core/src/main/java/com/juick/configuration/DataConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.juick.configuration; - -import org.apache.commons.dbcp2.BasicDataSource; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.transaction.annotation.TransactionManagementConfigurer; - -import javax.annotation.Resource; -import javax.sql.DataSource; - -/** - * Created by aalexeev on 11/11/16. - */ -@Configuration -@EnableTransactionManagement -@PropertySource(value = {"classpath:juick.conf"}) -@ComponentScan(basePackages = {"com.juick.service"}) -public class DataConfiguration implements TransactionManagementConfigurer { - @Resource - private Environment env; - - @Bean - public DataSource dataSource() { - BasicDataSource dataSource = new BasicDataSource(); - - dataSource.setDriverClassName(env.getProperty("datasource_driver", "com.mysql.jdbc.Driver")); - dataSource.setUrl(env.getProperty("datasource_url")); - dataSource.setUsername(env.getProperty("datasource_user", "")); - dataSource.setPassword(env.getProperty("datasource_password", "")); - - dataSource.setValidationQuery("select 1"); - - return dataSource; - } - - @Bean - public PlatformTransactionManager transactionManager() { - return new DataSourceTransactionManager(dataSource()); - } - - @Override - public PlatformTransactionManager annotationDrivenTransactionManager() { - return transactionManager(); - } - - @Bean - public JdbcTemplate jdbcTemplate() { - return new JdbcTemplate(dataSource()); - } -} diff --git a/server-core/src/main/java/com/juick/server/AdsQueries.java b/server-core/src/main/java/com/juick/server/AdsQueries.java deleted file mode 100644 index 06590817..00000000 --- a/server-core/src/main/java/com/juick/server/AdsQueries.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2011, ugnich - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.server; - -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; - -/** - * - * @author ugnich - */ -public class AdsQueries { - - public static int getAdMID(JdbcTemplate sql, int uid) { - if (uid > 0) { - try { - return sql.queryForObject("SELECT message_id FROM ads_messages " + - "WHERE message_id NOT IN (SELECT message_id FROM ads_messages_log WHERE user_id=? " + - "AND ts>UNIX_TIMESTAMP()-60*60*24 GROUP BY message_id HAVING COUNT(*)>2) ORDER BY RAND() LIMIT 1", - Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } else { - try { - return sql.queryForObject("SELECT message_id FROM ads_messages ORDER BY RAND() LIMIT 1", Integer.class); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - } - - public static void logAdMID(JdbcTemplate sql, int uid, int mid) { - sql.update("INSERT INTO ads_messages_log(user_id,message_id,ts) VALUES (?,?,UNIX_TIMESTAMP())", uid, mid); - } -} diff --git a/server-core/src/main/java/com/juick/server/CrosspostQueries.java b/server-core/src/main/java/com/juick/server/CrosspostQueries.java deleted file mode 100644 index 827dad09..00000000 --- a/server-core/src/main/java/com/juick/server/CrosspostQueries.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2013, Ugnich Anton - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.server; - -import com.juick.server.helpers.ApplicationStatus; -import org.apache.commons.lang3.tuple.Pair; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.Optional; - -/** - * - * @author ugnich - */ -public class CrosspostQueries { - - public static Optional> getTwitterTokens(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT access_token,access_token_secret FROM twitter WHERE user_id=? AND crosspost=1", - (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), uid); - } catch (EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - public static Optional getFacebookToken(JdbcTemplate sql, int uid) { - try { - return Optional.of(sql.queryForObject("SELECT access_token FROM facebook WHERE user_id=? AND access_token IS NOT NULL " + - "AND crosspost=1", String.class, uid)); - } catch (EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - public static ApplicationStatus isFBCrossPostEnabled(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT 1, crosspost FROM facebook WHERE user_id=? LIMIT 1", (rs, num) -> { - ApplicationStatus status = new ApplicationStatus(); - status.setConnected(rs.getInt(1) > 0); - status.setCrosspostEnabled(rs.getBoolean(2)); - return status; - }, uid); - } catch (EmptyResultDataAccessException e) { - return new ApplicationStatus(); - } - } - - public static String getTwitterName(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT uname FROM twitter WHERE user_id=?", String.class, uid); - } catch (EmptyResultDataAccessException e) { - return ""; - } - } - - public static String getTelegramName(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT tg_name FROM telegram WHERE user_id=?", String.class, uid); - } catch (EmptyResultDataAccessException e) { - return ""; - } - } - - public static Optional> getVKTokens(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("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); - } catch (EmptyResultDataAccessException e) { - return Optional.empty(); - } - } -} diff --git a/server-core/src/main/java/com/juick/server/MessagesQueries.java b/server-core/src/main/java/com/juick/server/MessagesQueries.java deleted file mode 100644 index 9d4284bc..00000000 --- a/server-core/src/main/java/com/juick/server/MessagesQueries.java +++ /dev/null @@ -1,657 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2011, Ugnich Anton - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.server; - -import com.juick.Message; -import com.juick.Tag; -import com.juick.User; -import com.juick.server.helpers.PrivacyOpts; -import com.juick.util.MessageUtils; -import org.apache.commons.lang3.StringEscapeUtils; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.dao.IncorrectResultSizeDataAccessException; -import org.springframework.jdbc.core.ConnectionCallback; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.util.StringUtils; - -import java.sql.*; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * - * @author Ugnich Anton - */ -public class MessagesQueries { - - public static class MessageMapper implements RowMapper { - @Override - public Message mapRow(ResultSet rs, int rowNum) throws SQLException { - Message msg = new Message(); - msg.setMid(rs.getInt(1)); - msg.setRid(rs.getInt(2)); - msg.setReplyto(rs.getInt(3)); - User user = new User(); - user.setUid(rs.getInt(4)); - user.setName(rs.getString(5)); - user.setBanned(rs.getBoolean(6)); - msg.setUser(user); - msg.TimeAgo = rs.getInt(7); - msg.setDate(rs.getTimestamp(8)); - msg.ReadOnly = rs.getBoolean(9); - msg.setPrivacy(rs.getInt(10)); - msg.FriendsOnly = msg.getPrivacy() < 0; - msg.Replies = rs.getInt(11); - msg.AttachmentType = rs.getString(12); - if (rs.getDouble(13) != 0) { - msg.Place = new com.juick.Place(); - msg.Place.lat = rs.getDouble(14); - msg.Place.lon = rs.getDouble(15); - } - msg.Likes = rs.getInt(16); - msg.Hidden = rs.getBoolean(17); - // parse tags string - String tagsStr = rs.getString(18); - if (tagsStr != null) { - Arrays.stream(tagsStr.split(" ")).forEach(t -> msg.getTags().add(new Tag(t))); - } - msg.RepliesBy = rs.getString(19); - msg.setText(rs.getString(20)); - msg.setReplyQuote(MessageUtils.formatQuote(rs.getString(21))); - return msg; - } - } - - public static int createMessage(JdbcTemplate sql, int uid, String txt, String attachment, List tags) { - KeyHolder holder = new GeneratedKeyHolder(); - sql.update(con -> { - PreparedStatement stmt = con.prepareStatement("INSERT INTO messages(user_id,attach) VALUES (?,?)", - Statement.RETURN_GENERATED_KEYS); - stmt.setInt(1, uid); - if (attachment != null) { - stmt.setString(2, attachment); - } else { - stmt.setNull(2, Types.VARCHAR); - } - return stmt; - }, holder); - - int mid = holder.getKey().intValue(); - - - if (mid > 0) { - - String tagsNames = ""; - String tagsIDs = ""; - - for (int i = 0; i < tags.size(); i++) { - if (i > 0) { - tagsNames += " "; - tagsIDs += ","; - } - tagsNames += tags.get(i).getName(); - tagsIDs += "(" + mid + "," + tags.get(i).TID + ")"; - } - if (tags.size() > 0) { - sql.execute("INSERT INTO messages_tags(message_id,tag_id) VALUES " + tagsIDs); - } - final String finalTagsNames = tagsNames; - sql.update(con -> { - PreparedStatement stmt = con.prepareStatement("INSERT INTO messages_txt(message_id,tags,txt) " + - "VALUES (?,?,?)", Statement.NO_GENERATED_KEYS); - stmt.setInt(1, mid); - if (finalTagsNames.isEmpty()) { - stmt.setNull(2, Types.VARCHAR); - } else { - stmt.setString(2, finalTagsNames); - } - stmt.setString(3, txt); - return stmt; - }); - } - - return mid; - } - - public static int createReply(JdbcTemplate sql, int mid, int rid, int uid, String txt, String attachment) { - int ridnew = getReplyIDIncrement(sql, mid); - - sql.update( con -> { - PreparedStatement stmt = con.prepareStatement("INSERT INTO replies(message_id,reply_id,user_id," + - "replyto,attach,txt) VALUES (?,?,?,?,?,?)", Statement.NO_GENERATED_KEYS); - stmt.setInt(1, mid); - stmt.setInt(2, ridnew); - stmt.setInt(3, uid); - stmt.setInt(4, rid); - if (attachment != null) { - stmt.setString(5, attachment); - } else { - stmt.setNull(5, Types.VARCHAR); - } - stmt.setString(6, txt); - return stmt; - }); - - if (ridnew > 0) { - sql.update("UPDATE messages SET replies=replies+1 WHERE message_id=?", mid); - } - - return ridnew; - } - - public static int getReplyIDIncrement(JdbcTemplate sql, int mid) { - return sql.execute((ConnectionCallback) conn -> { - conn.setAutoCommit(false); - final int replyNo; - try (PreparedStatement ps = conn.prepareStatement("START TRANSACTION")) { - ps.executeUpdate(); - } - try (PreparedStatement ps = conn.prepareStatement("SELECT maxreplyid+1 FROM messages WHERE message_id=? FOR UPDATE")) { - ps.setInt(1, mid); - try (ResultSet resultSet = ps.executeQuery()) { - if (resultSet.next()) { - replyNo = resultSet.getInt(1); - } else { - throw new IncorrectResultSizeDataAccessException("while getting getReplyIDIncrement, mid=" + mid, 1, 0); - } - } - } - try (PreparedStatement ps = conn.prepareStatement("UPDATE messages SET maxreplyid=? WHERE message_id=?")) { - ps.setInt(1, replyNo); - ps.setInt(2, mid); - if (ps.executeUpdate() != 1) { - throw new IncorrectResultSizeDataAccessException("Cannot find a message to update: " + mid, 1, 0); - } - } - conn.commit(); - return replyNo; - }); - - } - - public static boolean recommendMessage(JdbcTemplate sql, int mid, int vuid) { - boolean res = sql.update("INSERT IGNORE INTO favorites(user_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; - if (res) { - sql.update("UPDATE messages SET likes=likes+1 WHERE message_id=?", mid); - } - return res; - } - - public static boolean canViewThread(JdbcTemplate sql, int mid, int uid) { - PrivacyOpts privacyOpts; - try { - privacyOpts = sql.queryForObject("SELECT user_id,privacy FROM messages WHERE messages.message_id=?", - (rs, rowNum) -> { - PrivacyOpts res = new PrivacyOpts(); - res.setUid(rs.getInt(1)); - res.setPrivacy(rs.getInt(2)); - return res; - }, mid); - } catch (EmptyResultDataAccessException e) { - return true; - } - return privacyOpts.getPrivacy() >= 0 - || uid == privacyOpts.getUid() - || ((privacyOpts.getPrivacy() == -1 || privacyOpts.getPrivacy() == -2) && uid > 0 - && UserQueries.isInWL(sql, privacyOpts.getUid(), uid)); - } - - public static boolean isReadOnly(JdbcTemplate sql, int mid) { - try { - return sql.queryForObject("SELECT readonly FROM messages WHERE message_id=?", new Object[]{mid}, Integer.class) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static boolean isSubscribed(JdbcTemplate sql, int uid, int mid) { - try { - return sql.queryForObject("SELECT 1 FROM subscr_messages WHERE suser_id=? AND message_id=?", new Object[]{uid, mid}, Integer.class) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static int getMessagePrivacy(JdbcTemplate sql, int mid) { - try { - return sql.queryForObject("SELECT privacy FROM messages WHERE message_id=?", new Object[]{mid}, Integer.class); - } catch (EmptyResultDataAccessException e) { - return -4; - } - } - - - public static com.juick.Message getMessage(JdbcTemplate sql, int mid) { - try { - return sql.queryForObject("SELECT messages.message_id, 0 as rid, 0 as replyto, " - + "messages.user_id,users.nick, 0 as banned, " - + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," - + "messages.ts," - + "messages.readonly,messages.privacy,messages.replies," - + "messages.attach,messages.place_id,messages.lat," - + "messages.lon,messages.likes,messages.hidden," - + "txt.tags,txt.repliesby,txt.txt, '' as q FROM messages " - + "INNER JOIN users ON messages.user_id=users.id " - + "INNER JOIN messages_txt AS txt " - + "ON messages.message_id=txt.message_id " - + "WHERE messages.message_id=?", - new MessageMapper(), mid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static com.juick.Message getReply(JdbcTemplate sql, int mid, int rid) { - try { - return sql.queryForObject("SELECT replies.user_id,users.nick," - + "replies.replyto,replies.ts," - + "replies.attach,replies.txt, IFNULL(q.txt,t.txt) as quote FROM replies INNER JOIN users " - + "ON replies.user_id=users.id " - + "LEFT JOIN replies q " - + "ON replies.message_id=q.message_id and replies.replyto=q.reply_id " - + "LEFT JOIN messages_txt t ON replies.message_id=t.message_id " - + "WHERE replies.message_id=? AND replies.reply_id=?", - (rs, num) -> { - Message msg = new Message(); - msg.setMid(mid); - msg.setRid(rid); - msg.setUser(new User()); - msg.getUser().setUid(rs.getInt(1)); - msg.getUser().setName(rs.getString(2)); - msg.setReplyto(rs.getInt(3)); - msg.setDate(rs.getTimestamp(4)); - msg.AttachmentType = rs.getString(5); - msg.setText(rs.getString(6)); - String quote = rs.getString(7); - if (!StringUtils.isEmpty(quote)) { - msg.setReplyQuote(MessageUtils.formatQuote(quote)); - } - return msg; - }, mid, rid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static User getMessageAuthor(JdbcTemplate sql, int mid) { - try { - return sql.queryForObject("SELECT messages.user_id,users.nick " - + "FROM messages INNER JOIN users " - + "ON messages.user_id=users.id WHERE messages.message_id=?", - new Object[]{mid}, (rs, num) -> { - User res = new com.juick.User(); - res.setUid(rs.getInt(1)); - res.setName(rs.getString(2)); - return res; - }); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static List getMessageTags(JdbcTemplate sql, int mid) { - return sql.query("SELECT tags.tag_id,synonym_id,name,stat_messages FROM tags " + - "INNER JOIN messages_tags ON (messages_tags.message_id=? AND messages_tags.tag_id=tags.tag_id)", - new Object[]{mid}, (rs, num) -> { - com.juick.Tag t = new com.juick.Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); - t.TID = rs.getInt(1); - t.SynonymID = rs.getInt(2); - t.UsageCnt = rs.getInt(4); - return t; - }); - } - - public static List getMessageTagsIDs(JdbcTemplate sql, int mid) { - return sql.queryForList("SELECT tag_id FROM messages_tags WHERE message_id=?", new Object[] {mid}, Integer.class); - } - - public static List getMessageRecommendations(JdbcTemplate sql, int mid) { - return sql.queryForList("SELECT users.nick FROM favorites INNER JOIN users " + - "ON (favorites.message_id=? AND favorites.user_id=users.id)", - new Object[] {mid}, String.class); - } - - public static List getAll(JdbcTemplate sql, int visitor_uid, int before) { - if (visitor_uid > 1) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 OR user_id=?) AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + - " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", - new Object[]{before, visitor_uid, visitor_uid}, Integer.class); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE hidden=0" + - " AND (privacy>0 OR user_id=?)" + - " AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + - " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", - new Object[]{visitor_uid, visitor_uid}, Integer.class); - } - } else { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 AND user_id NOT IN (SELECT id from users WHERE banned=1) " + - " ORDER BY message_id DESC LIMIT 20", - new Object[]{before}, Integer.class); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE hidden=0 AND privacy>0" + - " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", - Integer.class); - } - } - } - - public static List getTag(JdbcTemplate sql, int tid, int visitor_uid, int before, int cnt) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM (tags INNER JOIN messages_tags " + - "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + - "INNER JOIN messages USING(message_id) WHERE messages.message_id0 OR messages.user_id=?) ORDER BY message_id DESC LIMIT ?", - new Object[]{tid, tid, before, visitor_uid, cnt}, Integer.class); - } else { - return sql.queryForList("SELECT message_id FROM (tags INNER JOIN messages_tags " + - "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + - "INNER JOIN messages USING(message_id) WHERE messages.privacy>0 OR messages.user_id=? " + - "ORDER BY message_id DESC LIMIT ?", - new Object[]{tid, tid, visitor_uid, cnt}, Integer.class); - } - } - - public static List getTags(JdbcTemplate sql, String tids, int visitor_uid, int before, int cnt) { - if (before > 0) { - return sql.queryForList("SELECT messages.message_id FROM messages_tags " + - "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + - "AND messages.message_id0 OR messages.user_id=?) " + - "ORDER BY messages.message_id DESC LIMIT ?", new Object[]{before, visitor_uid, cnt}, Integer.class); - } else { - return sql.queryForList("SELECT messages.message_id FROM messages_tags " + - "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + - "AND (messages.privacy>0 OR messages.user_id=?) " + - "ORDER BY messages.message_id DESC LIMIT ?", new Object[]{visitor_uid, cnt}, Integer.class); - } - } - - public static List getPlace(JdbcTemplate sql, int place_id, int visitor_uid, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE place_id=? AND message_id0 OR user_id=?) ORDER BY message_id DESC LIMIT 20", - new Object[]{place_id, before, visitor_uid}, Integer.class); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE place_id=? AND (privacy>0 OR user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", new Object[]{place_id, visitor_uid}, Integer.class); - } - } - - public static List getMyFeed(JdbcTemplate sql, int uid, int before) { - List mids; - if (before > 0) { - mids = sql.queryForList("SELECT message_id FROM messages " + - "INNER JOIN subscr_users ON (subscr_users.suser_id=? AND subscr_users.user_id=messages.user_id) " + - "WHERE message_id=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + - "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", - Integer.class, uid, before, uid); - } else { - mids = sql.queryForList("SELECT message_id FROM messages " + - "INNER JOIN subscr_users ON (subscr_users.suser_id=? " + - "AND subscr_users.user_id=messages.user_id) " + - "WHERE (privacy>=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + - "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", - Integer.class, uid, uid); - } - - - if (before > 0) { - mids.addAll(sql.queryForList("SELECT message_id FROM messages " + - "WHERE user_id=? AND message_id getPrivate(JdbcTemplate sql, int uid, int before) { - - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND privacy<0 AND message_id getDiscussions(JdbcTemplate sql, int uid, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM subscr_messages WHERE suser_id=? AND message_id getRecommended(JdbcTemplate sql, int uid, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM favorites WHERE user_id " + - "IN (SELECT user_id FROM subscr_users WHERE suser_id=?) AND message_id getPopular(JdbcTemplate sql, int visitor_uid, int before) { - - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 " + - "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", Integer.class, before, visitor_uid); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE privacy>0 " + - "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", Integer.class, visitor_uid); - } - } - - public static List getPhotos(JdbcTemplate sql, int visitor_uid, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE message_id0 OR user_id=?) " + - "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + - "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", Integer.class, before, visitor_uid, visitor_uid); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE (privacy>0 OR user_id=?) " + - "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + - "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", Integer.class, visitor_uid, visitor_uid); - } - } - - public static List getSearch(JdbcTemplate sql, JdbcTemplate sqlSearch, String search, int before) { - List mids; - - if (before > 0) { - mids = sqlSearch.queryForList("SELECT id AS message_id FROM messages WHERE MATCH(?) AND id 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE message_id " + - "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>0 ORDER BY message_id DESC LIMIT 20", - Integer.class); - } - return mids; - } - - public static List getUserBlog(JdbcTemplate sql, int UID, int privacy, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND message_id=" + - privacy + " ORDER BY message_id DESC LIMIT 20", Integer.class, UID, before); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + - " ORDER BY message_id DESC LIMIT 20", Integer.class, UID); - } - } - - public static List getUserTag(JdbcTemplate sql, int UID, int TID, int privacy, int before) { - if (before > 0) { - return sql.queryForList("SELECT messages.message_id FROM messages_tags INNER JOIN messages " + - "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + - "AND messages.message_id=" + privacy + - " ORDER BY messages.message_id DESC LIMIT 20", - Integer.class, UID, TID, before); - } else { - return sql.queryForList("SELECT messages.message_id FROM messages_tags INNER JOIN messages " + - "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + - "AND messages.privacy>=" + privacy + " ORDER BY messages.message_id DESC LIMIT 20", - Integer.class, UID, TID); - } - } - - public static List getUserRecommendations(JdbcTemplate sql, int UID, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM favorites " - + "WHERE user_id=? AND message_id getUserPhotos(JdbcTemplate sql, int UID, int privacy, int before) { - if (before > 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND message_id=" + - privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", - new Object[] {UID, before}, Integer.class); - } else { - return sql.queryForList("SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + - " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", - new Object[] {UID}, Integer.class); - } - } - - public static List getUserSearch(JdbcTemplate sql, JdbcTemplate sqlSearch, int UID, String search, int privacy, int before) { - List mids; - - - if (before > 0) { - mids = sqlSearch.queryForList("SELECT id AS message_id FROM messages WHERE user_id=? AND MATCH(?) AND id 0) { - return sql.queryForList("SELECT message_id FROM messages WHERE message_id IN (" + - StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>=" + privacy + " ORDER BY message_id DESC", - Integer.class); - } - return mids; - } - - public static List getMessages(JdbcTemplate sql, List mids) { - if (!mids.isEmpty()) { - return sql.query("SELECT messages.message_id, 0 as rid, 0 as replyto, " - + "messages.user_id,users.nick, 0 as banned, " - + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," - + "messages.ts," - + "messages.readonly,messages.privacy,messages.replies," - + "messages.attach,messages.place_id,messages.lat," - + "messages.lon,messages.likes,messages.hidden," - + "messages_txt.tags,messages_txt.repliesby, messages_txt.txt, '' as q " - + "FROM (messages INNER JOIN messages_txt " - + "ON messages.message_id=messages_txt.message_id) " - + "INNER JOIN users ON messages.user_id=users.id " - + "WHERE messages.message_id " - + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") " - + "ORDER BY messages.message_id DESC", new MessageMapper()); - } - return Collections.emptyList(); - } - - public static List getReplies(JdbcTemplate sql, int mid) { - return sql.query("SELECT ? as mid, replies.reply_id,replies.replyto, " + - "replies.user_id,users.nick,users.banned, " + - "TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts," + - "0 as readonly, 0 as privacy, 0 as replies," + - "replies.attach, 0 as place_id, 0 as lat," + - "0 as lon, 0 as likes, 0 as hidden," + - "NULL as tags,NULL as repliesby, replies.txt, " + - "IFNULL(qw.txt, t.txt) as q " + - "FROM replies INNER JOIN users " + - "ON replies.user_id=users.id " + - "LEFT JOIN replies qw ON replies.message_id=qw.message_id and replies.replyto=qw.reply_id " + - "LEFT JOIN messages_txt t on replies.message_id=t.message_id " + - "WHERE replies.message_id=? " + - "ORDER BY replies.reply_id ASC", - new MessageMapper(), mid, mid); - } - - public static boolean setMessagePopular(JdbcTemplate sql, int mid, int popular) { - boolean ret; - switch (popular) { - case -2: - ret = sql.update("UPDATE messages SET hidden=1 WHERE message_id=?", mid) > 0; - break; - case -1: - ret = sql.update("UPDATE messages SET popular=0 WHERE message_id=?", mid) > 0; - break; - default: - ret = sql.update("UPDATE messages SET popular=? WHERE message_id=?", popular, mid) > 0; - break; - } - if (popular == -1) { - ret = sql.update("INSERT INTO top_ignore_messages VALUES (?)", mid) > 0; - } - return ret; - } - - public static boolean setMessagePrivacy(JdbcTemplate sql, int mid) { - return sql.update("UPDATE messages SET privacy=1 WHERE message_id=?", - mid) > 0; - } - public static boolean deleteMessage(JdbcTemplate sql, int uid, int mid) { - if (sql.update("DELETE FROM messages WHERE message_id=? AND user_id=?", mid, uid) > 0) { - sql.update("DELETE FROM messages_txt WHERE message_id=?", mid); - sql.update("DELETE FROM replies WHERE message_id=?", mid); - sql.update("DELETE FROM subscr_messages WHERE message_id=?", mid); - sql.update("DELETE FROM messages_tags WHERE message_id=?", mid); - return true; - } - return false; - } -} diff --git a/server-core/src/main/java/com/juick/server/PMQueries.java b/server-core/src/main/java/com/juick/server/PMQueries.java deleted file mode 100644 index c79c04b6..00000000 --- a/server-core/src/main/java/com/juick/server/PMQueries.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2011, Ugnich Anton - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.server; - -import com.juick.User; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; - -/** - * - * @author Ugnich Anton - */ -public class PMQueries { - - public static boolean createPM(JdbcTemplate sql, int uid_from, int uid_to, String body) { - boolean ret = sql.update("INSERT INTO pm(user_id,user_id_to,txt) VALUES (?,?,?)", - uid_from, uid_to, body) > 0; - - if (ret) { - sql.update("INSERT INTO pm_streams(user_id,user_id_to,lastmessage,unread) " - + "VALUES (?,?,NOW(),1) " - + "ON DUPLICATE KEY UPDATE lastmessage=NOW(),unread=unread+1", - uid_from, uid_to); - } - return ret; - } - - public static boolean addPMinRoster(JdbcTemplate sql, int uid, String jid) { - return sql.update("INSERT INTO pm_inroster(user_id,jid) VALUES (?,?)", - uid, jid) > 0; - } - - public static boolean removePMinRoster(JdbcTemplate sql, int uid, String jid) { - return sql.update("DELETE FROM pm_inroster WHERE user_id=? AND jid=?", uid, jid) > 0; - } - - public static boolean havePMinRoster(JdbcTemplate sql, int uid, String jid) { - List res = sql.queryForList("SELECT 1 FROM pm_inroster " - + "WHERE user_id=? AND jid=?", Integer.class, - uid, jid); - return res.size() > 0; - } - - public static String getLastView(JdbcTemplate sql, int uid_from, int uid_to) { - try { - return sql.queryForObject("SELECT lastview FROM pm_streams WHERE user_id=? AND user_id_to=?", String.class, - uid_from, uid_to); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static List getPMLastConversationsUsers(JdbcTemplate sql, int uid, int cnt) { - return sql.query("SELECT pm_streams.user_id, users.nick, pm_streams.unread FROM pm_streams " - + "INNER JOIN users ON users.id = pm_streams.user_id " - + "WHERE pm_streams.user_id_to=? " - + "ORDER BY pm_streams.unread DESC, pm_streams.lastmessage DESC LIMIT " + cnt, (rs, rowNum) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - u.setUnreadCount(rs.getInt(3)); - return u; - }, uid); - } - - public static List getPMMessages(JdbcTemplate sql, int uid, int uid_to) { - List msgs = sql.query("SELECT user_id,txt,ts FROM pm " - + "WHERE (user_id=? AND user_id_to=?) " - + "OR (user_id_to=? AND user_id=?) ORDER BY ts DESC LIMIT 20", - (rs, rowNum) -> { - com.juick.Message msg = new com.juick.Message(); - int uuid = rs.getInt(1); - msg.setUser(new User()); - msg.getUser().setUid(uuid); - msg.setText(rs.getString(2)); - msg.setDate(rs.getTimestamp(3)); - return msg; - }, uid, uid_to, uid, uid_to); - - sql.update("UPDATE pm_streams SET lastview=NOW(),unread=0 " - + "WHERE user_id_to=? AND user_id=?", uid, uid_to); - - return msgs; - } - - public static List getLastPMInbox(JdbcTemplate sql, int uid) { - return sql.query("SELECT pm.user_id,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW()),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", - (rs, num) -> { - com.juick.Message msg = new com.juick.Message(); - msg.setUser(new User()); - msg.getUser().setUid(rs.getInt(1)); - msg.getUser().setName(rs.getString(2)); - msg.setText(rs.getString(3)); - msg.TimeAgo = rs.getInt(4); - msg.setDate(rs.getTimestamp(5)); - return msg; - }, uid); - } - - public static List getLastPMSent(JdbcTemplate sql, int uid) { - return sql.query("SELECT pm.user_id_to,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW())," + - "pm.ts FROM pm INNER JOIN users ON pm.user_id_to=users.id " + - "WHERE pm.user_id=? ORDER BY pm.ts DESC LIMIT 20", - (rs, num) -> { - com.juick.Message msg = new com.juick.Message(); - msg.setUser(new User()); - msg.getUser().setUid(rs.getInt(1)); - msg.getUser().setName(rs.getString(2)); - msg.setText(rs.getString(3)); - msg.TimeAgo = rs.getInt(4); - msg.setDate(rs.getTimestamp(5)); - return msg; - }, uid); - } -} diff --git a/server-core/src/main/java/com/juick/server/PrivacyQueries.java b/server-core/src/main/java/com/juick/server/PrivacyQueries.java deleted file mode 100644 index 40fc82c4..00000000 --- a/server-core/src/main/java/com/juick/server/PrivacyQueries.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.juick.server; - -import com.juick.Tag; -import com.juick.User; -import org.springframework.jdbc.core.JdbcTemplate; - -/** - * Created by vitalyster on 19.10.2016. - */ -public class PrivacyQueries { - public enum PrivacyResult { - Removed, Added - } - public static PrivacyResult blacklistUser(JdbcTemplate jdbc, User user, User target) { - int result = jdbc.update("DELETE FROM bl_users WHERE user_id=? AND bl_user_id=?", user.getUid(), target.getUid()); - if (result > 0) { - return PrivacyResult.Removed; - } else { - jdbc.update("INSERT INTO bl_users(user_id,bl_user_id) VALUES (?,?)", user.getUid(), target.getUid()); - return PrivacyResult.Added; - } - } - public static PrivacyResult blacklistTag(JdbcTemplate jdbc, User user, Tag tag) { - int result = jdbc.update("DELETE FROM bl_tags WHERE user_id=? AND tag_id=?", user.getUid(), tag.TID); - if (result > 0) { - return PrivacyResult.Removed; - } else { - jdbc.update("INSERT INTO bl_tags(user_id,tag_id) VALUES (?,?)", user.getUid(), tag.TID); - return PrivacyResult.Added; - } - } -} diff --git a/server-core/src/main/java/com/juick/server/PushQueries.java b/server-core/src/main/java/com/juick/server/PushQueries.java deleted file mode 100644 index 904b3c0d..00000000 --- a/server-core/src/main/java/com/juick/server/PushQueries.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.juick.server; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.util.StringUtils; - -import java.util.List; - -/** - * - * @author ugnich - */ -public class PushQueries { - - public static List getAndroidRegID(JdbcTemplate sql, int uid) { - return sql.queryForList("SELECT regid FROM android WHERE user_id=?", String.class, uid); - } - - public static List getAndroidTokens(JdbcTemplate sql, List uids) { - return sql.queryForList("SELECT regid FROM android INNER JOIN users " + - "ON (users.id=android.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", String.class); - } - - public static List getWinPhoneURL(JdbcTemplate sql, int uid) { - return sql.queryForList("SELECT url FROM winphone WHERE user_id=?", String.class, uid); - } - - public static List getWindowsTokens(JdbcTemplate sql, List uids) { - return sql.queryForList("SELECT url FROM winphone INNER JOIN users " + - "ON (users.id=winphone.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", String.class); - } - - public static List getAPNSToken(JdbcTemplate sql, int uid) { - return sql.queryForList("SELECT token from ios WHERE user_id=?", String.class, uid); - } - - public static List getAPNSTokens(JdbcTemplate sql, List uids) { - return sql.queryForList("SELECT token FROM ios INNER JOIN users " + - "ON (users.id=ios.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", String.class); - } -} diff --git a/server-core/src/main/java/com/juick/server/ShowQueries.java b/server-core/src/main/java/com/juick/server/ShowQueries.java deleted file mode 100644 index fde388c3..00000000 --- a/server-core/src/main/java/com/juick/server/ShowQueries.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.juick.server; - -import com.juick.User; - -import java.util.List; -import org.springframework.jdbc.core.JdbcTemplate; - -/** - * Created by vt on 10/01/16. - */ -public class ShowQueries { - - public static List getRecommendedUsers(JdbcTemplate sql, User forUser) { - return sql.queryForList("SELECT users.nick FROM subscr_users INNER JOIN users " + - "ON subscr_users.user_id=users.id " + - "WHERE subscr_users.user_id NOT IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + - "AND subscr_users.suser_id IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + - "AND subscr_users.user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "AND subscr_users.user_id!=? AND users.lastmessage>UNIX_TIMESTAMP()-259200 " + - "GROUP BY subscr_users.user_id ORDER BY count(*) DESC LIMIT 10", - String.class, forUser.getUid(), forUser.getUid(), forUser.getUid(), forUser.getUid()); - } - - public static List getTopUsers(JdbcTemplate sql) { - return sql.queryForList("SELECT users.nick,COUNT(subscr_users.suser_id) AS cnt " + - "FROM (subscr_users INNER JOIN users ON subscr_users.user_id=users.id) " + - "INNER JOIN useroptions ON users.id=useroptions.user_id " + - "WHERE useroptions.privacy_view>0 AND users.lastmessage>UNIX_TIMESTAMP()-259200 " + - "AND users.id!=2 GROUP BY subscr_users.user_id ORDER BY cnt DESC LIMIT 10", - String.class); - } -} diff --git a/server-core/src/main/java/com/juick/server/SubscriptionsQueries.java b/server-core/src/main/java/com/juick/server/SubscriptionsQueries.java deleted file mode 100644 index 08d704d9..00000000 --- a/server-core/src/main/java/com/juick/server/SubscriptionsQueries.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.juick.server; - -import com.juick.Tag; -import com.juick.User; -import com.juick.server.helpers.NotifyOpts; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.util.StringUtils; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * - * @author ugnich - */ -public class SubscriptionsQueries { - - public static List getJIDSubscribedToUser(JdbcTemplate sql, int uid, boolean friendsonly) { - if (friendsonly == false) { - return sql.queryForList("SELECT jids.jid FROM subscr_users INNER JOIN jids " + - "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1", - String.class, uid); - } else { - return sql.queryForList("SELECT jids.jid FROM subscr_users INNER JOIN jids " + - "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1 " + - "AND jids.user_id IN (SELECT wl_user_id FROM wl_users WHERE user_id=?)", String.class, uid, uid); - } - } - - public static List getSubscribedUsers(JdbcTemplate sql, int uid, int mid) { - User author = MessagesQueries.getMessageAuthor(sql, mid); - List userids = UserQueries.getUserReaders(sql, uid); - Set set = new HashSet<>(); - set.addAll(userids.stream().map(User::getUid).collect(Collectors.toList())); - List tags = MessagesQueries.getMessageTagsIDs(sql, mid); - if (tags.size() > 0) { - List tagUsers = sql.queryForList("SELECT suser_id FROM subscr_tags " + - "WHERE tag_id IN (" + StringUtils.arrayToCommaDelimitedString(tags.toArray()) + ") AND suser_id!=? " + - " AND suser_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=?)", Integer.class, uid, author.getUid()); - set.addAll(tagUsers); - } - return UserQueries.getUsersByID(sql, new ArrayList<>(set)); - } - - public static List getUsersSubscribedToComments(JdbcTemplate sql, int mid, int ignore_uid) { - List userids = sql.queryForList("SELECT suser_id FROM subscr_messages WHERE message_id=? AND suser_id!=?", - Integer.class, mid, ignore_uid); - if (userids.size() > 0) { - return UserQueries.getUsersByID(sql, userids); - } else { - return Collections.emptyList(); - } - } - - public static List getUsersSubscribedToUserRecommendations(JdbcTemplate sql, int uid, int mid, int muid) { - List tags = MessagesQueries.getMessageTagsIDs(sql, mid); - - String query = "SELECT suser_id FROM subscr_users WHERE user_id=" + uid; - query += " AND user_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=" + muid + ")"; - query += " AND user_id NOT IN (SELECT suser_id FROM subscr_users WHERE user_id=" + muid + ")"; - query += " AND user_id NOT IN (SELECT suser_id FROM subscr_messages WHERE message_id=" + mid + ")"; - query += " AND user_id NOT IN (SELECT user_id FROM favorites WHERE message_id=" + mid + ")"; - query += " AND user_id NOT IN (SELECT subscr_users.suser_id FROM subscr_users INNER JOIN favorites ON (favorites.message_id=" + mid + " AND subscr_users.user_id=favorites.user_id AND favorites.user_id!=" + uid + "))"; - if (!tags.isEmpty()) { - String tagsStr = StringUtils.arrayToCommaDelimitedString(tags.toArray()); - query += " AND user_id NOT IN (SELECT suser_id FROM subscr_tags WHERE tag_id IN (" + tagsStr + "))"; - query += " AND user_id NOT IN (SELECT user_id FROM bl_tags WHERE tag_id IN (" + tagsStr + "))"; - } - List userids = sql.queryForList(query, Integer.class); - return UserQueries.getUsersByID(sql, userids); - } - - public static boolean subscribeMessage(JdbcTemplate sql, int mid, int vuid) { - return sql.update("INSERT IGNORE INTO subscr_messages(suser_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; - } - public static boolean unSubscribeMessage(JdbcTemplate sql, int mid, int vuid) { - return sql.update("DELETE FROM subscr_messages WHERE message_id=? AND suser_id=?", - mid, vuid) > 0; - } - public static boolean subscribeUser(JdbcTemplate sql, User user, User toUser) { - return sql.update("INSERT IGNORE INTO subscr_users(user_id,suser_id) VALUES (?,?)", - toUser.getUid(), user.getUid()) == 1; - } - public static boolean unSubscribeUser(JdbcTemplate sql, User user, User fromUser) { - return sql.update("DELETE FROM subscr_users WHERE suser_id=? AND user_id=?", - user.getUid(), fromUser.getUid()) > 0; - } - public static boolean subscribeTag(JdbcTemplate sql, User user, Tag toTag) { - return sql.update("INSERT IGNORE INTO subscr_tags(tag_id,suser_id) VALUES (?,?)", - toTag.TID, user.getUid()) == 1; - } - public static boolean unSubscribeTag(JdbcTemplate sql, User user, Tag toTag) { - return sql.update("DELETE FROM subscr_tags WHERE tag_id=? AND suser_id=?", - toTag.TID, user.getUid()) > 0; - } - - public static NotifyOpts getNotifyOptions(JdbcTemplate sql, User user) { - try { - return sql.queryForObject("SELECT jnotify,subscr_notify,recommendations FROM useroptions WHERE user_id=?", - (rs, num) -> { - NotifyOpts options = new NotifyOpts(); - options.setRepliesEnabled(rs.getInt(1) > 0); - options.setSubscriptionsEnabled(rs.getInt(2) > 0); - options.setRecommendationsEnabled(rs.getInt(3) > 0); - return options; - }, user.getUid()); - } catch (EmptyResultDataAccessException e) { - return new NotifyOpts(); - } - } - - public static boolean setNotifyOptions(JdbcTemplate sql, User user, NotifyOpts options) { - return sql.update("UPDATE useroptions SET jnotify=? WHERE user_id=?", options.isRepliesEnabled() ? 1 : 0, - user.getUid()) > 0 && - sql.update("UPDATE useroptions SET subscr_notify=? WHERE user_id=?", options.isSubscriptionsEnabled() ? 1 : 0, - user.getUid()) > 0 && - sql.update("UPDATE useroptions SET recommendations=? WHERE user_id=?", options.isRecommendationsEnabled() ? 1 : 0, - user.getUid()) > 0; - } -} diff --git a/server-core/src/main/java/com/juick/server/TagQueries.java b/server-core/src/main/java/com/juick/server/TagQueries.java deleted file mode 100644 index ee9a1e21..00000000 --- a/server-core/src/main/java/com/juick/server/TagQueries.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2011, Ugnich Anton - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.server; - -import com.juick.Tag; -import org.apache.commons.lang3.StringEscapeUtils; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; - -import java.sql.PreparedStatement; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * - * @author Ugnich Anton - */ -public class TagQueries { - - public static com.juick.Tag getTag(JdbcTemplate sql, int tid) { - try { - return sql.queryForObject("SELECT synonym_id,name FROM tags WHERE tag_id=?", - (rs, num) -> { - Tag ret = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(2))); - ret.TID = tid; - ret.SynonymID = rs.getInt(1); - return ret; - }, tid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static com.juick.Tag getTag(JdbcTemplate sql, String tag, boolean autoCreate) { - Tag ret = null; - try { - ret = sql.queryForObject("SELECT tag_id,synonym_id,name FROM tags WHERE name=?", - (rs, rowNum) -> { - Tag ret1 = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); - ret1.TID = rs.getInt(1); - ret1.SynonymID = rs.getInt(2); - return ret1; - }, StringEscapeUtils.escapeHtml4(tag)); - } catch (EmptyResultDataAccessException e) { - // tag not found - } - if (ret == null && autoCreate) { - ret = new com.juick.Tag(tag); - ret.TID = createTag(sql, tag); - } - - return ret; - } - - public static List getTags(JdbcTemplate sql, String[] tags, boolean autoCreate) { - List ret = new ArrayList<>(); - - for (String tag : tags) { - if (!tag.isEmpty()) { - Tag t = getTag(sql, tag, autoCreate); - if (t != null) { - ret.add(t); - } - } - } - - return ret; - } - - public static boolean getTagNoIndex(JdbcTemplate sql, int tag_id) { - try { - return sql.queryForObject("SELECT noindex FROM tags WHERE tag_id=?", Integer.class, tag_id) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static int createTag(JdbcTemplate sql, String name) { - KeyHolder holder = new GeneratedKeyHolder(); - sql.update(con -> { - PreparedStatement stmt = con.prepareStatement("INSERT INTO tags(name) VALUES (?)", - Statement.RETURN_GENERATED_KEYS); - stmt.setString(1, StringEscapeUtils.escapeHtml4(name)); - return stmt; - }, holder); - - return holder.getKey().intValue(); - } - - public static List getUserTagsAll(JdbcTemplate sql, int uid) { - return sql.query("SELECT tags.name,COUNT(messages.message_id) " + - "FROM (messages INNER JOIN messages_tags ON (messages.user_id=? " + - "AND messages.message_id=messages_tags.message_id)) " + - "INNER JOIN tags ON messages_tags.tag_id=tags.tag_id GROUP BY tags.tag_id ORDER BY tags.name ASC", - (rs, rowNum) -> { - Tag t = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(1))); - t.UsageCnt = rs.getInt(2); - return t; - }, uid); - } - - public static List getUserBLTags(JdbcTemplate sql, int uid) { - return sql.queryForList("SELECT tags.name FROM tags INNER JOIN bl_tags " + - "ON (bl_tags.user_id=? AND bl_tags.tag_id=tags.tag_id) ORDER BY tags.name", - String.class, uid); - } - - public static List getPopularTags(JdbcTemplate sql) { - return sql.queryForList("SELECT name FROM tags WHERE top=1 ORDER BY name ASC", String.class).stream() - .map(StringEscapeUtils::unescapeHtml4).collect(Collectors.toList()); - } - public static List updateTags(JdbcTemplate sql, int mid, List newTags) { - List currentTags = MessagesQueries.getMessageTags(sql, mid); - newTags.stream().filter(currentTags::contains) - .forEach(t -> sql.update("DELETE FROM messages_tags WHERE message_id=? AND tag_id=?", mid, t.TID)); - newTags.stream().filter(t -> !currentTags.contains(t)) - .forEach(t -> sql.update("INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)", mid, t.TID)); - return MessagesQueries.getMessageTags(sql, mid); - } - - public static List fromString(JdbcTemplate sql, String txt, boolean tagsOnly) { - String patternString = tagsOnly ? "^(?:(?:\\*[^ \\r\\n\\t]+)|\\s)+$" : "^\\*([^ \\r\\n\\t]+)\\s+([\\s\\S]+)"; - Pattern tagsPattern = Pattern.compile(patternString); - if (tagsPattern.matcher(txt).matches()) { - Pattern tagPattern = Pattern.compile("\\*([^ \\r\\n\\t]+)"); - Matcher tagMatcher = tagPattern.matcher(txt); - List tags = new ArrayList<>(); - // TODO: process readonly, private, friends, public - while (tagMatcher.find()) { - for (int i = 1; i <= tagMatcher.groupCount(); i++) { - tags.add(getTag(sql, tagMatcher.group(i), true)); - } - } - return tags; - } - return Collections.emptyList(); - } -} diff --git a/server-core/src/main/java/com/juick/server/UserQueries.java b/server-core/src/main/java/com/juick/server/UserQueries.java deleted file mode 100644 index 7400e6b2..00000000 --- a/server-core/src/main/java/com/juick/server/UserQueries.java +++ /dev/null @@ -1,487 +0,0 @@ -/* - * Juick - * Copyright (C) 2008-2011, Ugnich Anton - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package com.juick.server; - -import com.juick.User; -import com.juick.server.helpers.Auth; -import com.juick.server.helpers.EmailOpts; -import com.juick.server.helpers.UserInfo; -import com.juick.util.UserUtils; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.util.StringUtils; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.*; - -/** - * @author Ugnich Anton - */ -public class UserQueries { - - static final String ABCDEF = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - public static class UserMapper implements RowMapper { - @Override - public User mapRow(ResultSet rs, int rowNum) throws SQLException { - User user = new User(); - user.setUid(rs.getInt(1)); - user.setName(rs.getString(2)); - user.setBanned(rs.getBoolean(3)); - return user; - } - } - - public static String getSignUpHashByJID(JdbcTemplate sql, String jid) { - String hash; - try { - hash = sql.queryForObject("SELECT loginhash FROM jids WHERE jid=? AND user_id IS NULL", - String.class, jid); - } catch (EmptyResultDataAccessException e) { - hash = UUID.randomUUID().toString(); - sql.update("INSERT INTO jids(jid,loginhash) VALUES (?,?)", jid, hash); - } - return hash; - } - - public static String getSignUpHashByTelegramID(JdbcTemplate sql, Long telegramId, String username) { - try { - return sql.queryForObject("SELECT loginhash FROM telegram WHERE tg_id=? AND user_id IS NULL", - String.class, telegramId); - } catch (EmptyResultDataAccessException e) { - String hash = UUID.randomUUID().toString(); - sql.update("INSERT INTO telegram(tg_id, loginhash, tg_name) VALUES (?, ?, ?)", telegramId, hash, username); - return hash; - } - } - - public static int createUser(JdbcTemplate sql, String username, String password) { - KeyHolder holder = new GeneratedKeyHolder(); - try { - sql.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; - } - - int uid = holder.getKey().intValue(); - - sql.update("INSERT INTO useroptions(user_id) VALUES (?)", uid); - sql.update("INSERT INTO subscr_users(user_id,suser_id) VALUES (2,?)", uid); - - return uid; - } - - public static Optional getUserByUID(JdbcTemplate sql, int uid) { - try { - return Optional.of(sql.queryForObject("SELECT id, nick,banned FROM users WHERE id=?", - new UserMapper(), uid)); - } catch (EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - public static User getUserByName(JdbcTemplate sql, String username) { - try { - return sql.queryForObject("SELECT id,nick,banned FROM users WHERE nick=?", - new UserMapper(), - username); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static User getUserByJID(JdbcTemplate sql, String jid) { - try { - return sql.queryForObject("SELECT id,nick,banned FROM users WHERE id=(SELECT user_id FROM jids WHERE jid=?)", - new UserMapper(), jid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static List getUsersByName(JdbcTemplate sql, List unames) { - if (!unames.isEmpty()) { - return sql.query("SELECT id,nick,banned FROM users WHERE nick IN (\"" + StringUtils.arrayToDelimitedString(unames.toArray(), "\",\"") + "\")", - new UserMapper()); - } - return Collections.emptyList(); - } - - public static List getUsersByID(JdbcTemplate sql, List uids) { - if (!uids.isEmpty()) { - return sql.query("SELECT id,nick,banned FROM users WHERE id IN (" + StringUtils.arrayToCommaDelimitedString(uids.toArray()) + ")", - new UserMapper()); - } - return Collections.emptyList(); - } - - public static List getUsersByJID(JdbcTemplate sql, List jids) { - if (!jids.isEmpty()) { - return sql.query("SELECT users.id,users.nick,jids.jid FROM users " - + "INNER JOIN jids ON jids.user_id=users.id " - + "WHERE jids.jid IN (\"" + StringUtils.arrayToDelimitedString(jids.toArray(), "\",\"") + "\")", - (rs, rowNum) -> { - com.juick.User user = new com.juick.User(); - user.setUid(rs.getInt(1)); - user.setName(rs.getString(2)); - user.setJID(rs.getString(3)); - return user; - }); - } - return Collections.emptyList(); - } - - public static List getJIDsbyUID(JdbcTemplate sql, int uid) { - return sql.queryForList("SELECT jid FROM jids WHERE user_id=? AND active=1", String.class, uid); - } - - public static int getUIDbyJID(JdbcTemplate sql, String jid) { - try { - return sql.queryForObject("SELECT user_id FROM jids WHERE jid=?", Integer.class, jid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public static int getUIDbyName(JdbcTemplate sql, String uname) { - try { - return sql.queryForObject("SELECT id FROM users WHERE nick=?", Integer.class, uname); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public static int getUIDbyHash(JdbcTemplate sql, String hash) { - try { - return sql.queryForObject("SELECT user_id FROM logins WHERE hash=?", Integer.class, hash); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public static com.juick.User getUserByHash(JdbcTemplate sql, String hash) { - try { - User user = sql.queryForObject("SELECT logins.user_id,users.nick, users.banned FROM logins " + - "INNER JOIN users ON logins.user_id=users.id WHERE logins.hash=?", - new UserMapper(), hash); - user.setAuthHash(hash); - return user; - } catch (EmptyResultDataAccessException e) { - return new User(); - } - } - - public static String getHashByUID(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT hash FROM logins WHERE user_id=?", String.class, uid); - } catch (EmptyResultDataAccessException e) { - String hash = UserUtils.generateHash(16); - sql.update(con -> { - PreparedStatement stmt = con.prepareStatement("INSERT INTO logins(user_id,hash) VALUES (?,?)"); - stmt.setInt(1, uid); - stmt.setString(2, hash); - return stmt; - }); - return hash; - } - } - - public static int checkPassword(JdbcTemplate sql, String username, String password) { - try { - String realPassword = sql.queryForObject("SELECT passw FROM users WHERE nick=?", String.class, username); - if (realPassword.equals(password)) { - User user = UserQueries.getUserByName(sql, username); - if (user != null) { - return user.getUid(); - } else { - return -1; - } - } else { - return -1; - } - } catch (EmptyResultDataAccessException e) { - return -1; - } - } - - public static boolean updatePassword(JdbcTemplate sql, User user, String newPassword) { - return user.getUid() > 0 && sql.update("UPDATE users SET passw=? WHERE id=?", newPassword, user.getUid()) > 0; - } - - public static String updateSecretEmail(JdbcTemplate sql, User user) { - String newHash = UserUtils.generateHash(16); - if (sql.update("INSERT INTO mail(user_id,hash) VALUES (?,?) ON DUPLICATE KEY UPDATE hash=?", user.getUid(), newHash, newHash) > 0) { - return newHash; - } - return ""; - } - - public static int getUserOptionInt(JdbcTemplate sql, int uid, String option, int defaultValue) { - try { - return sql.queryForObject("SELECT " + option + " FROM useroptions WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return defaultValue; - } - } - - public static void setUserOptionInt(JdbcTemplate sql, int uid, String option, int value) { - sql.update("UPDATE useroptions SET " + option + "=? WHERE user_id=?", value, uid); - } - - public static UserInfo getUserInfo(JdbcTemplate sql, User user) { - try { - return sql.queryForObject("SELECT fullname,country,url,descr FROM usersinfo WHERE user_id=?", ((rs, rowNum) -> { - UserInfo info = new UserInfo(); - info.setFullName(rs.getString(1)); - info.setCountry(rs.getString(2)); - info.setUrl(rs.getString(3)); - info.setDescription(rs.getString(4)); - return info; - }), user.getUid()); - } catch (EmptyResultDataAccessException e) { - return new UserInfo(); - } - } - - public static boolean updateUserInfo(JdbcTemplate sql, User user, UserInfo info) { - return sql.update("INSERT INTO usersinfo(user_id,fullname,country,url,descr) VALUES (?,?,?,?,?) " + - "ON DUPLICATE KEY UPDATE fullname=?,country=?,url=?,descr=?", user.getUid(), info.getFullName(), - info.getCountry(), info.getUrl(), info.getDescription(), info.getFullName(), - info.getCountry(), info.getUrl(), info.getDescription()) > 0; - } - - public static boolean getCanMedia(JdbcTemplate sql, int uid) { - try { - int res = sql.queryForObject("SELECT users.lastphoto-UNIX_TIMESTAMP() FROM users WHERE id=?", - Integer.class, uid); - return res < 3600; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static boolean isInWL(JdbcTemplate sql, int uid, int check) { - try { - return sql.queryForObject("SELECT 1 FROM wl_users WHERE user_id=? AND wl_user_id=?", - Integer.class, uid, check) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static boolean isInBL(JdbcTemplate sql, int uid, int check) { - try { - return sql.queryForObject("SELECT 1 FROM bl_users WHERE user_id=? AND bl_user_id=?", - Integer.class, uid, check) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static boolean isInBLAny(JdbcTemplate sql, int uid, int uid2) { - try { - return sql.queryForObject("SELECT 1 FROM bl_users " - + "WHERE (user_id=? AND bl_user_id=?) " - + "OR (user_id=? AND bl_user_id=?)", new Object[]{uid, uid2, uid2, uid}, Integer.class) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static List checkBL(JdbcTemplate sql, int visitor, List uids) { - if (!uids.isEmpty()) { - return sql.queryForList("SELECT user_id FROM bl_users WHERE bl_user_id=? and user_id IN (" + - StringUtils.collectionToCommaDelimitedString(uids) + ")", Integer.class, visitor); - } else { - return new ArrayList<>(); - } - } - - public static boolean isSubscribed(JdbcTemplate sql, int uid, int check) { - try { - return sql.queryForObject("SELECT 1 FROM subscr_users WHERE suser_id=? AND user_id=?", - Integer.class, uid, check) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - public static List getUserRead(JdbcTemplate sql, int uid) { - return sql.queryForList("SELECT user_id FROM subscr_users WHERE suser_id=?", Integer.class, uid); - } - - public static List getUserReadLeastPopular(JdbcTemplate sql, int uid, int cnt) { - return sql.query("SELECT users.id,users.nick FROM (subscr_users " + - "INNER JOIN users_subscr ON (subscr_users.suser_id=? " + - "AND subscr_users.user_id=users_subscr.user_id)) INNER JOIN users " + - "ON subscr_users.user_id=users.id ORDER BY cnt LIMIT ?", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, uid, cnt); - } - - public static List getUserReaders(JdbcTemplate sql, int uid) { - return sql.query("SELECT users.id, users.nick FROM subscr_users " + - "INNER JOIN users ON subscr_users.suser_id=users.id " + - "WHERE subscr_users.user_id=? ORDER BY users.nick", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, uid); - } - - public static List getUserFriends(JdbcTemplate sql, int uid) { - return sql.query("SELECT users.id,users.nick FROM subscr_users " + - "INNER JOIN users ON subscr_users.user_id=users.id " + - "WHERE subscr_users.suser_id=? AND users.id!=? " + - "ORDER BY users.nick", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, uid, uid); - } - - public static List getUserBLUsers(JdbcTemplate sql, int uid) { - return sql.query("SELECT users.id,users.nick FROM users INNER JOIN bl_users " + - "ON(bl_users.bl_user_id=users.id) WHERE bl_users.user_id=? ORDER BY users.nick", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, uid); - } - - public static boolean linkTwitterAccount(JdbcTemplate sql, User user, String accessToken, - String accessTokenSecret, String screenName) { - if (sql.update("INSERT INTO twitter(user_id,access_token,access_token_secret,uname) " + - "VALUES (?,?,?,?)" + - " ON DUPLICATE KEY UPDATE access_token=?,access_token_secret=?,uname=?", - user.getUid(), accessToken, accessTokenSecret, screenName, accessToken, accessTokenSecret, screenName) > 0) { - return sql.update("INSERT INTO subscr_users(user_id,suser_id,jid) " + - "VALUES (?,1741,'juick\\@twitter.juick.com')", user.getUid()) > 0; - } - return false; - - } - - public static int getStatsIRead(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT COUNT(*) FROM subscr_users WHERE suser_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public static int getStatsMyReaders(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT COUNT(*) FROM subscr_users WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public static int getStatsMessages(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT COUNT(*) FROM messages WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public static int getStatsReplies(JdbcTemplate sql, int uid) { - try { - return sql.queryForObject("SELECT COUNT(*) FROM replies WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - public enum ActiveStatus { - Inactive, - Active - } - - public static boolean setActiveStatusForJID(JdbcTemplate sql, String JID, ActiveStatus jidStatus) { - User user = getUserByJID(sql, JID); - if (user != null) { - return sql.update(con -> { - PreparedStatement preparedStatement = con.prepareStatement( - "UPDATE jids SET active=? WHERE user_id=? AND jid=?"); - int newStatus = jidStatus == ActiveStatus.Active ? 1 : 0; - preparedStatement.setInt(1, newStatus); - preparedStatement.setInt(2, user.getUid()); - preparedStatement.setString(3, JID); - return preparedStatement; - - }) >= 0; - } - return false; - } - - public static List getAllJIDs(JdbcTemplate sql, User user) { - return sql.queryForList("SELECT jid FROM jids WHERE user_id=?", String.class, user.getUid()); - } - - public static List getAuthCodes(JdbcTemplate sql, User user) { - return sql.query("SELECT account,authcode FROM auth WHERE user_id=? AND protocol='xmpp'", - (rs, num) -> new Auth(rs.getString(1), rs.getString(2)), user.getUid()); - } - - public static List getEmails(JdbcTemplate sql, User user) { - return sql.queryForList("SELECT email FROM emails WHERE user_id=?", String.class, user.getUid()); - } - - public static EmailOpts getEmailOpts(JdbcTemplate sql, User user) { - try { - return sql.queryForObject("SELECT email,subscr_hour FROM emails WHERE user_id=? AND subscr_hour IS NOT NULL", - (rs, num) -> new EmailOpts(rs.getString(1), rs.getInt(2)), user.getUid()); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - public static String getEmailHash(JdbcTemplate sql, User user) { - try { - return sql.queryForObject("SELECT hash FROM mail WHERE user_id=?", String.class, user.getUid()) - + "@mail.juick.com"; - } catch (EmptyResultDataAccessException e) { - return ""; - } - } -} diff --git a/server-core/src/main/java/com/juick/server/helpers/ApplicationStatus.java b/server-core/src/main/java/com/juick/server/helpers/ApplicationStatus.java deleted file mode 100644 index 61109c47..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/ApplicationStatus.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.juick.server.helpers; - -import org.apache.commons.lang3.builder.ToStringBuilder; - -/** - * Created by vt on 03/09/16. - */ -public class ApplicationStatus { - private boolean connected; - private boolean crosspostEnabled; - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("connected", connected) - .append("crosspostEnabled", crosspostEnabled) - .toString(); - } - - public boolean isConnected() { - return connected; - } - - public void setConnected(boolean connected) { - this.connected = connected; - } - - public boolean isCrosspostEnabled() { - return crosspostEnabled; - } - - public void setCrosspostEnabled(boolean crosspostEnabled) { - this.crosspostEnabled = crosspostEnabled; - } -} diff --git a/server-core/src/main/java/com/juick/server/helpers/Auth.java b/server-core/src/main/java/com/juick/server/helpers/Auth.java deleted file mode 100644 index 3e1f0bd9..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/Auth.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.juick.server.helpers; - -/** - * Created by vt on 09/02/16. - */ -public class Auth { - private String account; - private String authCode; - - public Auth(String account, String authCode) { - this.account = account; - this.authCode = authCode; - } - - public String getAccount() { - return account; - } - - public String getAuthCode() { - return authCode; - } -} \ No newline at end of file diff --git a/server-core/src/main/java/com/juick/server/helpers/EmailOpts.java b/server-core/src/main/java/com/juick/server/helpers/EmailOpts.java deleted file mode 100644 index 679d1a8d..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/EmailOpts.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.juick.server.helpers; - -import org.apache.commons.lang3.StringUtils; - -/** - * Created by vitalyster on 09.02.2016. - */ -public class EmailOpts { - private String email; - private String subscriptionHour; - - public EmailOpts(String email, int subscriptionHour) { - this.email = email; - this.subscriptionHour = StringUtils.leftPad(String.format("%d", subscriptionHour), 2, "0"); - } - - public String getSubscriptionHour() { - return subscriptionHour; - } - - public String getEmail() { - return email; - } -} \ No newline at end of file diff --git a/server-core/src/main/java/com/juick/server/helpers/NotifyOpts.java b/server-core/src/main/java/com/juick/server/helpers/NotifyOpts.java deleted file mode 100644 index 377b0a50..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/NotifyOpts.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.juick.server.helpers; - -/** - * Created by vt on 03/09/16. - */ -public class NotifyOpts { - private boolean repliesEnabled; - private boolean subscriptionsEnabled; - private boolean recommendationsEnabled; - - public boolean isRepliesEnabled() { - return repliesEnabled; - } - - public void setRepliesEnabled(boolean repliesEnabled) { - this.repliesEnabled = repliesEnabled; - } - - public boolean isSubscriptionsEnabled() { - return subscriptionsEnabled; - } - - public void setSubscriptionsEnabled(boolean subscriptionsEnabled) { - this.subscriptionsEnabled = subscriptionsEnabled; - } - - public boolean isRecommendationsEnabled() { - return recommendationsEnabled; - } - - public void setRecommendationsEnabled(boolean recommendationsEnabled) { - this.recommendationsEnabled = recommendationsEnabled; - } -} diff --git a/server-core/src/main/java/com/juick/server/helpers/PrivacyOpts.java b/server-core/src/main/java/com/juick/server/helpers/PrivacyOpts.java deleted file mode 100644 index 66cf9410..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/PrivacyOpts.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.juick.server.helpers; - -/** - * Created by vt on 16/01/16. - */ -public class PrivacyOpts { - private int uid; - private int privacy; - - public PrivacyOpts() { - - } - - public int getUid() { - return uid; - } - - public void setUid(int uid) { - this.uid = uid; - } - - public int getPrivacy() { - return privacy; - } - - public void setPrivacy(int privacy) { - this.privacy = privacy; - } -} diff --git a/server-core/src/main/java/com/juick/server/helpers/Status.java b/server-core/src/main/java/com/juick/server/helpers/Status.java deleted file mode 100644 index f68baae5..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/Status.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.juick.server.helpers; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Created by vitalyster on 25.07.2016. - */ -public class Status { - private String value; - - public Status(String value) { - this.value = value; - } - - @JsonProperty("status") - public String getValue() { - return value; - } -} diff --git a/server-core/src/main/java/com/juick/server/helpers/UserInfo.java b/server-core/src/main/java/com/juick/server/helpers/UserInfo.java deleted file mode 100644 index 5a4b6894..00000000 --- a/server-core/src/main/java/com/juick/server/helpers/UserInfo.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.juick.server.helpers; - -/** - * Created by vt on 03/09/16. - */ -public class UserInfo { - private String fullName; - private String country; - private String url; - private String description; - - public String getFullName() { - return fullName; - } - - public void setFullName(String fullName) { - this.fullName = fullName; - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} diff --git a/server-core/src/main/java/com/juick/server/protocol/JuickProtocol.java b/server-core/src/main/java/com/juick/server/protocol/JuickProtocol.java deleted file mode 100644 index 6fa3790e..00000000 --- a/server-core/src/main/java/com/juick/server/protocol/JuickProtocol.java +++ /dev/null @@ -1,458 +0,0 @@ -package com.juick.server.protocol; - -import com.juick.Message; -import com.juick.Tag; -import com.juick.User; -import com.juick.formatters.PlainTextFormatter; -import com.juick.json.MessageSerializer; -import com.juick.server.*; -import com.juick.server.protocol.annotation.UserCommand; -import com.juick.util.TagUtils; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * Created by oxpa on 22.03.16. - */ - -public class JuickProtocol { - MessageSerializer json = new MessageSerializer(); - JdbcTemplate sql; - String baseUri; - - public JuickProtocol(JdbcTemplate sql, String baseUri) { - this.sql = sql; - this.baseUri = baseUri; - } - - /** - * find command by pattern and invoke - * @param user who send command - * @param userInput given by user - * @return command result - * @throws InvocationTargetException - * @throws IllegalAccessException - * @throws NoSuchMethodException - */ - public ProtocolReply getReply(User user, String userInput) throws InvocationTargetException, - IllegalAccessException, NoSuchMethodException { - Optional cmd = Arrays.stream(getClass().getDeclaredMethods()) - .filter(m -> m.isAnnotationPresent(UserCommand.class)) - .filter(m -> Pattern.compile(m.getAnnotation(UserCommand.class).pattern(), - m.getAnnotation(UserCommand.class).patternFlags()).matcher(userInput).matches()) - .findFirst(); - if (!cmd.isPresent()) { - // default command - post as new message - return postMessage(user, userInput); - } else { - Matcher matcher = Pattern.compile(cmd.get().getAnnotation(UserCommand.class).pattern(), - cmd.get().getAnnotation(UserCommand.class).patternFlags()).matcher(userInput); - List groups = new ArrayList<>(); - while (matcher.find()) { - for (int i = 1; i <= matcher.groupCount(); i++) { - groups.add(matcher.group(i)); - } - } - return (ProtocolReply) getClass().getMethod(cmd.get().getName(), User.class, String[].class) - .invoke(this, user, groups.toArray(new String[groups.size()])); - } - } - - public ProtocolReply postMessage(User user, String input) { - List tags = TagQueries.fromString(sql, input, false); - String body = input.substring(TagUtils.toString(tags).length()); - int mid = MessagesQueries.createMessage(sql, user.getUid(), body, null, tags); - SubscriptionsQueries.subscribeMessage(sql, mid, user.getUid()); - //app.events().publishEvent(new JuickMessageEvent(app.messages().getMessage(mid))); - return new ProtocolReply("New message posted.\n#" + mid + " " + baseUri + mid, - Optional.of(json.serializeList(Collections.singletonList(MessagesQueries.getMessage(sql, mid))))); - } - - @UserCommand(pattern = "^#(\\++)$", help = "#+ - Show last Juick messages (#++ - second page, ...)") - public ProtocolReply commandLast(User user, String... arguments) { - // number of + is the page count - int page = arguments[0].length() - 1; - List mids = MessagesQueries.getAll(sql, user.getUid(), page); - List messages = MessagesQueries.getMessages(sql, mids); - return new ProtocolReply("Last messages: \n" + String.join("\n", messages.stream().map(PlainTextFormatter::formatPost) - .collect(Collectors.toList())), Optional.of(json.serializeList(messages))); - } - - @UserCommand(pattern = "^\\s*bl\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "BL - Show your blacklist") - public ProtocolReply commandBL(User user_from, String... arguments) { - List blusers; - List bltags; - - blusers = UserQueries.getUserBLUsers(sql, user_from.getUid()); - bltags = TagQueries.getUserBLTags(sql, user_from.getUid()); - - - String txt = ""; - if (bltags.size() > 0) { - for (String bltag : bltags) { - txt += "*" + bltag + "\n"; - } - - if (blusers.size() > 0) { - txt += "\n"; - } - } - if (blusers.size() > 0) { - for (User bluser : blusers) { - txt += "@" + bluser.getName() + "\n"; - } - } - if (txt.isEmpty()) { - txt = "You don't have any users or tags in your blacklist."; - } - return new ProtocolReply(txt, Optional.empty()); - } - - @UserCommand(pattern = "^bl\\s+@([^\\s\\n\\+]+)", patternFlags = Pattern.CASE_INSENSITIVE, - help = "BL @username - add @username to your blacklist") - public ProtocolReply blacklistUser(User from, String... arguments) { - User blUser = UserQueries.getUserByName(sql, arguments[0]); - if (blUser != null) { - PrivacyQueries.PrivacyResult result = PrivacyQueries.blacklistUser(sql, from, blUser); - if (result == PrivacyQueries.PrivacyResult.Added) { - return new ProtocolReply("User added to your blacklist", Optional.empty()); - } else { - return new ProtocolReply("User removed from your blacklist", Optional.empty()); - } - } - return new ProtocolReply("User not found", Optional.empty()); - } - - @UserCommand(pattern = "^bl\\s\\*(\\S+)$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "BL *tag - add *tag to your blacklist") - public ProtocolReply blacklistTag(User from, String... arguments) { - User blUser = UserQueries.getUserByName(sql, arguments[0]); - if (blUser != null) { - Tag tag = TagQueries.getTag(sql, arguments[0], false); - if (tag != null) { - PrivacyQueries.PrivacyResult result = PrivacyQueries.blacklistTag(sql, from, tag); - if (result == PrivacyQueries.PrivacyResult.Added) { - return new ProtocolReply("Tag added to your blacklist", Optional.empty()); - } else { - return new ProtocolReply("Tag removed from your blacklist", Optional.empty()); - } - } - } - return new ProtocolReply("Tag not found", Optional.empty()); - } - - @UserCommand(pattern = "@", help = "@ - Show recommendations and popular personal blogs") - public ProtocolReply commandUsers(User currentUser, String... args) { - StringBuilder msg = new StringBuilder(); - msg.append("Recommended blogs"); - List recommendedUsers = ShowQueries.getRecommendedUsers(sql, currentUser); - if (recommendedUsers.size() > 0) { - for (String user : recommendedUsers) { - msg.append("\n@").append(user); - } - } else { - msg.append("\nNo recommendations now. Subscribe to more blogs. ;)"); - } - msg.append("\n\nTop 10 personal blogs:"); - List topUsers = ShowQueries.getTopUsers(sql); - if (topUsers.size() > 0) { - for (String user : topUsers) { - msg.append("\n@").append(user); - } - } else { - msg.append("\nNo top users. Empty DB? ;)"); - } - return new ProtocolReply(msg.toString(), Optional.empty()); - } - - @UserCommand(pattern = "\\*", help = "* - Show your tags") - public ProtocolReply commandTags(User currentUser, String... args) { - List tags = TagQueries.getUserTagsAll(sql, currentUser.getUid()); - String msg = "Your tags: (tag - messages)\n" + - tags.stream() - .map(t -> String.format("\n*%s - %d", t.getName(), t.UsageCnt)).collect(Collectors.joining()); - return new ProtocolReply(msg, Optional.empty()); - } - - @UserCommand(pattern = "!", help = "! - Show your favorite messages") - public ProtocolReply commandFavorites(User currentUser, String... args) { - List mids = MessagesQueries.getUserRecommendations(sql, currentUser.getUid(), 0); - if (mids.size() > 0) { - List messages = MessagesQueries.getMessages(sql, mids); - return new ProtocolReply("Favorite messages: \n" + String.join("\n", messages.stream().map(PlainTextFormatter::formatPost) - .collect(Collectors.toList())), Optional.of(json.serializeList(messages))); - } - return new ProtocolReply("No favorite messages, try to \"like\" something ;)", Optional.empty()); - } - - @UserCommand(pattern = "^\\@([^\\s\\n\\+]+)(\\+?)$", - help = "@username+ - Show user's info and last 10 messages (@username++ - second page, ..)") - public ProtocolReply commandUser(User user, String... arguments) { - User blogUser = UserQueries.getUserByName(sql, arguments[0]); - int page = arguments[1].length(); - if (blogUser != null) { - List mids = MessagesQueries.getUserBlog(sql, blogUser.getUid(), 0, page); - List messages = MessagesQueries.getMessages(sql, mids); - return new ProtocolReply(String.format("Last messages from @%s:\n%s", arguments[0], - String.join("\n", messages.stream() - .map(Object::toString).collect(Collectors.toList()))), - Optional.of(json.serializeList(messages))); - } - return new ProtocolReply("User not found", Optional.empty()); - } - - @UserCommand(pattern = "^\\s*d\\s*\\#([0-9]+)\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "D #12345 - delete the message") - public ProtocolReply commandDel(User user, String... args) { - try { - int mid = Integer.parseInt(args[0]); - if (MessagesQueries.deleteMessage(sql, user.getUid(), mid)) { - return new ProtocolReply(String.format("Message %s deleted", mid), Optional.empty()); - } - } catch (NumberFormatException e) { - return new ProtocolReply("Error", Optional.empty()); - } - return new ProtocolReply("Error", Optional.empty()); - } - - @UserCommand(pattern = "^\\s*login\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "LOGIN - log in to Juick website") - public ProtocolReply commandLogin(User user, String... arguments) { - return new ProtocolReply(baseUri + "?" + UserQueries.getHashByUID(sql, user.getUid()), - Optional.empty()); - } - - @UserCommand(pattern = "^(#+)$", help = "# - Show last messages from your feed (## - second page, ...)") - public ProtocolReply commandMyFeed(User user, String... arguments) { - // number of # is the page count - int page = arguments[0].length() - 1; - List mids = MessagesQueries.getMyFeed(sql, user.getUid(), page); - List messages = MessagesQueries.getMessages(sql, mids); - // TODO: add instructions for empty feed - return new ProtocolReply("Your feed: \n" + String.join("\n", - messages.stream().map(PlainTextFormatter::formatPost).collect(Collectors.toList())), - Optional.of(json.serializeList(messages))); - } - - @UserCommand(pattern = "^\\s*(on|off)\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "ON/OFF - Enable/disable subscriptions delivery") - public ProtocolReply commandOnOff(User user, String[] input) { - UserQueries.ActiveStatus newStatus; - String retValUpdated; - if (input[0].toLowerCase().equals("on")) { - newStatus = UserQueries.ActiveStatus.Active; - retValUpdated = "Notifications are activated for " + user.getJID(); - } else { - newStatus = UserQueries.ActiveStatus.Inactive; - retValUpdated = "Notifications are disabled for " + user.getJID(); - } - - if (UserQueries.setActiveStatusForJID(sql, user.getJID(), newStatus)) { - return new ProtocolReply(retValUpdated, Optional.empty()); - } else { - return new ProtocolReply(String.format("Subscriptions status for %s was not changed", user.getJID()), - Optional.empty()); - } - } - - @UserCommand(pattern = "^\\s*ping\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "PING - returns you a PONG") - public ProtocolReply commandPing(User user, String[] input) { - return new ProtocolReply("PONG", Optional.empty()); - } - - @UserCommand(pattern = "^\\@(\\S+)\\s+([\\s\\S]+)$", help = "@username message - send PM to username") - public ProtocolReply commandPM(User user_from, String... arguments) { - String user_to = arguments[0]; - String body = arguments[1]; - int ret = 0; - - int uid_to = 0; - String jid_to = null; - boolean haveInRoster = false; - - if (user_to.indexOf('@') > 0) { - uid_to = UserQueries.getUIDbyJID(sql, user_to); - } else { - uid_to = UserQueries.getUIDbyName(sql, user_to); - } - - if (uid_to > 0) { - if (!UserQueries.isInBLAny(sql, uid_to, user_from.getUid())) { - if (PMQueries.createPM(sql, user_from.getUid(), uid_to, body)) { - //jid_to = UserQueries.getJIDsbyUID(sql, uid_to); - if (jid_to != null) { - haveInRoster = PMQueries.havePMinRoster(sql, user_from.getUid(), jid_to); - } - ret = 200; - } else { - ret = 500; - } - } else { - ret = 403; - } - } else { - ret = 404; - } - - - if (ret == 200) { - Message jmsg = new Message(); - jmsg.setUser(user_from); - jmsg.setText(body); - // TODO: add PM payload - //app.events().publishEvent(new JuickMessageEvent(jmsg)); - /* TODO: move to XMPP component - if (jid_to != null) { - Message mm = new Message(); - mm.to = new JID(jid_to); - mm.type = Message.Type.chat; - if (haveInRoster) { - mm.from = new JID(user_from.getName(), getDomain(), "Juick"); - mm.body = body; - } else { - mm.from = new JID("juick", getDomain(), "Juick"); - mm.body = "Private message from @" + user_from.getName() + ":\n" + body; - } - return Collections.singletonList(mm); - } - */ - } - if (ret == 200) { - return new ProtocolReply("Private message sent", Optional.empty()); - } else { - return new ProtocolReply("Error " + ret, Optional.empty()); - } - } - - @UserCommand(pattern = "^#(\\d+)(\\+?)$", help = "#1234 - Show message (#1234+ - message with replies)") - public ProtocolReply commandShow(User user, String... arguments) { - boolean showReplies = arguments[1].length() > 0; - int mid; - try { - mid = Integer.parseInt(arguments[0]); - } catch (NumberFormatException e) { - return new ProtocolReply("Error", Optional.empty()); - } - Message msg = MessagesQueries.getMessage(sql, mid); - if (msg != null) { - if (showReplies) { - List replies = MessagesQueries.getReplies(sql, mid); - replies.add(0, msg); - return new ProtocolReply(String.join("\n", - replies.stream().map(PlainTextFormatter::formatPost).collect(Collectors.toList())), - Optional.of(json.serializeList(replies))); - } - return new ProtocolReply(PlainTextFormatter.formatPost(msg), Optional.of(json.serializeList(Collections.singletonList(msg)))); - } - return new ProtocolReply("Message not found", Optional.empty()); - } - @UserCommand(pattern = "^(#|\\.)(\\d+)((\\.|\\-|\\/)(\\d+))?\\s([\\s\\S]+)", - help = "#1234 *tag *tag2 - edit tags\n#1234 text - reply to message") - public ProtocolReply EditOrReply(User user, String... args) { - int mid; - try { - mid = Integer.parseInt(args[1]); - } catch (NumberFormatException e) { - return new ProtocolReply("Error", Optional.empty()); - } - int rid; - try { - rid = Integer.parseInt(args[4]); - } catch (NumberFormatException e) { - rid = 0; - } - String txt = args[5]; - List messageTags = TagQueries.fromString(sql, txt, true); - if (messageTags.size() > 0) { - if (user.getUid() != MessagesQueries.getMessageAuthor(sql, mid).getUid()) { - return new ProtocolReply("It is not your message", Optional.empty()); - } - TagQueries.updateTags(sql, mid, messageTags); - return new ProtocolReply("Tags are updated", Optional.empty()); - } else { - int newrid = MessagesQueries.createReply(sql, mid, rid, user.getUid(), txt, null); - return new ProtocolReply("Reply posted.\n#" + mid + "/" + newrid + " " - + baseUri + mid + "/" + newrid, - Optional.of(json.serializeList(Collections.singletonList(MessagesQueries.getReply(sql, mid, newrid))))); - } - } - - @UserCommand(pattern = "^(s|u)\\s+#(\\d+)$", help = "S #1234 - subscribe to comments", - patternFlags = Pattern.CASE_INSENSITIVE) - public ProtocolReply commandSubscribeMessage(User user, String... args) { - boolean subscribe = args[0].equalsIgnoreCase("s"); - int mid; - try { - mid = Integer.parseInt(args[1]); - } catch (NumberFormatException e) { - return new ProtocolReply("Error", Optional.empty()); - } - if (subscribe) { - if (SubscriptionsQueries.subscribeMessage(sql, mid, user.getUid())) { - return new ProtocolReply("Subscribed", Optional.empty()); - } - } else { - if (SubscriptionsQueries.unSubscribeMessage(sql, mid, user.getUid())) { - return new ProtocolReply("Unsubscribed from #" + mid, Optional.empty()); - } - return new ProtocolReply("You was not subscribed to #" + mid, Optional.empty()); - } - return new ProtocolReply("Error", Optional.empty()); - } - @UserCommand(pattern = "^(s|u)\\s+\\@(\\S+)$", help = "S @user - subscribe to user's posts", - patternFlags = Pattern.CASE_INSENSITIVE) - public ProtocolReply commandSubscribeUser(User user, String... args) { - boolean subscribe = args[0].equalsIgnoreCase("s"); - User toUser = UserQueries.getUserByName(sql, args[1]); - if (toUser.getUid() > 0) { - if (subscribe) { - if (SubscriptionsQueries.subscribeUser(sql, user, toUser)) { - return new ProtocolReply("Subscribed", Optional.empty()); - // TODO: notification - // TODO: already subscribed case - } - } else { - if (SubscriptionsQueries.unSubscribeUser(sql, user, toUser)) { - return new ProtocolReply("Unsubscribed from @" + toUser.getName(), Optional.empty()); - } - return new ProtocolReply("You was not subscribed to @" + toUser.getName(), Optional.empty()); - } - } - return new ProtocolReply("Error", Optional.empty()); - } - @UserCommand(pattern = "^(s|u)\\s+\\*(\\S+)$", help = "S *tag - subscribe to tag" + - "\nU *tag - unsubscribe from tag", patternFlags = Pattern.CASE_INSENSITIVE) - public ProtocolReply commandSubscribeTag(User user, String... args) { - boolean subscribe = args[0].equalsIgnoreCase("s"); - Tag tag = TagQueries.getTag(sql, args[1], true); - if (subscribe) { - if (SubscriptionsQueries.subscribeTag(sql, user, tag)) { - return new ProtocolReply("Subscribed", Optional.empty()); - } - } else { - if (SubscriptionsQueries.unSubscribeTag(sql, user, tag)) { - return new ProtocolReply("Unsubscribed from " + tag.getName(), Optional.empty()); - } - return new ProtocolReply("You was not subscribed to " + tag.getName(), Optional.empty()); - } - return new ProtocolReply("Error", Optional.empty()); - } - - @UserCommand(pattern = "^\\s*help\\s*$", patternFlags = Pattern.CASE_INSENSITIVE, - help = "HELP - returns this help message") - public ProtocolReply commandHelp(User user, String[] input) { - List commandsHelp = Arrays.stream(getClass().getDeclaredMethods()) - .filter(m -> m.isAnnotationPresent(UserCommand.class)) - .map(m -> m.getAnnotation(UserCommand.class).help()) - .collect(Collectors.toList()); - return new ProtocolReply(String.join("\n", commandsHelp), Optional.empty()); - } -} diff --git a/server-core/src/main/java/com/juick/server/protocol/ProtocolReply.java b/server-core/src/main/java/com/juick/server/protocol/ProtocolReply.java deleted file mode 100644 index d9d36a5d..00000000 --- a/server-core/src/main/java/com/juick/server/protocol/ProtocolReply.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.juick.server.protocol; - -import java.util.Optional; - -/** - * Created by vitalyster on 08.04.2016. - */ -public class ProtocolReply { - - private Optional json; - private String description; - - public ProtocolReply(String text, Optional json) { - this.description = text; - this.json = json; - } - public String getDescription() { - return description; - } - public Optional getJson() { - return json; - } -} diff --git a/server-core/src/main/java/com/juick/server/protocol/annotation/UserCommand.java b/server-core/src/main/java/com/juick/server/protocol/annotation/UserCommand.java deleted file mode 100644 index af7c4924..00000000 --- a/server-core/src/main/java/com/juick/server/protocol/annotation/UserCommand.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.juick.server.protocol.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by oxpa on 22.03.16. - */ -@Target({ElementType.TYPE, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UserCommand { - /** - * - * @return a command pattern - */ - String pattern() default ""; - - /** - * - * @return pattern flags - */ - int patternFlags() default 0; - - /** - * - * @return a string used in HELP command output. Basically, only 1 string - */ - String help() default ""; -} diff --git a/server-core/src/main/java/com/juick/service/AdsService.java b/server-core/src/main/java/com/juick/service/AdsService.java deleted file mode 100644 index f8a0f5cf..00000000 --- a/server-core/src/main/java/com/juick/service/AdsService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.juick.service; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface AdsService { - - int getAdMid(int uid); - - int logAdMid(int uid, int mid); -} diff --git a/server-core/src/main/java/com/juick/service/AdsServiceImpl.java b/server-core/src/main/java/com/juick/service/AdsServiceImpl.java deleted file mode 100644 index a6a5c85d..00000000 --- a/server-core/src/main/java/com/juick/service/AdsServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.juick.service; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.Transactional; - -import javax.inject.Inject; -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -@Transactional -public class AdsServiceImpl extends BaseJdbcService implements AdsService { - - @Inject - public AdsServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Transactional(readOnly = true) - @Override - public int getAdMid(final int uid) { - List list; - - if (uid > 0) - list = getJdbcTemplate().queryForList( - "SELECT message_id FROM ads_messages " + - "WHERE message_id NOT IN (SELECT message_id FROM ads_messages_log WHERE user_id = ? " + - "AND ts > UNIX_TIMESTAMP() - 60*60*24 GROUP BY message_id HAVING COUNT(*) > 2) ORDER BY RAND() LIMIT 1", - Integer.class, - uid); - - else - list = getJdbcTemplate().queryForList( - "SELECT message_id FROM ads_messages ORDER BY RAND() LIMIT 1", - Integer.class); - - return list.isEmpty() ? - 0 : list.get(0); - } - - @Override - public int logAdMid(final int uid, final int mid) { - return getJdbcTemplate().update( - "INSERT INTO ads_messages_log(user_id, message_id, ts) VALUES (?, ?, UNIX_TIMESTAMP())", - uid, mid); - } -} diff --git a/server-core/src/main/java/com/juick/service/BaseJdbcService.java b/server-core/src/main/java/com/juick/service/BaseJdbcService.java deleted file mode 100644 index fe544efe..00000000 --- a/server-core/src/main/java/com/juick/service/BaseJdbcService.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.juick.service; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.support.TransactionTemplate; -import org.springframework.util.Assert; - -import javax.sql.DataSource; - -/** - * Created by aalexeev on 11/13/16. - */ -public abstract class BaseJdbcService { - protected final Logger logger = LoggerFactory.getLogger(getClass()); - - private final JdbcTemplate jdbcTemplate; - private final TransactionTemplate transactionTemplate; - private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; - - - protected BaseJdbcService(JdbcTemplate jdbcTemplate, PlatformTransactionManager transactionManager) { - Assert.notNull(jdbcTemplate); - - this.jdbcTemplate = jdbcTemplate; - this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); - this.transactionTemplate = (transactionManager == null) ? - null : new TransactionTemplate(transactionManager); - - } - - protected BaseJdbcService(DataSource dataSource, PlatformTransactionManager transactionManager) { - Assert.notNull(dataSource); - - this.jdbcTemplate = new JdbcTemplate(dataSource); - this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); - this.transactionTemplate = (transactionManager == null) ? - null : new TransactionTemplate(transactionManager); - - } - - protected JdbcTemplate getJdbcTemplate() { - return jdbcTemplate; - } - - protected NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() { - return namedParameterJdbcTemplate; - } - - protected TransactionTemplate getTransactionTemplate() { - return transactionTemplate; - } -} diff --git a/server-core/src/main/java/com/juick/service/CrosspostService.java b/server-core/src/main/java/com/juick/service/CrosspostService.java deleted file mode 100644 index 88821b60..00000000 --- a/server-core/src/main/java/com/juick/service/CrosspostService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.juick.service; - -import com.juick.server.helpers.ApplicationStatus; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Optional; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface CrosspostService { - - Optional> getTwitterTokens(int uid); - - Optional getFacebookToken(int uid); - - ApplicationStatus getFbCrossPostStatus(int uid); - - String getTwitterName(int uid); - - String getTelegramName(int uid); - - Optional> getVkTokens(int uid); -} diff --git a/server-core/src/main/java/com/juick/service/CrosspostServiceImpl.java b/server-core/src/main/java/com/juick/service/CrosspostServiceImpl.java deleted file mode 100644 index ed1cd676..00000000 --- a/server-core/src/main/java/com/juick/service/CrosspostServiceImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.juick.service; - -import com.juick.server.helpers.ApplicationStatus; -import org.apache.commons.lang3.tuple.Pair; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -import javax.inject.Inject; -import java.util.List; -import java.util.Optional; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -@Transactional(readOnly = true) -public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostService { - - @Inject - public CrosspostServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Override - public Optional> getTwitterTokens(final int uid) { - List>> list = getJdbcTemplate().query( - "SELECT access_token,access_token_secret FROM twitter WHERE user_id = ? AND crosspost = 1", - (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), - uid); - - return list.isEmpty() ? - Optional.empty() : list.get(0); - } - - @Override - public Optional getFacebookToken(final int uid) { - List list = getJdbcTemplate().queryForList( - "SELECT access_token FROM facebook WHERE user_id = ? AND access_token IS NOT NULL AND crosspost = 1", - String.class, - uid); - return list.isEmpty() ? - Optional.empty() : Optional.of(list.get(0)); - } - - @Override - public ApplicationStatus getFbCrossPostStatus(final int uid) { - List list = getJdbcTemplate().query( - "SELECT 1, crosspost FROM facebook WHERE user_id = ? LIMIT 1", - (rs, num) -> { - ApplicationStatus status = new ApplicationStatus(); - - status.setConnected(rs.getInt(1) > 0); - status.setCrosspostEnabled(rs.getBoolean(2)); - - return status; - }, - uid); - - return list.isEmpty() ? - new ApplicationStatus() : list.get(0); - } - - @Override - public String getTwitterName(final int uid) { - List list = getJdbcTemplate().queryForList( - "SELECT uname FROM twitter WHERE user_id = ?", - String.class, - uid); - - return list.isEmpty() ? - "" : list.get(0); - } - - @Override - public String getTelegramName(final int uid) { - List list = getJdbcTemplate().queryForList( - "SELECT tg_name FROM telegram WHERE user_id = ?", - String.class, - uid); - - return list.isEmpty() ? - "" : list.get(0); - } - - @Override - public Optional> getVkTokens(final int uid) { - 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); - - return list.isEmpty() ? - Optional.empty() : list.get(0); - } -} diff --git a/server-core/src/main/java/com/juick/service/MessagesService.java b/server-core/src/main/java/com/juick/service/MessagesService.java deleted file mode 100644 index 00f97b75..00000000 --- a/server-core/src/main/java/com/juick/service/MessagesService.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.juick.service; - -import com.juick.User; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface MessagesService { - int createMessage(int uid, String txt, String attachment, List tags); - - int createReply(int mid, int rid, int uid, String txt, String attachment); - - int getReplyIDIncrement(int mid); - - boolean recommendMessage(int mid, int vuid); - - boolean canViewThread(int mid, int uid); - - boolean isReadOnly(int mid); - - boolean isSubscribed(int uid, int mid); - - int getMessagePrivacy(int mid); - - com.juick.Message getMessage(int mid); - - com.juick.Message getReply(int mid, int rid); - - User getMessageAuthor(int mid); - - List getMessageTags(int mid); - - List getMessageTagsIDs(int mid); - - List getMessageRecommendations(int mid); - - List getAll(int visitor_uid, int before); - - List getTag(int tid, int visitor_uid, int before, int cnt); - - List getTags(String tids, int visitor_uid, int before, int cnt); - - List getPlace(int place_id, int visitor_uid, int before); - - List getMyFeed(int uid, int before); - - List getPrivate(int uid, int before); - - List getDiscussions(int uid, int before); - - List getRecommended(int uid, int before); - - List getPopular(int visitor_uid, int before); - - List getPhotos(int visitor_uid, int before); - - List getSearch(JdbcTemplate sqlSearch, String search, int before); - - List getUserBlog(int UID, int privacy, int before); - - List getUserTag(int UID, int TID, int privacy, int before); - - List getUserRecommendations(int UID, int before); - - List getUserPhotos(int UID, int privacy, int before); - - List getUserSearch(JdbcTemplate sqlSearch, int UID, String search, int privacy, int before); - - List getMessages(List mids); - - List getReplies(int mid); - - boolean setMessagePopular(int mid, int popular); - - boolean setMessagePrivacy(int mid); - - boolean deleteMessage(int uid, int mid); -} diff --git a/server-core/src/main/java/com/juick/service/MessagesServiceImpl.java b/server-core/src/main/java/com/juick/service/MessagesServiceImpl.java deleted file mode 100644 index bb030ed4..00000000 --- a/server-core/src/main/java/com/juick/service/MessagesServiceImpl.java +++ /dev/null @@ -1,857 +0,0 @@ -package com.juick.service; - -import com.juick.Message; -import com.juick.Tag; -import com.juick.User; -import com.juick.server.helpers.PrivacyOpts; -import com.juick.util.MessageUtils; -import org.apache.commons.lang3.StringEscapeUtils; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.dao.IncorrectResultSizeDataAccessException; -import org.springframework.jdbc.core.ConnectionCallback; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -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.util.Assert; -import org.springframework.util.StringUtils; - -import javax.inject.Inject; -import java.sql.*; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -public class MessagesServiceImpl extends BaseJdbcService implements MessagesService { - private final UserService userService; - - @Inject - public MessagesServiceImpl(JdbcTemplate jdbcTemplate, UserService userService) { - super(jdbcTemplate, null); - - Assert.notNull(userService); - this.userService = userService; - } - - private class MessageMapper implements RowMapper { - @Override - public Message mapRow(ResultSet rs, int rowNum) throws SQLException { - Message msg = new Message(); - msg.setMid(rs.getInt(1)); - msg.setRid(rs.getInt(2)); - msg.setReplyto(rs.getInt(3)); - User user = new User(); - user.setUid(rs.getInt(4)); - user.setName(rs.getString(5)); - user.setBanned(rs.getBoolean(6)); - msg.setUser(user); - msg.TimeAgo = rs.getInt(7); - msg.setDate(rs.getTimestamp(8)); - msg.ReadOnly = rs.getBoolean(9); - msg.setPrivacy(rs.getInt(10)); - msg.FriendsOnly = msg.getPrivacy() < 0; - msg.Replies = rs.getInt(11); - msg.AttachmentType = rs.getString(12); - if (rs.getDouble(13) != 0) { - msg.Place = new com.juick.Place(); - msg.Place.lat = rs.getDouble(14); - msg.Place.lon = rs.getDouble(15); - } - msg.Likes = rs.getInt(16); - msg.Hidden = rs.getBoolean(17); - // parse tags string - String tagsStr = rs.getString(18); - if (tagsStr != null) { - Arrays.stream(tagsStr.split(" ")).forEach(t -> msg.getTags().add(new Tag(t))); - } - msg.RepliesBy = rs.getString(19); - msg.setText(rs.getString(20)); - msg.setReplyQuote(MessageUtils.formatQuote(rs.getString(21))); - return msg; - } - } - - @Transactional - @Override - public int createMessage(final int uid, final String txt, final String attachment, final List tags) { - KeyHolder holder = new GeneratedKeyHolder(); - getJdbcTemplate().update(con -> { - PreparedStatement stmt = con.prepareStatement( - "INSERT INTO messages(user_id,attach) VALUES (?,?)", - Statement.RETURN_GENERATED_KEYS); - stmt.setInt(1, uid); - if (attachment != null) { - stmt.setString(2, attachment); - } else { - stmt.setNull(2, Types.VARCHAR); - } - return stmt; - }, holder); - - int mid = holder.getKey().intValue(); - - if (mid > 0) { - String tagsNames = ""; - String tagsIDs = ""; - - for (int i = 0; i < tags.size(); i++) { - if (i > 0) { - tagsNames += " "; - tagsIDs += ","; - } - tagsNames += tags.get(i).getName(); - tagsIDs += "(" + mid + "," + tags.get(i).TID + ")"; - } - if (tags.size() > 0) { - getJdbcTemplate().execute( - "INSERT INTO messages_tags(message_id,tag_id) VALUES " + tagsIDs); - } - final String finalTagsNames = tagsNames; - getJdbcTemplate().update(con -> { - PreparedStatement stmt = con.prepareStatement( - "INSERT INTO messages_txt(message_id,tags,txt) " + - "VALUES (?,?,?)", Statement.NO_GENERATED_KEYS); - stmt.setInt(1, mid); - if (finalTagsNames.isEmpty()) { - stmt.setNull(2, Types.VARCHAR); - } else { - stmt.setString(2, finalTagsNames); - } - stmt.setString(3, txt); - return stmt; - }); - } - - return mid; - } - - @Transactional - @Override - public int createReply(final int mid, final int rid, final int uid, final String txt, final String attachment) { - int ridnew = getReplyIDIncrement(mid); - - getJdbcTemplate().update(con -> { - PreparedStatement stmt = con.prepareStatement( - "INSERT INTO replies(message_id,reply_id,user_id,replyto,attach,txt) VALUES (?,?,?,?,?,?)", - Statement.NO_GENERATED_KEYS); - stmt.setInt(1, mid); - stmt.setInt(2, ridnew); - stmt.setInt(3, uid); - stmt.setInt(4, rid); - if (attachment != null) { - stmt.setString(5, attachment); - } else { - stmt.setNull(5, Types.VARCHAR); - } - stmt.setString(6, txt); - return stmt; - }); - - if (ridnew > 0) - getJdbcTemplate().update( - "UPDATE messages SET replies=replies+1 WHERE message_id=?", - mid); - - return ridnew; - } - - @Override - public int getReplyIDIncrement(final int mid) { - return getJdbcTemplate().execute((ConnectionCallback) conn -> { - conn.setAutoCommit(false); - final int replyNo; - try (PreparedStatement ps = conn.prepareStatement("START TRANSACTION")) { - ps.executeUpdate(); - } - try (PreparedStatement ps = conn.prepareStatement("SELECT maxreplyid+1 FROM messages WHERE message_id=? FOR UPDATE")) { - ps.setInt(1, mid); - try (ResultSet resultSet = ps.executeQuery()) { - if (resultSet.next()) { - replyNo = resultSet.getInt(1); - } else { - throw new IncorrectResultSizeDataAccessException("while getting getReplyIDIncrement, mid=" + mid, 1, 0); - } - } - } - try (PreparedStatement ps = conn.prepareStatement("UPDATE messages SET maxreplyid=? WHERE message_id=?")) { - ps.setInt(1, replyNo); - ps.setInt(2, mid); - if (ps.executeUpdate() != 1) { - throw new IncorrectResultSizeDataAccessException("Cannot find a message to update: " + mid, 1, 0); - } - } - conn.commit(); - return replyNo; - }); - - } - - @Transactional - @Override - public boolean recommendMessage(final int mid, final int vuid) { - boolean res = getJdbcTemplate().update( - "INSERT IGNORE INTO favorites(user_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; - if (res) { - getJdbcTemplate().update( - "UPDATE messages SET likes=likes+1 WHERE message_id=?", - mid); - } - return res; - } - - @Transactional(readOnly = true) - @Override - public boolean canViewThread(final int mid, final int uid) { - PrivacyOpts privacyOpts; - try { - privacyOpts = getJdbcTemplate().queryForObject( - "SELECT user_id,privacy FROM messages WHERE messages.message_id=?", - (rs, rowNum) -> { - PrivacyOpts res = new PrivacyOpts(); - res.setUid(rs.getInt(1)); - res.setPrivacy(rs.getInt(2)); - return res; - }, mid); - } catch (EmptyResultDataAccessException e) { - return true; - } - return privacyOpts.getPrivacy() >= 0 - || uid == privacyOpts.getUid() - || ((privacyOpts.getPrivacy() == -1 || privacyOpts.getPrivacy() == -2) && uid > 0 - && userService.isInWL(privacyOpts.getUid(), uid)); - } - - @Transactional(readOnly = true) - @Override - public boolean isReadOnly(final int mid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT readonly FROM messages WHERE message_id=?", - new Object[]{mid}, - Integer.class) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public boolean isSubscribed(final int uid, final int mid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT 1 FROM subscr_messages WHERE suser_id=? AND message_id=?", - new Object[]{uid, mid}, - Integer.class) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public int getMessagePrivacy(final int mid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT privacy FROM messages WHERE message_id=?", - new Object[]{mid}, - Integer.class); - } catch (EmptyResultDataAccessException e) { - return -4; - } - } - - @Transactional(readOnly = true) - @Override - public com.juick.Message getMessage(final int mid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT messages.message_id, 0 as rid, 0 as replyto, " - + "messages.user_id,users.nick, 0 as banned, " - + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," - + "messages.ts," - + "messages.readonly,messages.privacy,messages.replies," - + "messages.attach,messages.place_id,messages.lat," - + "messages.lon,messages.likes,messages.hidden," - + "txt.tags,txt.repliesby,txt.txt, '' as q FROM messages " - + "INNER JOIN users ON messages.user_id=users.id " - + "INNER JOIN messages_txt AS txt " - + "ON messages.message_id=txt.message_id " - + "WHERE messages.message_id=?", - new MessageMapper(), - mid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public com.juick.Message getReply(final int mid, final int rid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT replies.user_id,users.nick," - + "replies.replyto,replies.ts," - + "replies.attach,replies.txt, IFNULL(q.txt,t.txt) as quote FROM replies INNER JOIN users " - + "ON replies.user_id=users.id " - + "LEFT JOIN replies q " - + "ON replies.message_id=q.message_id and replies.replyto=q.reply_id " - + "LEFT JOIN messages_txt t ON replies.message_id=t.message_id " - + "WHERE replies.message_id=? AND replies.reply_id=?", - (rs, num) -> { - Message msg = new Message(); - msg.setMid(mid); - msg.setRid(rid); - msg.setUser(new User()); - msg.getUser().setUid(rs.getInt(1)); - msg.getUser().setName(rs.getString(2)); - msg.setReplyto(rs.getInt(3)); - msg.setDate(rs.getTimestamp(4)); - msg.AttachmentType = rs.getString(5); - msg.setText(rs.getString(6)); - String quote = rs.getString(7); - if (!StringUtils.isEmpty(quote)) { - msg.setReplyQuote(MessageUtils.formatQuote(quote)); - } - return msg; - }, mid, rid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public User getMessageAuthor(final int mid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT messages.user_id,users.nick " - + "FROM messages INNER JOIN users " - + "ON messages.user_id=users.id WHERE messages.message_id=?", - new Object[]{mid}, (rs, num) -> { - User res = new com.juick.User(); - res.setUid(rs.getInt(1)); - res.setName(rs.getString(2)); - return res; - }); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public List getMessageTags(final int mid) { - return getJdbcTemplate().query( - "SELECT tags.tag_id,synonym_id,name,stat_messages FROM tags " + - "INNER JOIN messages_tags ON (messages_tags.message_id=? AND messages_tags.tag_id=tags.tag_id)", - new Object[]{mid}, (rs, num) -> { - com.juick.Tag t = new com.juick.Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); - t.TID = rs.getInt(1); - t.SynonymID = rs.getInt(2); - t.UsageCnt = rs.getInt(4); - return t; - }); - } - - @Transactional(readOnly = true) - @Override - public List getMessageTagsIDs(final int mid) { - return getJdbcTemplate().queryForList( - "SELECT tag_id FROM messages_tags WHERE message_id=?", - new Object[]{mid}, - Integer.class); - } - - @Transactional(readOnly = true) - @Override - public List getMessageRecommendations(final int mid) { - return getJdbcTemplate().queryForList( - "SELECT users.nick FROM favorites INNER JOIN users " + - "ON (favorites.message_id=? AND favorites.user_id=users.id)", - new Object[]{mid}, - String.class); - } - - @Transactional(readOnly = true) - @Override - public List getAll(final int visitor_uid, final int before) { - if (visitor_uid > 1) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE message_id0 OR user_id=?) AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + - " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", - new Object[]{before, visitor_uid, visitor_uid}, - Integer.class); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE hidden=0" + - " AND (privacy>0 OR user_id=?)" + - " AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + - " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", - new Object[]{visitor_uid, visitor_uid}, - Integer.class); - } - } else { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE message_id0 AND user_id NOT IN (SELECT id from users WHERE banned=1) " + - " ORDER BY message_id DESC LIMIT 20", - new Object[]{before}, - Integer.class); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE hidden=0 AND privacy>0" + - " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", - Integer.class); - } - } - } - - @Transactional(readOnly = true) - @Override - public List getTag(final int tid, final int visitor_uid, final int before, final int cnt) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM (tags INNER JOIN messages_tags " + - "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + - "INNER JOIN messages USING(message_id) WHERE messages.message_id0 OR messages.user_id=?) ORDER BY message_id DESC LIMIT ?", - new Object[]{tid, tid, before, visitor_uid, cnt}, - Integer.class); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM (tags INNER JOIN messages_tags " + - "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + - "INNER JOIN messages USING(message_id) WHERE messages.privacy>0 OR messages.user_id=? " + - "ORDER BY message_id DESC LIMIT ?", - new Object[]{tid, tid, visitor_uid, cnt}, - Integer.class); - } - } - - @Transactional(readOnly = true) - @Override - public List getTags(final String tids, final int visitor_uid, final int before, final int cnt) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT messages.message_id FROM messages_tags " + - "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + - "AND messages.message_id0 OR messages.user_id=?) " + - "ORDER BY messages.message_id DESC LIMIT ?", - new Object[]{before, visitor_uid, cnt}, - Integer.class); - } else { - return getJdbcTemplate().queryForList( - "SELECT messages.message_id FROM messages_tags " + - "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + - "AND (messages.privacy>0 OR messages.user_id=?) " + - "ORDER BY messages.message_id DESC LIMIT ?", - new Object[]{visitor_uid, cnt}, Integer.class); - } - } - - @Transactional(readOnly = true) - @Override - public List getPlace(final int place_id, final int visitor_uid, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE place_id=? AND message_id0 OR user_id=?) ORDER BY message_id DESC LIMIT 20", - new Object[]{place_id, before, visitor_uid}, - Integer.class); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE place_id=? AND (privacy>0 OR user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", - new Object[]{place_id, visitor_uid}, - Integer.class); - } - } - - @Transactional(readOnly = true) - @Override - public List getMyFeed(final int uid, final int before) { - List mids; - if (before > 0) { - mids = getJdbcTemplate().queryForList( - "SELECT message_id FROM messages " + - "INNER JOIN subscr_users ON (subscr_users.suser_id=? AND subscr_users.user_id=messages.user_id) " + - "WHERE message_id=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + - "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", - Integer.class, - uid, - before, - uid); - } else { - mids = getJdbcTemplate().queryForList( - "SELECT message_id FROM messages " + - "INNER JOIN subscr_users ON (subscr_users.suser_id=? " + - "AND subscr_users.user_id=messages.user_id) " + - "WHERE (privacy>=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + - "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", - Integer.class, - uid, - uid); - } - - if (before > 0) { - mids.addAll(getJdbcTemplate().queryForList( - "SELECT message_id FROM messages " + - "WHERE user_id=? AND message_id getPrivate(final int uid, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList - ("SELECT message_id FROM messages WHERE user_id=? AND privacy<0 AND message_id getDiscussions(final int uid, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM subscr_messages WHERE suser_id=? AND message_id getRecommended(final int uid, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM favorites WHERE user_id " + - "IN (SELECT user_id FROM subscr_users WHERE suser_id=?) AND message_id getPopular(final int visitor_uid, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE message_id0 " + - "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", - Integer.class, - before, - visitor_uid); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE privacy>0 " + - "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", - Integer.class, - visitor_uid); - } - } - - @Transactional(readOnly = true) - @Override - public List getPhotos(final int visitor_uid, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE message_id0 OR user_id=?) " + - "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + - "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", - Integer.class, - before, - visitor_uid, - visitor_uid); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE (privacy>0 OR user_id=?) " + - "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + - "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "ORDER BY message_id DESC LIMIT 20", - Integer.class, - visitor_uid, - visitor_uid); - } - } - - @Transactional(readOnly = true) - @Override - public List getSearch(final JdbcTemplate sqlSearch, final String search, final int before) { - List mids; - - if (before > 0) { - mids = sqlSearch.queryForList( - "SELECT id AS message_id FROM messages WHERE MATCH(?) AND id 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE message_id " + - "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>0 ORDER BY message_id DESC LIMIT 20", - Integer.class); - } - return mids; - } - - @Transactional(readOnly = true) - @Override - public List getUserBlog(final int UID, final int privacy, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE user_id=? AND message_id=" + - privacy + " ORDER BY message_id DESC LIMIT 20", - Integer.class, - UID, - before); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + - " ORDER BY message_id DESC LIMIT 20", - Integer.class, - UID); - } - } - - @Transactional(readOnly = true) - @Override - public List getUserTag(final int UID, final int TID, final int privacy, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT messages.message_id FROM messages_tags INNER JOIN messages " + - "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + - "AND messages.message_id=" + privacy + - " ORDER BY messages.message_id DESC LIMIT 20", - Integer.class, - UID, - TID, - before); - } else { - return getJdbcTemplate().queryForList( - "SELECT messages.message_id FROM messages_tags INNER JOIN messages " + - "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + - "AND messages.privacy>=" + privacy + " ORDER BY messages.message_id DESC LIMIT 20", - Integer.class, - UID, - TID); - } - } - - @Transactional(readOnly = true) - @Override - public List getUserRecommendations(final int UID, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM favorites " - + "WHERE user_id=? AND message_id getUserPhotos(final int UID, final int privacy, final int before) { - if (before > 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE user_id=? AND message_id=" + - privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", - new Object[]{UID, before}, - Integer.class); - } else { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + - " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", - new Object[]{UID}, - Integer.class); - } - } - - @Transactional(readOnly = true) - @Override - public List getUserSearch(final JdbcTemplate sqlSearch, final int UID, final String search, final int privacy, final int before) { - List mids; - - if (before > 0) { - mids = sqlSearch.queryForList( - "SELECT id AS message_id FROM messages WHERE user_id=? AND MATCH(?) AND id 0) { - return getJdbcTemplate().queryForList( - "SELECT message_id FROM messages WHERE message_id IN (" + - StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>=" + privacy + " ORDER BY message_id DESC", - Integer.class); - } - return mids; - } - - @Transactional(readOnly = true) - @Override - public List getMessages(final List mids) { - if (!mids.isEmpty()) { - return getJdbcTemplate().query( - "SELECT messages.message_id, 0 as rid, 0 as replyto, " - + "messages.user_id,users.nick, 0 as banned, " - + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," - + "messages.ts," - + "messages.readonly,messages.privacy,messages.replies," - + "messages.attach,messages.place_id,messages.lat," - + "messages.lon,messages.likes,messages.hidden," - + "messages_txt.tags,messages_txt.repliesby, messages_txt.txt, '' as q " - + "FROM (messages INNER JOIN messages_txt " - + "ON messages.message_id=messages_txt.message_id) " - + "INNER JOIN users ON messages.user_id=users.id " - + "WHERE messages.message_id " - + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") " - + "ORDER BY messages.message_id DESC", - new MessageMapper()); - } - return Collections.emptyList(); - } - - @Transactional(readOnly = true) - @Override - public List getReplies(final int mid) { - return getJdbcTemplate().query( - "SELECT ? as mid, replies.reply_id,replies.replyto, " + - "replies.user_id,users.nick,users.banned, " + - "TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts," + - "0 as readonly, 0 as privacy, 0 as replies," + - "replies.attach, 0 as place_id, 0 as lat," + - "0 as lon, 0 as likes, 0 as hidden," + - "NULL as tags,NULL as repliesby, replies.txt, " + - "IFNULL(qw.txt, t.txt) as q " + - "FROM replies INNER JOIN users " + - "ON replies.user_id=users.id " + - "LEFT JOIN replies qw ON replies.message_id=qw.message_id and replies.replyto=qw.reply_id " + - "LEFT JOIN messages_txt t on replies.message_id=t.message_id " + - "WHERE replies.message_id=? " + - "ORDER BY replies.reply_id ASC", - new MessageMapper(), - mid, - mid); - } - - @Transactional - @Override - public boolean setMessagePopular(final int mid, final int popular) { - boolean ret; - switch (popular) { - case -2: - ret = getJdbcTemplate().update("UPDATE messages SET hidden=1 WHERE message_id=?", mid) > 0; - break; - case -1: - ret = getJdbcTemplate().update("UPDATE messages SET popular=0 WHERE message_id=?", mid) > 0; - break; - default: - ret = getJdbcTemplate().update("UPDATE messages SET popular=? WHERE message_id=?", popular, mid) > 0; - break; - } - if (popular == -1) { - ret = getJdbcTemplate().update("INSERT INTO top_ignore_messages VALUES (?)", mid) > 0; - } - return ret; - } - - @Transactional - @Override - public boolean setMessagePrivacy(final int mid) { - return getJdbcTemplate().update("UPDATE messages SET privacy=1 WHERE message_id=?", - mid) > 0; - } - - @Transactional - @Override - public boolean deleteMessage(final int uid, final int mid) { - if (getJdbcTemplate().update("DELETE FROM messages WHERE message_id=? AND user_id=?", mid, uid) > 0) { - getJdbcTemplate().update("DELETE FROM messages_txt WHERE message_id=?", mid); - getJdbcTemplate().update("DELETE FROM replies WHERE message_id=?", mid); - getJdbcTemplate().update("DELETE FROM subscr_messages WHERE message_id=?", mid); - getJdbcTemplate().update("DELETE FROM messages_tags WHERE message_id=?", mid); - return true; - } - return false; - } -} diff --git a/server-core/src/main/java/com/juick/service/PMQueriesService.java b/server-core/src/main/java/com/juick/service/PMQueriesService.java deleted file mode 100644 index df332870..00000000 --- a/server-core/src/main/java/com/juick/service/PMQueriesService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.juick.service; - -import com.juick.User; - -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface PMQueriesService { - boolean createPM(int uid_from, int uid_to, String body); - - boolean addPMinRoster(int uid, String jid); - - boolean removePMinRoster(int uid, String jid); - - boolean havePMinRoster(int uid, String jid); - - String getLastView(int uid_from, int uid_to); - - List getPMLastConversationsUsers(int uid, int cnt); - - List getPMMessages(int uid, int uid_to); - - List getLastPMInbox(int uid); - - List getLastPMSent(int uid); -} diff --git a/server-core/src/main/java/com/juick/service/PMQueriesServiceImpl.java b/server-core/src/main/java/com/juick/service/PMQueriesServiceImpl.java deleted file mode 100644 index 5c28c2ba..00000000 --- a/server-core/src/main/java/com/juick/service/PMQueriesServiceImpl.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.juick.service; - -import com.juick.User; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -import javax.inject.Inject; -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -public class PMQueriesServiceImpl extends BaseJdbcService implements PMQueriesService { - - @Inject - public PMQueriesServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Transactional - @Override - public boolean createPM(final int uid_from, final int uid_to, final String body) { - boolean ret = getJdbcTemplate().update( - "INSERT INTO pm(user_id,user_id_to,txt) VALUES (?,?,?)", - uid_from, uid_to, body) > 0; - - if (ret) { - getJdbcTemplate().update( - "INSERT INTO pm_streams(user_id,user_id_to,lastmessage,unread) " - + "VALUES (?,?,NOW(),1) " - + "ON DUPLICATE KEY UPDATE lastmessage=NOW(),unread=unread+1", - uid_from, uid_to); - } - return ret; - } - - @Transactional - @Override - public boolean addPMinRoster(final int uid, final String jid) { - return getJdbcTemplate().update( - "INSERT INTO pm_inroster(user_id,jid) VALUES (?,?)", - uid, jid) > 0; - } - - @Transactional - @Override - public boolean removePMinRoster(final int uid, final String jid) { - return getJdbcTemplate().update( - "DELETE FROM pm_inroster WHERE user_id=? AND jid=?", uid, jid) > 0; - } - - @Transactional - @Override - public boolean havePMinRoster(final int uid, final String jid) { - List res = getJdbcTemplate().queryForList( - "SELECT 1 FROM pm_inroster WHERE user_id=? AND jid=?", - Integer.class, - uid, - jid); - return res.size() > 0; - } - - @Transactional(readOnly = true) - @Override - public String getLastView(final int uid_from, final int uid_to) { - try { - return getJdbcTemplate().queryForObject( - "SELECT lastview FROM pm_streams WHERE user_id=? AND user_id_to=?", - String.class, - uid_from, - uid_to); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public List getPMLastConversationsUsers(final int uid, 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 " - + "WHERE pm_streams.user_id_to=? " - + "ORDER BY pm_streams.unread DESC, pm_streams.lastmessage DESC LIMIT " + cnt, - (rs, rowNum) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - u.setUnreadCount(rs.getInt(3)); - return u; - }, - uid); - } - - @Transactional - @Override - public List getPMMessages(final int uid, final int uid_to) { - List msgs = getJdbcTemplate().query( - "SELECT user_id,txt,ts FROM pm " - + "WHERE (user_id=? AND user_id_to=?) " - + "OR (user_id_to=? AND user_id=?) ORDER BY ts DESC LIMIT 20", - (rs, rowNum) -> { - com.juick.Message msg = new com.juick.Message(); - int uuid = rs.getInt(1); - msg.setUser(new User()); - msg.getUser().setUid(uuid); - msg.setText(rs.getString(2)); - msg.setDate(rs.getTimestamp(3)); - return msg; - }, - uid, - uid_to, - uid, - uid_to); - - getJdbcTemplate().update( - "UPDATE pm_streams SET lastview=NOW(),unread=0 WHERE user_id_to=? AND user_id=?", - uid, - uid_to); - - return msgs; - } - - @Transactional(readOnly = true) - @Override - public List getLastPMInbox(final int uid) { - return getJdbcTemplate().query( - "SELECT pm.user_id,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW()),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", - (rs, num) -> { - com.juick.Message msg = new com.juick.Message(); - msg.setUser(new User()); - msg.getUser().setUid(rs.getInt(1)); - msg.getUser().setName(rs.getString(2)); - msg.setText(rs.getString(3)); - msg.TimeAgo = rs.getInt(4); - msg.setDate(rs.getTimestamp(5)); - return msg; - }, - uid); - } - - @Transactional(readOnly = true) - @Override - public List getLastPMSent(final int uid) { - return getJdbcTemplate().query( - "SELECT pm.user_id_to,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW())," + - "pm.ts FROM pm INNER JOIN users ON pm.user_id_to=users.id " + - "WHERE pm.user_id=? ORDER BY pm.ts DESC LIMIT 20", - (rs, num) -> { - com.juick.Message msg = new com.juick.Message(); - msg.setUser(new User()); - msg.getUser().setUid(rs.getInt(1)); - msg.getUser().setName(rs.getString(2)); - msg.setText(rs.getString(3)); - msg.TimeAgo = rs.getInt(4); - msg.setDate(rs.getTimestamp(5)); - return msg; - }, - uid); - } -} diff --git a/server-core/src/main/java/com/juick/service/PrivacyQueriesService.java b/server-core/src/main/java/com/juick/service/PrivacyQueriesService.java deleted file mode 100644 index 61eb199b..00000000 --- a/server-core/src/main/java/com/juick/service/PrivacyQueriesService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.juick.service; - -import com.juick.Tag; -import com.juick.User; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface PrivacyQueriesService { - enum PrivacyResult { - Removed, Added - } - - PrivacyResult blacklistUser(User user, User target); - - PrivacyResult blacklistTag(User user, Tag tag); -} diff --git a/server-core/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java b/server-core/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java deleted file mode 100644 index 7dac4073..00000000 --- a/server-core/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.juick.service; - -import com.juick.Tag; -import com.juick.User; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -import javax.inject.Inject; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -@Transactional -public class PrivacyQueriesServiceImpl extends BaseJdbcService implements PrivacyQueriesService { - - @Inject - public PrivacyQueriesServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Override - public PrivacyResult blacklistUser(final User user, final User target) { - int result = getJdbcTemplate().update( - "DELETE FROM bl_users WHERE user_id=? AND bl_user_id=?", - user.getUid(), - target.getUid()); - if (result > 0) { - return PrivacyResult.Removed; - } else { - getJdbcTemplate().update( - "INSERT INTO bl_users(user_id,bl_user_id) VALUES (?,?)", - user.getUid(), - target.getUid()); - return PrivacyResult.Added; - } - } - - @Override - public PrivacyResult blacklistTag(final User user, final Tag tag) { - int result = getJdbcTemplate().update( - "DELETE FROM bl_tags WHERE user_id=? AND tag_id=?", - user.getUid(), - tag.TID); - if (result > 0) { - return PrivacyResult.Removed; - } else { - getJdbcTemplate().update( - "INSERT INTO bl_tags(user_id,tag_id) VALUES (?,?)", - user.getUid(), - tag.TID); - return PrivacyResult.Added; - } - } -} diff --git a/server-core/src/main/java/com/juick/service/PushQueriesService.java b/server-core/src/main/java/com/juick/service/PushQueriesService.java deleted file mode 100644 index 8e7ce543..00000000 --- a/server-core/src/main/java/com/juick/service/PushQueriesService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.juick.service; - -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface PushQueriesService { - List getAndroidRegID(int uid); - - List getAndroidTokens(List uids); - - List getWinPhoneURL(int uid); - - List getWindowsTokens(List uids); - - List getAPNSToken(int uid); - - List getAPNSTokens(List uids); -} diff --git a/server-core/src/main/java/com/juick/service/PushQueriesServiceImpl.java b/server-core/src/main/java/com/juick/service/PushQueriesServiceImpl.java deleted file mode 100644 index 91861bd9..00000000 --- a/server-core/src/main/java/com/juick/service/PushQueriesServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.juick.service; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; - -import javax.inject.Inject; -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -@Transactional(readOnly = true) -public class PushQueriesServiceImpl extends BaseJdbcService implements PushQueriesService { - - @Inject - public PushQueriesServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Override - public List getAndroidRegID(final int uid) { - return getJdbcTemplate().queryForList( - "SELECT regid FROM android WHERE user_id=?", - String.class, - uid); - } - - @Override - public List getAndroidTokens(final List uids) { - return getJdbcTemplate().queryForList( - "SELECT regid FROM android INNER JOIN users " + - "ON (users.id=android.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", - String.class); - } - - @Override - public List getWinPhoneURL(final int uid) { - return getJdbcTemplate().queryForList( - "SELECT url FROM winphone WHERE user_id=?", - String.class, - uid); - } - - @Override - public List getWindowsTokens(final List uids) { - return getJdbcTemplate().queryForList( - "SELECT url FROM winphone INNER JOIN users " + - "ON (users.id=winphone.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", - String.class); - } - - @Override - public List getAPNSToken(final int uid) { - return getJdbcTemplate().queryForList( - "SELECT token from ios WHERE user_id=?", - String.class, - uid); - } - - @Override - public List getAPNSTokens(final List uids) { - return getJdbcTemplate().queryForList( - "SELECT token FROM ios INNER JOIN users " + - "ON (users.id=ios.user_id) WHERE users.id IN (" + StringUtils.collectionToCommaDelimitedString(uids) + ")", - String.class); - } -} diff --git a/server-core/src/main/java/com/juick/service/ShowQueriesService.java b/server-core/src/main/java/com/juick/service/ShowQueriesService.java deleted file mode 100644 index a7e1c364..00000000 --- a/server-core/src/main/java/com/juick/service/ShowQueriesService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.juick.service; - -import com.juick.User; - -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface ShowQueriesService { - List getRecommendedUsers(User forUser); - - List getTopUsers(); -} diff --git a/server-core/src/main/java/com/juick/service/ShowQueriesServiceImpl.java b/server-core/src/main/java/com/juick/service/ShowQueriesServiceImpl.java deleted file mode 100644 index 2ddfeb84..00000000 --- a/server-core/src/main/java/com/juick/service/ShowQueriesServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.juick.service; - -import com.juick.User; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -import javax.inject.Inject; -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -@Transactional(readOnly = true) -public class ShowQueriesServiceImpl extends BaseJdbcService implements ShowQueriesService { - - @Inject - public ShowQueriesServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Override - public List getRecommendedUsers(final User forUser) { - return getJdbcTemplate().queryForList( - "SELECT users.nick FROM subscr_users INNER JOIN users " + - "ON subscr_users.user_id=users.id " + - "WHERE subscr_users.user_id NOT IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + - "AND subscr_users.suser_id IN (SELECT user_id FROM subscr_users WHERE suser_id=?) " + - "AND subscr_users.user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + - "AND subscr_users.user_id!=? AND users.lastmessage>UNIX_TIMESTAMP()-259200 " + - "GROUP BY subscr_users.user_id ORDER BY count(*) DESC LIMIT 10", - String.class, - forUser.getUid(), - forUser.getUid(), - forUser.getUid(), - forUser.getUid()); - } - - @Override - public List getTopUsers() { - return getJdbcTemplate().queryForList( - "SELECT users.nick,COUNT(subscr_users.suser_id) AS cnt " + - "FROM (subscr_users INNER JOIN users ON subscr_users.user_id=users.id) " + - "INNER JOIN useroptions ON users.id=useroptions.user_id " + - "WHERE useroptions.privacy_view>0 AND users.lastmessage > UNIX_TIMESTAMP() - 259200 " + - "AND users.id!=2 GROUP BY subscr_users.user_id ORDER BY cnt DESC LIMIT 10", - String.class); - } -} diff --git a/server-core/src/main/java/com/juick/service/SubscriptionService.java b/server-core/src/main/java/com/juick/service/SubscriptionService.java deleted file mode 100644 index 00aee15d..00000000 --- a/server-core/src/main/java/com/juick/service/SubscriptionService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.juick.service; - -import com.juick.Tag; -import com.juick.User; -import com.juick.server.helpers.NotifyOpts; - -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface SubscriptionService { - List getJIDSubscribedToUser(int uid, boolean friendsonly); - - List getSubscribedUsers(int uid, int mid); - - List getUsersSubscribedToComments(int mid, int ignore_uid); - - List getUsersSubscribedToUserRecommendations(int uid, int mid, int muid); - - boolean subscribeMessage(int mid, int vuid); - - boolean unSubscribeMessage(int mid, int vuid); - - boolean subscribeUser(User user, User toUser); - - boolean unSubscribeUser(User user, User fromUser); - - boolean subscribeTag(User user, Tag toTag); - - boolean unSubscribeTag(User user, Tag toTag); - - NotifyOpts getNotifyOptions(User user); - - boolean setNotifyOptions(User user, NotifyOpts options); -} diff --git a/server-core/src/main/java/com/juick/service/SubscriptionServiceImpl.java b/server-core/src/main/java/com/juick/service/SubscriptionServiceImpl.java deleted file mode 100644 index f6ecb658..00000000 --- a/server-core/src/main/java/com/juick/service/SubscriptionServiceImpl.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.juick.service; - -import com.juick.Tag; -import com.juick.User; -import com.juick.server.helpers.NotifyOpts; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -import javax.inject.Inject; -import java.util.*; -import java.util.stream.Collectors; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -public class SubscriptionServiceImpl extends BaseJdbcService implements SubscriptionService { - private final UserService userService; - private final MessagesService messagesService; - - @Inject - public SubscriptionServiceImpl(JdbcTemplate jdbcTemplate, UserService userService, MessagesService messagesService) { - super(jdbcTemplate, null); - - Assert.notNull(userService); - this.userService = userService; - - Assert.notNull(messagesService); - this.messagesService = messagesService; - } - - @Transactional(readOnly = true) - @Override - public List getJIDSubscribedToUser(final int uid, final boolean friendsonly) { - if (friendsonly == false) { - return getJdbcTemplate().queryForList( - "SELECT jids.jid FROM subscr_users INNER JOIN jids " + - "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1", - String.class, - uid); - } else { - return getJdbcTemplate().queryForList( - "SELECT jids.jid FROM subscr_users INNER JOIN jids " + - "ON (subscr_users.user_id=? AND subscr_users.suser_id=jids.user_id) WHERE jids.active=1 " + - "AND jids.user_id IN (SELECT wl_user_id FROM wl_users WHERE user_id=?)", - String.class, - uid, - uid); - } - } - - @Transactional(readOnly = true) - @Override - public List getSubscribedUsers(final int uid, final int mid) { - User author = messagesService.getMessageAuthor(mid); - - List userids = userService.getUserReaders(uid); - - Set set = new HashSet<>(); - set.addAll(userids.stream().map(User::getUid).collect(Collectors.toList())); - List tags = messagesService.getMessageTagsIDs(mid); - if (tags.size() > 0) { - List tagUsers = getJdbcTemplate().queryForList( - "SELECT suser_id FROM subscr_tags " + - "WHERE tag_id IN (" + StringUtils.arrayToCommaDelimitedString(tags.toArray()) + ") AND suser_id!=? " + - " AND suser_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=?)", - Integer.class, - uid, - author.getUid()); - set.addAll(tagUsers); - } - return userService.getUsersByID(new ArrayList<>(set)); - } - - @Transactional(readOnly = true) - @Override - public List getUsersSubscribedToComments(final int mid, final int ignore_uid) { - List userids = getJdbcTemplate().queryForList( - "SELECT suser_id FROM subscr_messages WHERE message_id=? AND suser_id!=?", - Integer.class, - mid, - ignore_uid); - if (userids.size() > 0) { - return userService.getUsersByID(userids); - } else { - return Collections.emptyList(); - } - } - - @Transactional(readOnly = true) - @Override - public List getUsersSubscribedToUserRecommendations(final int uid, final int mid, final int muid) { - List tags = messagesService.getMessageTagsIDs(mid); - - String query = "SELECT suser_id FROM subscr_users WHERE user_id=" + uid; - query += " AND user_id NOT IN (SELECT user_id FROM bl_users WHERE bl_user_id=" + muid + ")"; - query += " AND user_id NOT IN (SELECT suser_id FROM subscr_users WHERE user_id=" + muid + ")"; - query += " AND user_id NOT IN (SELECT suser_id FROM subscr_messages WHERE message_id=" + mid + ")"; - query += " AND user_id NOT IN (SELECT user_id FROM favorites WHERE message_id=" + mid + ")"; - query += " AND user_id NOT IN (SELECT subscr_users.suser_id FROM subscr_users INNER JOIN favorites ON (favorites.message_id=" + mid + " AND subscr_users.user_id=favorites.user_id AND favorites.user_id!=" + uid + "))"; - - if (!tags.isEmpty()) { - String tagsStr = StringUtils.arrayToCommaDelimitedString(tags.toArray()); - query += " AND user_id NOT IN (SELECT suser_id FROM subscr_tags WHERE tag_id IN (" + tagsStr + "))"; - query += " AND user_id NOT IN (SELECT user_id FROM bl_tags WHERE tag_id IN (" + tagsStr + "))"; - } - - List userids = getJdbcTemplate().queryForList(query, Integer.class); - - return userService.getUsersByID(userids); - } - - @Transactional - @Override - public boolean subscribeMessage(final int mid, final int vuid) { - return getJdbcTemplate().update( - "INSERT IGNORE INTO subscr_messages(suser_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; - } - - @Transactional - @Override - public boolean unSubscribeMessage(final int mid, final int vuid) { - return getJdbcTemplate().update( - "DELETE FROM subscr_messages WHERE message_id=? AND suser_id=?", - mid, vuid) > 0; - } - - @Transactional - @Override - public boolean subscribeUser(final User user, final User toUser) { - return getJdbcTemplate().update( - "INSERT IGNORE INTO subscr_users(user_id,suser_id) VALUES (?,?)", - toUser.getUid(), user.getUid()) == 1; - } - - @Transactional - @Override - public boolean unSubscribeUser(final User user, final User fromUser) { - return getJdbcTemplate().update( - "DELETE FROM subscr_users WHERE suser_id=? AND user_id=?", - user.getUid(), fromUser.getUid()) > 0; - } - - @Transactional - @Override - public boolean subscribeTag(final User user, final Tag toTag) { - return getJdbcTemplate().update( - "INSERT IGNORE INTO subscr_tags(tag_id,suser_id) VALUES (?,?)", - toTag.TID, user.getUid()) == 1; - } - - @Transactional - @Override - public boolean unSubscribeTag(final User user, final Tag toTag) { - return getJdbcTemplate().update( - "DELETE FROM subscr_tags WHERE tag_id=? AND suser_id=?", - toTag.TID, user.getUid()) > 0; - } - - @Transactional(readOnly = true) - @Override - public NotifyOpts getNotifyOptions(final User user) { - try { - return getJdbcTemplate().queryForObject( - "SELECT jnotify,subscr_notify,recommendations FROM useroptions WHERE user_id=?", - (rs, num) -> { - NotifyOpts options = new NotifyOpts(); - options.setRepliesEnabled(rs.getInt(1) > 0); - options.setSubscriptionsEnabled(rs.getInt(2) > 0); - options.setRecommendationsEnabled(rs.getInt(3) > 0); - return options; - }, - user.getUid()); - } catch (EmptyResultDataAccessException e) { - return new NotifyOpts(); - } - } - - @Transactional - @Override - public boolean setNotifyOptions(final User user, final NotifyOpts options) { - return getJdbcTemplate().update( - "UPDATE useroptions SET jnotify=? WHERE user_id=?", options.isRepliesEnabled() ? 1 : 0, - user.getUid()) > 0 && - getJdbcTemplate().update( - "UPDATE useroptions SET subscr_notify=? WHERE user_id=?", options.isSubscriptionsEnabled() ? 1 : 0, - user.getUid()) > 0 && - getJdbcTemplate().update( - "UPDATE useroptions SET recommendations=? WHERE user_id=?", options.isRecommendationsEnabled() ? 1 : 0, - user.getUid()) > 0; - } -} diff --git a/server-core/src/main/java/com/juick/service/TagService.java b/server-core/src/main/java/com/juick/service/TagService.java deleted file mode 100644 index d5f63e3a..00000000 --- a/server-core/src/main/java/com/juick/service/TagService.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.juick.service; - -import com.juick.Tag; - -import java.util.List; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface TagService { - com.juick.Tag getTag(int tid); - - com.juick.Tag getTag(String tag, boolean autoCreate); - - List getTags(String[] tags, boolean autoCreate); - - boolean getTagNoIndex(int tag_id); - - int createTag(String name); - - List getUserTagsAll(int uid); - - List getUserBLTags(int uid); - - List getPopularTags(); - - List updateTags(int mid, List newTags); - - List fromString(String txt, boolean tagsOnly); -} diff --git a/server-core/src/main/java/com/juick/service/TagServiceImpl.java b/server-core/src/main/java/com/juick/service/TagServiceImpl.java deleted file mode 100644 index d63159cf..00000000 --- a/server-core/src/main/java/com/juick/service/TagServiceImpl.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.juick.service; - -import com.juick.Tag; -import org.apache.commons.lang3.StringEscapeUtils; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -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.util.Assert; - -import javax.inject.Inject; -import java.sql.PreparedStatement; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -public class TagServiceImpl extends BaseJdbcService implements TagService { - private static final Pattern TAGS_PATTERN1 = Pattern.compile("^(?:(?:\\*[^ \\r\\n\\t]+)|\\s)+$"); - private static final Pattern TAGS_PATTERN2 = Pattern.compile("^\\*([^ \\r\\n\\t]+)\\s+([\\s\\S]+)"); - private static final Pattern TAG_PATTERN = Pattern.compile("\\*([^ \\r\\n\\t]+)"); - - private final MessagesService messagesService; - - @Inject - public TagServiceImpl(JdbcTemplate jdbcTemplate, MessagesService messagesService) { - super(jdbcTemplate, null); - Assert.notNull(messagesService); - this.messagesService = messagesService; - } - - @Transactional(readOnly = true) - @Override - public com.juick.Tag getTag(final int tid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT synonym_id,name FROM tags WHERE tag_id=?", - (rs, num) -> { - Tag ret = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(2))); - ret.TID = tid; - ret.SynonymID = rs.getInt(1); - return ret; - }, - tid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public com.juick.Tag getTag(final String tag, final boolean autoCreate) { - Tag ret = null; - try { - ret = getJdbcTemplate().queryForObject( - "SELECT tag_id,synonym_id,name FROM tags WHERE name=?", - (rs, rowNum) -> { - Tag ret1 = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); - ret1.TID = rs.getInt(1); - ret1.SynonymID = rs.getInt(2); - return ret1; - }, - StringEscapeUtils.escapeHtml4(tag)); - } catch (EmptyResultDataAccessException e) { - // tag not found - } - if (ret == null && autoCreate) { - ret = new com.juick.Tag(tag); - ret.TID = createTag(tag); - } - - return ret; - } - - @Override - public List getTags(final String[] tags, final boolean autoCreate) { - List ret = new ArrayList<>(); - - for (String tag : tags) { - if (!tag.isEmpty()) { - Tag t = getTag(tag, autoCreate); - if (t != null) { - ret.add(t); - } - } - } - - return ret; - } - - @Transactional(readOnly = true) - @Override - public boolean getTagNoIndex(final int tag_id) { - try { - return getJdbcTemplate().queryForObject( - "SELECT noindex FROM tags WHERE tag_id=?", Integer.class, tag_id) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional - @Override - public int createTag(final String name) { - KeyHolder holder = new GeneratedKeyHolder(); - getJdbcTemplate().update(con -> { - PreparedStatement stmt = con.prepareStatement( - "INSERT INTO tags(name) VALUES (?)", - Statement.RETURN_GENERATED_KEYS); - stmt.setString(1, StringEscapeUtils.escapeHtml4(name)); - return stmt; - }, holder); - - return holder.getKey().intValue(); - } - - @Transactional(readOnly = true) - @Override - public List getUserTagsAll(final int uid) { - return getJdbcTemplate().query( - "SELECT tags.name,COUNT(messages.message_id) " + - "FROM (messages INNER JOIN messages_tags ON (messages.user_id=? " + - "AND messages.message_id=messages_tags.message_id)) " + - "INNER JOIN tags ON messages_tags.tag_id=tags.tag_id GROUP BY tags.tag_id ORDER BY tags.name ASC", - (rs, rowNum) -> { - Tag t = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(1))); - t.UsageCnt = rs.getInt(2); - return t; - }, uid); - } - - @Transactional(readOnly = true) - @Override - public List getUserBLTags(final int uid) { - return getJdbcTemplate().queryForList( - "SELECT tags.name FROM tags INNER JOIN bl_tags " + - "ON (bl_tags.user_id=? AND bl_tags.tag_id=tags.tag_id) ORDER BY tags.name", - String.class, uid); - } - - @Transactional(readOnly = true) - @Override - public List getPopularTags() { - return getJdbcTemplate().queryForList( - "SELECT name FROM tags WHERE top=1 ORDER BY name ASC", String.class).stream() - .map(StringEscapeUtils::unescapeHtml4).collect(Collectors.toList()); - } - - @Transactional - @Override - public List updateTags(final int mid, final List newTags) { - List currentTags = messagesService.getMessageTags(mid); - newTags.stream().filter(currentTags::contains) - .forEach(t -> getJdbcTemplate().update( - "DELETE FROM messages_tags WHERE message_id=? AND tag_id=?", - mid, - t.TID)); - newTags.stream().filter(t -> !currentTags.contains(t)) - .forEach(t -> getJdbcTemplate().update( - "INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)", mid, t.TID)); - return messagesService.getMessageTags(mid); - } - - @Override - public List fromString(final String txt, final boolean tagsOnly) { - Pattern tagsPattern = tagsOnly ? TAGS_PATTERN1 : TAGS_PATTERN2; - - if (tagsPattern.matcher(txt).matches()) { - Matcher tagMatcher = TAG_PATTERN.matcher(txt); - List tags = new ArrayList<>(); - // TODO: process readonly, private, friends, public - while (tagMatcher.find()) { - for (int i = 1; i <= tagMatcher.groupCount(); i++) { - tags.add(getTag(tagMatcher.group(i), true)); - } - } - return tags; - } - return Collections.emptyList(); - } -} diff --git a/server-core/src/main/java/com/juick/service/UserService.java b/server-core/src/main/java/com/juick/service/UserService.java deleted file mode 100644 index e970afb7..00000000 --- a/server-core/src/main/java/com/juick/service/UserService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.juick.service; - -import com.juick.User; -import com.juick.server.helpers.Auth; -import com.juick.server.helpers.EmailOpts; -import com.juick.server.helpers.UserInfo; - -import java.util.List; -import java.util.Optional; - -/** - * Created by aalexeev on 11/13/16. - */ -public interface UserService { - enum ActiveStatus { - Inactive, - Active - } - - String getSignUpHashByJID(String jid); - - String getSignUpHashByTelegramID(Long telegramId, String username); - - int createUser(String username, String password); - - Optional getUserByUID(int uid); - - User getUserByName(String username); - - User getUserByJID(String jid); - - List getUsersByName(List unames); - - List getUsersByID(List uids); - - List getUsersByJID(List jids); - - List getJIDsbyUID(int uid); - - int getUIDbyJID(String jid); - - int getUIDbyName(String uname); - - int getUIDbyHash(String hash); - - com.juick.User getUserByHash(String hash); - - String getHashByUID(int uid); - - int checkPassword(String username, String password); - - boolean updatePassword(User user, String newPassword); - - String updateSecretEmail(User user); - - int getUserOptionInt(int uid, String option, int defaultValue); - - void setUserOptionInt(int uid, String option, int value); - - UserInfo getUserInfo(User user); - - boolean updateUserInfo(User user, UserInfo info); - - boolean getCanMedia(int uid); - - boolean isInWL(int uid, int check); - - boolean isInBL(int uid, int check); - - boolean isInBLAny(int uid, int uid2); - - List checkBL(int visitor, List uids); - - boolean isSubscribed(int uid, int check); - - List getUserRead(int uid); - - List getUserReadLeastPopular(int uid, int cnt); - - List getUserReaders(int uid); - - List getUserFriends(int uid); - - List getUserBLUsers(int uid); - - boolean linkTwitterAccount(User user, String accessToken, String accessTokenSecret, String screenName); - - int getStatsIRead(int uid); - - int getStatsMyReaders(int uid); - - int getStatsMessages(int uid); - - int getStatsReplies(int uid); - - boolean setActiveStatusForJID(String JID, ActiveStatus jidStatus); - - List getAllJIDs(User user); - - List getAuthCodes(User user); - - List getEmails(User user); - - EmailOpts getEmailOpts(User user); - - String getEmailHash(User user); -} diff --git a/server-core/src/main/java/com/juick/service/UserServiceImpl.java b/server-core/src/main/java/com/juick/service/UserServiceImpl.java deleted file mode 100644 index 63785cff..00000000 --- a/server-core/src/main/java/com/juick/service/UserServiceImpl.java +++ /dev/null @@ -1,614 +0,0 @@ -package com.juick.service; - -import com.juick.User; -import com.juick.server.helpers.Auth; -import com.juick.server.helpers.EmailOpts; -import com.juick.server.helpers.UserInfo; -import com.juick.util.UserUtils; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -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.util.StringUtils; - -import javax.inject.Inject; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.*; - -/** - * Created by aalexeev on 11/13/16. - */ -@Repository -public class UserServiceImpl extends BaseJdbcService implements UserService { - - private class UserMapper implements RowMapper { - @Override - public User mapRow(ResultSet rs, int rowNum) throws SQLException { - User user = new User(); - user.setUid(rs.getInt(1)); - user.setName(rs.getString(2)); - user.setBanned(rs.getBoolean(3)); - return user; - } - } - - @Inject - public UserServiceImpl(JdbcTemplate jdbcTemplate) { - super(jdbcTemplate, null); - } - - @Transactional - @Override - public String getSignUpHashByJID(final String jid) { - String hash; - try { - hash = getJdbcTemplate().queryForObject( - "SELECT loginhash FROM jids WHERE jid=? AND user_id IS NULL", - String.class, - jid); - } catch (EmptyResultDataAccessException e) { - hash = UUID.randomUUID().toString(); - getJdbcTemplate().update("INSERT INTO jids(jid,loginhash) VALUES (?,?)", jid, hash); - } - return hash; - } - - @Transactional - @Override - public String getSignUpHashByTelegramID(final Long telegramId, final String username) { - try { - return getJdbcTemplate().queryForObject( - "SELECT loginhash FROM telegram WHERE tg_id=? AND user_id IS NULL", - String.class, - telegramId); - } catch (EmptyResultDataAccessException e) { - String hash = UUID.randomUUID().toString(); - getJdbcTemplate().update( - "INSERT INTO telegram(tg_id, loginhash, tg_name) VALUES (?, ?, ?)", telegramId, hash, username); - return hash; - } - } - - @Transactional - @Override - public int createUser(final String username, final String password) { - KeyHolder holder = new GeneratedKeyHolder(); - 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; - } - - 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) { - try { - return Optional.of( - getJdbcTemplate().queryForObject("SELECT id, nick,banned FROM users WHERE id=?", - new UserMapper(), - uid)); - } catch (EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - @Transactional(readOnly = true) - @Override - public User getUserByName(final String username) { - try { - return getJdbcTemplate().queryForObject( - "SELECT id,nick,banned FROM users WHERE nick=?", - new UserMapper(), - username); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public User getUserByJID(final String jid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT id,nick,banned FROM users WHERE id=(SELECT user_id FROM jids WHERE jid=?)", - new UserMapper(), - jid); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public List getUsersByName(final List unames) { - if (!unames.isEmpty()) { - return getJdbcTemplate().query( - "SELECT id,nick,banned FROM users WHERE nick IN (\"" + StringUtils.arrayToDelimitedString(unames.toArray(), "\",\"") + "\")", - new UserMapper()); - } - return Collections.emptyList(); - } - - @Transactional(readOnly = true) - @Override - public List getUsersByID(final List uids) { - if (!uids.isEmpty()) { - return getJdbcTemplate().query( - "SELECT id,nick,banned FROM users WHERE id IN (" + StringUtils.arrayToCommaDelimitedString(uids.toArray()) + ")", - new UserMapper()); - } - return Collections.emptyList(); - } - - @Transactional(readOnly = true) - @Override - public List getUsersByJID(final List jids) { - if (!jids.isEmpty()) { - return getJdbcTemplate().query( - "SELECT users.id,users.nick,jids.jid FROM users " - + "INNER JOIN jids ON jids.user_id=users.id " - + "WHERE jids.jid IN (\"" + StringUtils.arrayToDelimitedString(jids.toArray(), "\",\"") + "\")", - (rs, rowNum) -> { - com.juick.User user = new com.juick.User(); - user.setUid(rs.getInt(1)); - user.setName(rs.getString(2)); - user.setJID(rs.getString(3)); - return user; - }); - } - return Collections.emptyList(); - } - - @Transactional(readOnly = true) - @Override - public List getJIDsbyUID(final int uid) { - 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) { - try { - return getJdbcTemplate().queryForObject("SELECT user_id FROM jids WHERE jid=?", Integer.class, jid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional(readOnly = true) - @Override - public int getUIDbyName(final String uname) { - try { - return getJdbcTemplate().queryForObject("SELECT id FROM users WHERE nick=?", Integer.class, uname); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional(readOnly = true) - @Override - public int getUIDbyHash(final String hash) { - try { - return getJdbcTemplate().queryForObject("SELECT user_id FROM logins WHERE hash=?", Integer.class, hash); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional(readOnly = true) - @Override - public com.juick.User getUserByHash(final String hash) { - try { - User user = getJdbcTemplate().queryForObject( - "SELECT logins.user_id,users.nick, users.banned FROM logins " + - "INNER JOIN users ON logins.user_id=users.id WHERE logins.hash=?", - new UserMapper(), - hash); - user.setAuthHash(hash); - return user; - } catch (EmptyResultDataAccessException e) { - return new User(); - } - } - - @Transactional - @Override - public String getHashByUID(final int uid) { - try { - return getJdbcTemplate().queryForObject( - "SELECT hash FROM logins WHERE user_id=?", String.class, uid); - } catch (EmptyResultDataAccessException e) { - String hash = UserUtils.generateHash(16); - getJdbcTemplate().update(con -> { - PreparedStatement stmt = con.prepareStatement("INSERT INTO logins(user_id,hash) VALUES (?,?)"); - stmt.setInt(1, uid); - stmt.setString(2, hash); - return stmt; - }); - return hash; - } - } - - @Transactional(readOnly = true) - @Override - public int checkPassword(final String username, final String password) { - try { - String realPassword = getJdbcTemplate().queryForObject( - "SELECT passw FROM users WHERE nick=?", String.class, username); - if (realPassword.equals(password)) { - User user = getUserByName(username); - if (user != null) { - return user.getUid(); - } else { - return -1; - } - } else { - return -1; - } - } catch (EmptyResultDataAccessException e) { - return -1; - } - } - - @Transactional - @Override - public boolean updatePassword(final User user, final String newPassword) { - return user.getUid() > 0 && getJdbcTemplate().update("UPDATE users SET passw=? WHERE id=?", newPassword, user.getUid()) > 0; - } - - @Transactional - @Override - public String updateSecretEmail(final User user) { - String newHash = UserUtils.generateHash(16); - if (getJdbcTemplate().update( - "INSERT INTO mail(user_id,hash) VALUES (?,?) ON DUPLICATE KEY UPDATE hash=?", - user.getUid(), - newHash, - newHash) > 0) { - return newHash; - } - return ""; - } - - @Transactional(readOnly = true) - @Override - public int getUserOptionInt(final int uid, final String option, final int defaultValue) { - try { - return getJdbcTemplate().queryForObject("SELECT " + option + " FROM useroptions WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return defaultValue; - } - } - - @Transactional(readOnly = true) - @Override - public void setUserOptionInt(final int uid, final String option, final int value) { - getJdbcTemplate().update("UPDATE useroptions SET " + option + "=? WHERE user_id=?", value, uid); - } - - @Transactional(readOnly = true) - @Override - public UserInfo getUserInfo(final User user) { - try { - return getJdbcTemplate().queryForObject("SELECT fullname,country,url,descr FROM usersinfo WHERE user_id=?", - ((rs, rowNum) -> { - UserInfo info = new UserInfo(); - info.setFullName(rs.getString(1)); - info.setCountry(rs.getString(2)); - info.setUrl(rs.getString(3)); - info.setDescription(rs.getString(4)); - return info; - }), user.getUid()); - } catch (EmptyResultDataAccessException e) { - return new UserInfo(); - } - } - - @Transactional - @Override - public boolean updateUserInfo(final User user, final UserInfo info) { - return getJdbcTemplate().update( - "INSERT INTO usersinfo(user_id,fullname,country,url,descr) VALUES (?,?,?,?,?) " + - "ON DUPLICATE KEY UPDATE fullname=?,country=?,url=?,descr=?", - user.getUid(), - info.getFullName(), - info.getCountry(), - info.getUrl(), - info.getDescription(), - info.getFullName(), - info.getCountry(), - info.getUrl(), - info.getDescription()) > 0; - } - - @Transactional(readOnly = true) - @Override - public boolean getCanMedia(final int uid) { - try { - int res = getJdbcTemplate().queryForObject( - "SELECT users.lastphoto-UNIX_TIMESTAMP() FROM users WHERE id=?", - Integer.class, - uid); - return res < 3600; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public boolean isInWL(final int uid, final int check) { - try { - return getJdbcTemplate().queryForObject( - "SELECT 1 FROM wl_users WHERE user_id=? AND wl_user_id=?", - Integer.class, uid, check) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public boolean isInBL(final int uid, final int check) { - try { - return getJdbcTemplate().queryForObject("SELECT 1 FROM bl_users WHERE user_id=? AND bl_user_id=?", - Integer.class, uid, check) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public boolean isInBLAny(final int uid, final int uid2) { - try { - return getJdbcTemplate().queryForObject("SELECT 1 FROM bl_users " - + "WHERE (user_id=? AND bl_user_id=?) " - + "OR (user_id=? AND bl_user_id=?)", new Object[]{uid, uid2, uid2, uid}, Integer.class) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public List checkBL(final int visitor, final List uids) { - if (!uids.isEmpty()) { - return getJdbcTemplate().queryForList( - "SELECT user_id FROM bl_users WHERE bl_user_id=? and user_id IN (" + - StringUtils.collectionToCommaDelimitedString(uids) + ")", - Integer.class, - visitor); - } else { - return new ArrayList<>(); - } - } - - @Transactional(readOnly = true) - @Override - public boolean isSubscribed(final int uid, final int check) { - try { - return getJdbcTemplate().queryForObject( - "SELECT 1 FROM subscr_users WHERE suser_id=? AND user_id=?", - Integer.class, uid, check) == 1; - } catch (EmptyResultDataAccessException e) { - return false; - } - } - - @Transactional(readOnly = true) - @Override - public List getUserRead(final int uid) { - return getJdbcTemplate().queryForList( - "SELECT user_id FROM subscr_users WHERE suser_id=?", Integer.class, uid); - } - - @Transactional(readOnly = true) - @Override - public List getUserReadLeastPopular(final int uid, final int cnt) { - return getJdbcTemplate().query( - "SELECT users.id,users.nick FROM (subscr_users " + - "INNER JOIN users_subscr ON (subscr_users.suser_id=? " + - "AND subscr_users.user_id=users_subscr.user_id)) INNER JOIN users " + - "ON subscr_users.user_id=users.id ORDER BY cnt LIMIT ?", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, - uid, - cnt); - } - - @Transactional(readOnly = true) - @Override - public List getUserReaders(final int uid) { - return getJdbcTemplate().query( - "SELECT users.id, users.nick FROM subscr_users " + - "INNER JOIN users ON subscr_users.suser_id=users.id " + - "WHERE subscr_users.user_id=? ORDER BY users.nick", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, - uid); - } - - @Transactional(readOnly = true) - @Override - public List getUserFriends(final int uid) { - return getJdbcTemplate().query( - "SELECT users.id,users.nick FROM subscr_users " + - "INNER JOIN users ON subscr_users.user_id=users.id " + - "WHERE subscr_users.suser_id=? AND users.id!=? " + - "ORDER BY users.nick", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, - uid, - uid); - } - - @Transactional(readOnly = true) - @Override - public List getUserBLUsers(final int uid) { - return getJdbcTemplate().query("SELECT users.id,users.nick FROM users INNER JOIN bl_users " + - "ON(bl_users.bl_user_id=users.id) WHERE bl_users.user_id=? ORDER BY users.nick", - (rs, num) -> { - com.juick.User u = new com.juick.User(); - u.setUid(rs.getInt(1)); - u.setName(rs.getString(2)); - return u; - }, uid); - } - - @Transactional - @Override - public boolean linkTwitterAccount( - final User user, final String accessToken, final String accessTokenSecret, final String screenName) { - if (getJdbcTemplate().update("INSERT INTO twitter(user_id,access_token,access_token_secret,uname) " + - "VALUES (?,?,?,?)" + - " ON DUPLICATE KEY UPDATE access_token=?,access_token_secret=?,uname=?", - user.getUid(), accessToken, accessTokenSecret, screenName, accessToken, accessTokenSecret, screenName) > 0) { - return getJdbcTemplate().update("INSERT INTO subscr_users(user_id,suser_id,jid) " + - "VALUES (?,1741,'juick\\@twitter.juick.com')", user.getUid()) > 0; - } - return false; - - } - - @Transactional(readOnly = true) - @Override - public int getStatsIRead(final int uid) { - try { - return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM subscr_users WHERE suser_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional(readOnly = true) - @Override - public int getStatsMyReaders(final int uid) { - try { - return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM subscr_users WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional(readOnly = true) - @Override - public int getStatsMessages(final int uid) { - try { - return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM messages WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional(readOnly = true) - @Override - public int getStatsReplies(final int uid) { - try { - return getJdbcTemplate().queryForObject("SELECT COUNT(*) FROM replies WHERE user_id=?", Integer.class, uid); - } catch (EmptyResultDataAccessException e) { - return 0; - } - } - - @Transactional - @Override - public boolean setActiveStatusForJID(final String JID, final UserService.ActiveStatus jidStatus) { - User user = getUserByJID(JID); - if (user != null) { - return getJdbcTemplate().update(con -> { - PreparedStatement preparedStatement = con.prepareStatement( - "UPDATE jids SET active=? WHERE user_id=? AND jid=?"); - int newStatus = jidStatus == UserService.ActiveStatus.Active ? 1 : 0; - preparedStatement.setInt(1, newStatus); - preparedStatement.setInt(2, user.getUid()); - preparedStatement.setString(3, JID); - return preparedStatement; - - }) >= 0; - } - return false; - } - - @Transactional(readOnly = true) - @Override - public List getAllJIDs(final User user) { - return getJdbcTemplate().queryForList( - "SELECT jid FROM jids WHERE user_id=?", String.class, user.getUid()); - } - - @Transactional(readOnly = true) - @Override - public List getAuthCodes(final User user) { - return getJdbcTemplate().query( - "SELECT account,authcode FROM auth WHERE user_id=? AND protocol='xmpp'", - (rs, num) -> new Auth(rs.getString(1), rs.getString(2)), - user.getUid()); - } - - @Transactional(readOnly = true) - @Override - public List getEmails(final User user) { - return getJdbcTemplate().queryForList("SELECT email FROM emails WHERE user_id=?", String.class, user.getUid()); - } - - @Transactional(readOnly = true) - @Override - public EmailOpts getEmailOpts(final User user) { - try { - return getJdbcTemplate().queryForObject( - "SELECT email,subscr_hour FROM emails WHERE user_id=? AND subscr_hour IS NOT NULL", - (rs, num) -> new EmailOpts(rs.getString(1), rs.getInt(2)), user.getUid()); - } catch (EmptyResultDataAccessException e) { - return null; - } - } - - @Transactional(readOnly = true) - @Override - public String getEmailHash(final User user) { - try { - return getJdbcTemplate().queryForObject( - "SELECT hash FROM mail WHERE user_id=?", - String.class, - user.getUid()) - + "@mail.juick.com"; - } catch (EmptyResultDataAccessException e) { - return ""; - } - } -} diff --git a/server-core/src/main/java/com/juick/util/TagUtils.java b/server-core/src/main/java/com/juick/util/TagUtils.java deleted file mode 100644 index 157522ab..00000000 --- a/server-core/src/main/java/com/juick/util/TagUtils.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.juick.util; - -import com.juick.Tag; -import org.apache.commons.collections4.CollectionUtils; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * Created by aalexeev on 11/13/16. - */ -public class TagUtils { - private TagUtils() { - throw new IllegalStateException(); - } - - public static String toString(final List tags) { - if (CollectionUtils.isEmpty(tags)) - return ""; - - return tags.stream().map(t -> " *" + t.getName()) - .collect(Collectors.joining()); - } -} diff --git a/server-core/src/main/java/com/juick/util/ThreadHelper.java b/server-core/src/main/java/com/juick/util/ThreadHelper.java deleted file mode 100644 index 64a56f7c..00000000 --- a/server-core/src/main/java/com/juick/util/ThreadHelper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.juick.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * Created by aalexeev on 11/11/16. - */ -public class ThreadHelper { - private ThreadHelper() { - throw new IllegalStateException(); - } - - private static Logger logger = LoggerFactory.getLogger(ThreadHelper.class); - - public static void shutdownAndAwaitTermination(ExecutorService pool) { - pool.shutdown(); // Disable new tasks from being submitted - try { - // Wait a while for existing tasks to terminate - if (!pool.awaitTermination(5, TimeUnit.SECONDS)) { - logger.info("Calls shutDownNow for pool"); - pool.shutdownNow(); // Cancel currently executing tasks - // Wait a while for tasks to respond to being cancelled - if (!pool.awaitTermination(5, TimeUnit.SECONDS)) - logger.error("Pool did not terminate"); - } - } catch (InterruptedException ie) { - // (Re-)Cancel if current thread also interrupted - pool.shutdownNow(); - // Preserve interrupt status - Thread.currentThread().interrupt(); - } - } -} diff --git a/server-core/src/main/java/com/juick/util/UserUtils.java b/server-core/src/main/java/com/juick/util/UserUtils.java deleted file mode 100644 index 611a3b15..00000000 --- a/server-core/src/main/java/com/juick/util/UserUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.juick.util; - -import java.util.Random; - -/** - * Created by aalexeev on 11/14/16. - */ -public class UserUtils { - private UserUtils() { - throw new IllegalStateException(); - } - - private static final String ABCDEF = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - public static String generateHash(final int len) { - Random rnd = new Random(); - StringBuilder sb = new StringBuilder(len); - for (int i = 0; i < len; i++) { - sb.append(ABCDEF.charAt(rnd.nextInt(ABCDEF.length()))); - } - return sb.toString(); - } - - public static boolean checkUserNameValid(final String uname) { - return uname != null && uname.length() >= 2 && uname.length() <= 16 && uname.matches("[a-zA-Z0-9\\-]+"); - } -} diff --git a/server-core/src/main/resources/juick.conf.example b/server-core/src/main/resources/juick.conf.example deleted file mode 100644 index c9411456..00000000 --- a/server-core/src/main/resources/juick.conf.example +++ /dev/null @@ -1,47 +0,0 @@ -#Driver -datasource_driver=net.sf.log4jdbc.DriverSpy -!datasource_driver=com.mysql.jdbc.Driver - -#Url -!datasource_url=jdbc:mysql://localhost:3306/juick?autoReconnect=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF8 -datasource_url=jdbc:log4jdbc:mysql://localhost:3306/juick?autoReconnect=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF8 - -#Username -datasource_user= - -#Password -datasource_password= - -twitter_consumer_key= -twitter_consumer_secret= - -crosspost_jid= -ws_jid= -push_jid= - -xmpp_host= -xmpp_port= -xmpp_password= - -push_xmpp_password= - -wns_application_sip= -wns_client_secret= -gcm_key= - -hostname= -componentname= -component_name= -component_host= -component_port= -s2s_port= -xmppbot_jid=juick@juick.com/Juick - -keystore= -keystore_password= -broken_ssl_hosts= -banned_hosts= - -upload_tmp_dir= - -xmpp_disabled=false \ No newline at end of file diff --git a/server-core/src/main/resources/logback.xml.example b/server-core/src/main/resources/logback.xml.example deleted file mode 100644 index 05a3cfdf..00000000 --- a/server-core/src/main/resources/logback.xml.example +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/server-core/src/main/resources/schema.sql b/server-core/src/main/resources/schema.sql deleted file mode 100644 index 90bb4ed4..00000000 --- a/server-core/src/main/resources/schema.sql +++ /dev/null @@ -1,885 +0,0 @@ --- MySQL dump 10.13 Distrib 5.5.44, for debian-linux-gnu (x86_64) --- --- Host: localhost Database: juick --- ------------------------------------------------------ --- Server version 5.5.44-0+deb8u1-log -use juick; -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `ads_messages` --- - -DROP TABLE IF EXISTS `ads_messages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ads_messages` ( - `message_id` int(10) unsigned NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ads_messages_log` --- - -DROP TABLE IF EXISTS `ads_messages_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ads_messages_log` ( - `user_id` int(10) unsigned NOT NULL, - `message_id` int(10) unsigned NOT NULL, - `ts` int(10) unsigned NOT NULL DEFAULT '0' -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `android` --- - -DROP TABLE IF EXISTS `android`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `android` ( - `user_id` int(10) unsigned NOT NULL, - `regid` char(255) NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY `regid` (`regid`), - KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `auth` --- - -DROP TABLE IF EXISTS `auth`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `auth` ( - `user_id` int(10) unsigned NOT NULL, - `protocol` enum('xmpp','email','sms') NOT NULL, - `account` char(64) NOT NULL, - `authcode` char(8) NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `bl_tags` --- - -DROP TABLE IF EXISTS `bl_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `bl_tags` ( - `user_id` int(10) unsigned NOT NULL, - `tag_id` int(10) unsigned NOT NULL, - KEY `tag_id` (`tag_id`), - KEY `user_id` (`user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `bl_users` --- - -DROP TABLE IF EXISTS `bl_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `bl_users` ( - `user_id` int(10) unsigned NOT NULL, - `bl_user_id` int(10) unsigned NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`user_id`,`bl_user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `captcha` --- - -DROP TABLE IF EXISTS `captcha`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `captcha` ( - `jid` char(64) NOT NULL, - `hash` char(16) NOT NULL, - `confirmed` tinyint(4) NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `captchaimg` --- - -DROP TABLE IF EXISTS `captchaimg`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `captchaimg` ( - `id` char(16) NOT NULL, - `txt` char(6) NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `ip` char(16) NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `emails` --- - -DROP TABLE IF EXISTS `emails`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `emails` ( - `user_id` int(10) unsigned NOT NULL, - `email` char(64) NOT NULL, - `subscr_hour` tinyint(4) DEFAULT NULL, - KEY `email` (`email`) USING HASH -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `facebook` --- - -DROP TABLE IF EXISTS `facebook`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `facebook` ( - `user_id` int(10) unsigned DEFAULT NULL, - `fb_id` bigint(20) unsigned NOT NULL, - `loginhash` char(36) DEFAULT NULL, - `access_token` char(255) DEFAULT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `fb_name` char(64) NOT NULL, - `fb_link` char(64) NOT NULL, - `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1', - KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `favorites` --- - -DROP TABLE IF EXISTS `favorites`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `favorites` ( - `user_id` int(10) unsigned NOT NULL, - `message_id` int(10) unsigned NOT NULL, - `ts` datetime NOT NULL, - UNIQUE KEY `user_id_2` (`user_id`,`message_id`), - KEY `user_id` (`user_id`), - KEY `message_id` (`message_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `friends_facebook` --- - -DROP TABLE IF EXISTS `friends_facebook`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `friends_facebook` ( - `user_id` int(10) unsigned NOT NULL, - `friend_id` bigint(20) unsigned NOT NULL, - UNIQUE KEY `user_id` (`user_id`,`friend_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `images` --- - -DROP TABLE IF EXISTS `images`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `images` ( - `mid` int(10) unsigned NOT NULL, - `rid` int(10) unsigned NOT NULL, - `thumb` int(10) unsigned NOT NULL, - `small` int(10) unsigned NOT NULL, - `medium` int(10) unsigned NOT NULL, - `height` int(10) unsigned NOT NULL, - `width` int(10) unsigned NOT NULL, - PRIMARY KEY (`mid`,`rid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `ios` --- - -DROP TABLE IF EXISTS `ios`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ios` ( - `user_id` int(10) unsigned NOT NULL, - `token` char(64) COLLATE utf8mb4_unicode_ci NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY `token` (`token`), - KEY `user_id` (`user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `jids` --- - -DROP TABLE IF EXISTS `jids`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `jids` ( - `user_id` int(10) unsigned DEFAULT NULL, - `jid` char(64) NOT NULL, - `active` tinyint(1) NOT NULL DEFAULT '1', - `loginhash` char(36) DEFAULT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY `jid` (`jid`), - KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `logins` --- - -DROP TABLE IF EXISTS `logins`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `logins` ( - `user_id` int(10) unsigned NOT NULL, - `hash` char(16) NOT NULL, - UNIQUE KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `mail` --- - -DROP TABLE IF EXISTS `mail`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mail` ( - `user_id` int(10) unsigned NOT NULL, - `hash` char(16) NOT NULL, - PRIMARY KEY (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `meon` --- - -DROP TABLE IF EXISTS `meon`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `meon` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `user_id` int(10) unsigned NOT NULL, - `link` char(255) NOT NULL, - `name` char(32) NOT NULL, - `ico` smallint(5) unsigned DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `messages` --- - -DROP TABLE IF EXISTS `messages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages` ( - `message_id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `user_id` int(10) unsigned NOT NULL, - `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__', - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `replies` smallint(5) unsigned NOT NULL DEFAULT '0', - `maxreplyid` smallint(5) unsigned NOT NULL DEFAULT '0', - `privacy` tinyint(4) NOT NULL DEFAULT '1', - `readonly` tinyint(1) NOT NULL DEFAULT '0', - `attach` enum('jpg','mp4','png') DEFAULT NULL, - `place_id` int(10) unsigned DEFAULT NULL, - `lat` decimal(10,7) DEFAULT NULL, - `lon` decimal(10,7) DEFAULT NULL, - `popular` tinyint(4) NOT NULL DEFAULT '0', - `hidden` tinyint(3) unsigned NOT NULL DEFAULT '0', - `likes` smallint(6) NOT NULL DEFAULT '0', - PRIMARY KEY (`message_id`), - KEY `user_id` (`user_id`), - KEY `ts` (`ts`), - KEY `attach` (`attach`), - KEY `place_id` (`place_id`), - KEY `popular` (`popular`), - KEY `hidden` (`hidden`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `messages_access` --- - -DROP TABLE IF EXISTS `messages_access`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages_access` ( - `message_id` int(10) unsigned NOT NULL, - `user_id` int(10) unsigned NOT NULL, - KEY `message_id` (`message_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `messages_tags` --- - -DROP TABLE IF EXISTS `messages_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages_tags` ( - `message_id` int(10) unsigned NOT NULL, - `tag_id` int(10) unsigned NOT NULL, - UNIQUE KEY `message_id_2` (`message_id`,`tag_id`), - KEY `message_id` (`message_id`), - KEY `tag_id` (`tag_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `messages_txt` --- - -DROP TABLE IF EXISTS `messages_txt`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages_txt` ( - `message_id` int(10) unsigned NOT NULL, - `tags` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `repliesby` varchar(96) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `txt` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`message_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `messages_votes` --- - -DROP TABLE IF EXISTS `messages_votes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `messages_votes` ( - `message_id` int(10) unsigned NOT NULL, - `user_id` int(10) unsigned NOT NULL, - `vote` tinyint(4) NOT NULL DEFAULT '1', - UNIQUE KEY `message_id` (`message_id`,`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `places` --- - -DROP TABLE IF EXISTS `places`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `places` ( - `place_id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `lat` decimal(10,7) NOT NULL, - `lon` decimal(10,7) NOT NULL, - `name` char(64) NOT NULL, - `descr` char(255) DEFAULT NULL, - `url` char(128) DEFAULT NULL, - `user_id` int(10) unsigned NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`place_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `places_tags` --- - -DROP TABLE IF EXISTS `places_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `places_tags` ( - `place_id` int(10) unsigned NOT NULL, - `tag_id` int(10) unsigned NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `pm` --- - -DROP TABLE IF EXISTS `pm`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pm` ( - `user_id` int(10) unsigned NOT NULL, - `user_id_to` int(10) unsigned NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `txt` text NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `pm_inroster` --- - -DROP TABLE IF EXISTS `pm_inroster`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pm_inroster` ( - `user_id` int(10) unsigned NOT NULL, - `jid` char(64) NOT NULL, - UNIQUE KEY `user_id_2` (`user_id`,`jid`), - KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `pm_streams` --- - -DROP TABLE IF EXISTS `pm_streams`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pm_streams` ( - `user_id` int(10) unsigned NOT NULL, - `user_id_to` int(10) unsigned NOT NULL, - `lastmessage` datetime NOT NULL, - `lastview` datetime DEFAULT NULL, - `unread` smallint(5) unsigned NOT NULL DEFAULT '0', - UNIQUE KEY `user_id` (`user_id`,`user_id_to`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `presence` --- - -DROP TABLE IF EXISTS `presence`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `presence` ( - `user_id` int(10) unsigned NOT NULL, - `jid` char(64) DEFAULT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - UNIQUE KEY `jid` (`jid`) -) ENGINE=MEMORY DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `reader_links` --- - -DROP TABLE IF EXISTS `reader_links`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `reader_links` ( - `link_id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `rss_id` int(10) unsigned NOT NULL, - `url` char(255) NOT NULL, - `title` char(255) NOT NULL, - `ts` datetime NOT NULL, - PRIMARY KEY (`link_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `reader_rss` --- - -DROP TABLE IF EXISTS `reader_rss`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `reader_rss` ( - `rss_id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `url` char(255) NOT NULL, - `lastcheck` datetime NOT NULL, - PRIMARY KEY (`rss_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `replies` --- - -DROP TABLE IF EXISTS `replies`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `replies` ( - `message_id` int(10) unsigned NOT NULL, - `reply_id` smallint(5) unsigned NOT NULL, - `user_id` int(10) unsigned NOT NULL, - `replyto` smallint(5) unsigned NOT NULL DEFAULT '0', - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `attach` enum('jpg','mp4','png') COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `txt` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, - KEY `message_id` (`message_id`), - KEY `user_id` (`user_id`), - KEY `ts` (`ts`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `sphinx` --- - -DROP TABLE IF EXISTS `sphinx`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `sphinx` ( - `counter_id` tinyint(3) unsigned NOT NULL, - `max_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`counter_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `subscr_messages` --- - -DROP TABLE IF EXISTS `subscr_messages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `subscr_messages` ( - `message_id` int(10) unsigned NOT NULL, - `suser_id` int(10) unsigned NOT NULL, - UNIQUE KEY `message_id` (`message_id`,`suser_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `subscr_tags` --- - -DROP TABLE IF EXISTS `subscr_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `subscr_tags` ( - `tag_id` int(10) unsigned NOT NULL, - `suser_id` int(10) unsigned NOT NULL, - `jid` char(64) NOT NULL, - `active` bit(1) NOT NULL DEFAULT b'1', - UNIQUE KEY `tag_id` (`tag_id`,`suser_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `subscr_users` --- - -DROP TABLE IF EXISTS `subscr_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `subscr_users` ( - `user_id` int(10) unsigned NOT NULL, - `suser_id` int(10) unsigned NOT NULL, - `jid` char(64) DEFAULT NULL, - `active` bit(1) NOT NULL DEFAULT b'1', - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY `user_id` (`user_id`,`suser_id`), - KEY `suser_id` (`suser_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `tags` --- - -DROP TABLE IF EXISTS `tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `tags` ( - `tag_id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `synonym_id` int(10) unsigned DEFAULT NULL, - `name` char(70) DEFAULT NULL, - `top` tinyint(1) unsigned NOT NULL DEFAULT '0', - `noindex` tinyint(1) unsigned NOT NULL DEFAULT '0', - `stat_messages` int(10) unsigned NOT NULL DEFAULT '0', - `stat_users` smallint(5) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`tag_id`), - KEY `synonym_id` (`synonym_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `tags_ignore` --- - -DROP TABLE IF EXISTS `tags_ignore`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `tags_ignore` ( - `tag_id` int(10) unsigned NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `tags_synonyms` --- - -DROP TABLE IF EXISTS `tags_synonyms`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `tags_synonyms` ( - `name` char(64) NOT NULL, - `changeto` char(64) NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `telegram` --- - -DROP TABLE IF EXISTS `telegram`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `telegram` ( - `user_id` int(10) unsigned DEFAULT NULL, - `tg_id` bigint(20) NOT NULL, - `tg_name` char(64) COLLATE utf8mb4_unicode_ci NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `loginhash` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `telegram_chats` --- - -DROP TABLE IF EXISTS `telegram_chats`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `telegram_chats` ( - `chat_id` bigint(20) DEFAULT NULL, - UNIQUE KEY `chat_id` (`chat_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `top_ignore_messages` --- - -DROP TABLE IF EXISTS `top_ignore_messages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `top_ignore_messages` ( - `message_id` int(10) unsigned NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `top_ignore_tags` --- - -DROP TABLE IF EXISTS `top_ignore_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `top_ignore_tags` ( - `tag_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`tag_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `top_ignore_users` --- - -DROP TABLE IF EXISTS `top_ignore_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `top_ignore_users` ( - `user_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `twitter` --- - -DROP TABLE IF EXISTS `twitter`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `twitter` ( - `user_id` int(10) unsigned NOT NULL, - `access_token` char(64) NOT NULL, - `access_token_secret` char(64) NOT NULL, - `uname` char(64) NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `useroptions` --- - -DROP TABLE IF EXISTS `useroptions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `useroptions` ( - `user_id` int(10) unsigned NOT NULL, - `jnotify` tinyint(1) NOT NULL DEFAULT '1', - `subscr_active` tinyint(1) NOT NULL DEFAULT '1', - `off_ts` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `xmppxhtml` tinyint(1) NOT NULL DEFAULT '0', - `subscr_notify` tinyint(1) NOT NULL DEFAULT '1', - `recommendations` tinyint(1) NOT NULL DEFAULT '1', - `privacy_view` tinyint(1) NOT NULL DEFAULT '1', - `privacy_reply` tinyint(1) NOT NULL DEFAULT '1', - `privacy_pm` tinyint(1) NOT NULL DEFAULT '1', - `repliesview` tinyint(1) NOT NULL DEFAULT '0', - PRIMARY KEY (`user_id`), - KEY `recommendations` (`recommendations`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `users` --- - -DROP TABLE IF EXISTS `users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `users` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `nick` char(64) NOT NULL, - `passw` char(32) NOT NULL, - `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__', - `banned` tinyint(3) unsigned NOT NULL DEFAULT '0', - `lastmessage` int(11) NOT NULL DEFAULT '0', - `lastpm` int(11) NOT NULL DEFAULT '0', - `lastphoto` int(11) NOT NULL DEFAULT '0', - `karma` smallint(6) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - UNIQUE KEY `nick` (`nick`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `users_refs` --- - -DROP TABLE IF EXISTS `users_refs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `users_refs` ( - `user_id` int(10) unsigned NOT NULL, - `ref` int(10) unsigned NOT NULL, - KEY `ref` (`ref`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `users_subscr` --- - -DROP TABLE IF EXISTS `users_subscr`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `users_subscr` ( - `user_id` int(10) unsigned NOT NULL, - `cnt` smallint(5) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `usersinfo` --- - -DROP TABLE IF EXISTS `usersinfo`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `usersinfo` ( - `user_id` int(10) unsigned NOT NULL, - `jid` char(32) DEFAULT NULL, - `fullname` char(32) DEFAULT NULL, - `country` char(32) DEFAULT NULL, - `url` char(64) DEFAULT NULL, - `gender` char(32) DEFAULT NULL, - `bday` char(10) DEFAULT NULL, - `descr` varchar(255) DEFAULT NULL, - PRIMARY KEY (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `vk` --- - -DROP TABLE IF EXISTS `vk`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `vk` ( - `user_id` int(10) unsigned DEFAULT NULL, - `vk_id` bigint(20) NOT NULL, - `loginhash` char(36) DEFAULT NULL, - `access_token` char(128) NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `vk_name` char(64) NOT NULL, - `vk_link` char(64) NOT NULL, - `crosspost` tinyint(3) unsigned NOT NULL DEFAULT '1', - KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `winphone` --- - -DROP TABLE IF EXISTS `winphone`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `winphone` ( - `user_id` int(10) unsigned NOT NULL, - `url` char(255) NOT NULL, - `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY `url` (`url`), - KEY `user_id` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `wl_users` --- - -DROP TABLE IF EXISTS `wl_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wl_users` ( - `user_id` int(10) unsigned NOT NULL, - `wl_user_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`user_id`,`wl_user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2016-09-03 14:32:11 diff --git a/settings.gradle b/settings.gradle index 2b1e5051..1edde226 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':juick-core', 'server-core', ':juick-api', ':juick-www', ':juick-rss', ':juick-ws', ':juick-demo', ':juick-notifications', ':juick-crosspost', ':juick-xmpp', ':juick-xmpp-ft', ':juick-xmpp-bot' +include ':juick-core', 'juick-server', ':juick-api', ':juick-www', ':juick-rss', ':juick-ws', ':juick-demo', ':juick-notifications', ':juick-crosspost', ':juick-xmpp', ':juick-xmpp-ft', ':juick-xmpp-bot' -- cgit v1.2.3