/*
* Copyright (C) 2008-2017, Juick
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.juick.service;
import com.juick.ExternalToken;
import com.juick.server.helpers.ApplicationStatus;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
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;
import java.util.Optional;
/**
* Created by aalexeev on 11/13/16.
*/
@Repository
public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostService {
@Inject
public CrosspostServiceImpl(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate, null);
}
@Transactional(readOnly = true)
@Override
public Optional getTwitterToken(final int uid) {
List list = getJdbcTemplate().query(
"SELECT uname, access_token, access_token_secret FROM twitter WHERE user_id = ? AND crosspost = 1",
(rs, num) -> new ExternalToken(rs.getString(1), "twitter",
rs.getString(2), rs.getString(3)),
uid);
return list.isEmpty() ?
Optional.empty() : Optional.of(list.get(0));
}
@Transactional
@Override
public boolean deleteTwitterToken(Integer uid) {
return getJdbcTemplate().update("DELETE FROM twitter WHERE user_id=?", uid) > 0
&& getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=1741", uid) > 0;
}
@Transactional(readOnly = true)
@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));
}
@Transactional(readOnly = true)
@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);
}
@Transactional
@Override
public boolean enableFBCrosspost(Integer uid) {
return getJdbcTemplate().update("UPDATE facebook SET crosspost=1 WHERE user_id=?", uid) > 0
&& getJdbcTemplate().update(
"INSERT INTO subscr_users(user_id,suser_id,jid,active) VALUES (?,5863,'juick@facebook.juick.com',1)",
uid) > 0;
}
@Transactional
@Override
public void disableFBCrosspost(Integer uid) {
getJdbcTemplate().update("UPDATE facebook SET crosspost=0 WHERE user_id=?", uid);
// TODO: stop using magic numbers for system users
getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=5863", uid);
}
@Transactional(readOnly = true)
@Override
public String getTwitterName(final int uid) {
List list = getJdbcTemplate().queryForList(
"SELECT uname FROM twitter WHERE user_id = ?",
String.class,
uid);
return list.isEmpty() ?
StringUtils.EMPTY : list.get(0);
}
@Transactional(readOnly = true)
@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() ?
StringUtils.EMPTY : list.get(0);
}
@Transactional(readOnly = true)
@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);
}
@Transactional
@Override
public void deleteVKUser(Integer uid) {
getJdbcTemplate().update("DELETE FROM vk WHERE user_id=?", uid);
}
@Transactional(readOnly = true)
@Override
public int getUIDbyFBID(long fbID) {
try {
return getJdbcTemplate().queryForObject("SELECT user_id FROM facebook WHERE fb_id=? AND user_id IS NOT NULL",
Integer.class, fbID);
} catch (EmptyResultDataAccessException e) {
return 0;
}
}
@Transactional
@Override
public boolean createFacebookUser(long fbID, String loginhash, String token, String fbName, String fbLink) {
return getJdbcTemplate().update("INSERT INTO facebook(fb_id,loginhash,access_token,fb_name,fb_link) VALUES (?,?,?,?,?)",
fbID, loginhash, token, fbName, fbLink) > 0;
}
@Transactional
@Override
public boolean updateFacebookUser(long fbID, String token, String fbName, String fbLink) {
return getJdbcTemplate().update("UPDATE facebook SET access_token=?,fb_name=?,fb_link=? WHERE fb_id=?",
token, fbName, fbLink, fbID) > 0;
}
@Transactional(readOnly = true)
@Override
public int getUIDbyVKID(long vkID) {
try {
return getJdbcTemplate().queryForObject("SELECT user_id FROM vk WHERE vk_id=? AND user_id IS NOT NULL", Integer.class, vkID);
} catch (EmptyResultDataAccessException e) {
return 0;
}
}
@Transactional
@Override
public boolean createVKUser(long vkID, String loginhash, String token, String vkName, String vkLink) {
return getJdbcTemplate().update("INSERT INTO vk(vk_id,loginhash,access_token,vk_name,vk_link) VALUES (?,?,?,?,?)",
vkID, loginhash, token, vkName, vkLink) > 0;
}
@Transactional(readOnly = true)
@Override
public String getFacebookNameByHash(String hash) {
try {
List> fb = getJdbcTemplate().query("SELECT fb_name,fb_link FROM facebook WHERE loginhash=?",
(rs, num) -> Pair.of(rs.getString(1), rs.getString(2)), hash);
if (fb.size() > 0) {
return "" + fb.get(0).getLeft() + "";
}
return null;
} catch (EmptyResultDataAccessException e) {
return null;
}
}
@Transactional
@Override
public String getTelegramNameByHash(String hash) {
try {
String name = getJdbcTemplate().queryForObject("SELECT tg_name FROM telegram WHERE loginhash=?", String.class, hash);
return "" + name + "";
} catch (EmptyResultDataAccessException e) {
return null;
}
}
@Transactional
@Override
public boolean setFacebookUser(String hash, int uid) {
return getJdbcTemplate().update("UPDATE facebook SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0;
}
@Transactional
@Override
public String getVKNameByHash(String hash) {
List> logins = getJdbcTemplate().query("SELECT vk_name,vk_link FROM vk WHERE loginhash=?",
(rs, num) -> Pair.of(rs.getString(1), rs.getString(2)), hash);
if (logins.size() > 0) {
return "" + logins.get(0).getLeft() + "";
}
return null;
}
@Transactional
@Override
public boolean setVKUser(String hash, int uid) {
return getJdbcTemplate().update("UPDATE vk SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0;
}
@Transactional
@Override
public boolean setTelegramUser(String hash, int uid) {
return getJdbcTemplate().update("UPDATE telegram SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0;
}
@Transactional(readOnly = true)
@Override
public String getJIDByHash(String hash) {
try {
return getJdbcTemplate().queryForObject("SELECT jid FROM jids WHERE loginhash=?", String.class, hash);
} catch (EmptyResultDataAccessException e) {
return null;
}
}
@Transactional
@Override
public boolean setJIDUser(String hash, int uid) {
return getJdbcTemplate().update("UPDATE jids SET user_id=?,loginhash=NULL WHERE loginhash=?", uid, hash) > 0;
}
}