/* * 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.User; import com.juick.service.data.UsersRepository; import com.juick.server.helpers.ApplicationStatus; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import javax.inject.Inject; import java.util.List; import java.util.Optional; /** * Created by aalexeev on 11/13/16. */ @Repository public class CrosspostServiceImpl extends BaseJdbcService implements CrosspostService { @Inject UsersRepository usersRepository; @Transactional(readOnly = true) @Override public Optional getTwitterToken(final User user) { List list = getJdbcTemplate().query( "SELECT uname, access_token, access_token_secret FROM twitter WHERE user_id = ? AND crosspost = 1", (rs, num) -> new ExternalToken(rs.getString(1), "twitter", rs.getString(2), rs.getString(3)), user.getUid()); return list.isEmpty() ? Optional.empty() : Optional.of(list.get(0)); } @Transactional @Override public boolean deleteTwitterToken(User user) { return getJdbcTemplate().update("DELETE FROM twitter WHERE user_id=?", user.getUid()) > 0 && getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=1741", user.getUid()) > 0; } @Override public void addFacebookState(String state, String redirectUri) { jdbcTemplate.update("INSERT INTO facebook(loginhash, fb_link) VALUES(?, ?)", state, redirectUri); } @Override public void addVKState(String state, String redirectUri) { jdbcTemplate.update("INSERT INTO vk(loginhash, vk_link) VALUES(?, ?)", state, redirectUri); } @Override public String verifyFacebookState(String state) { try { return jdbcTemplate.queryForObject("SELECT fb_link FROM facebook WHERE loginhash=?", String.class, state); } catch (EmptyResultDataAccessException e) { return StringUtils.EMPTY; } } @Override public String verifyVKState(String state) { try { return jdbcTemplate.queryForObject("SELECT vk_link FROM vk WHERE loginhash=?", String.class, state); } catch (EmptyResultDataAccessException e) { return StringUtils.EMPTY; } } @Transactional(readOnly = true) @Override public Optional> getFacebookTokens(final User user) { List>> list = getJdbcTemplate().query( "SELECT fb_id, access_token FROM facebook WHERE user_id = ? AND access_token IS NOT NULL AND crosspost = 1", (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), user.getUid()); return list.isEmpty() ? Optional.empty() : list.get(0); } @Transactional(readOnly = true) @Override public ApplicationStatus getFbCrossPostStatus(final User user) { 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; }, user.getUid()); return list.isEmpty() ? new ApplicationStatus() : list.get(0); } @Transactional @Override public boolean enableFBCrosspost(User user) { return getJdbcTemplate().update("UPDATE facebook SET crosspost=1 WHERE user_id=?", user.getUid()) > 0 && getJdbcTemplate().update( "INSERT INTO subscr_users(user_id,suser_id,jid,active) VALUES (?,5863,'juick@facebook.juick.com',1)", user.getUid()) > 0; } @Transactional @Override public void disableFBCrosspost(User user) { getJdbcTemplate().update("UPDATE facebook SET crosspost=0 WHERE user_id=?", user.getUid()); // TODO: stop using magic numbers for system users getJdbcTemplate().update("DELETE FROM subscr_users WHERE user_id=? AND suser_id=5863", user.getUid()); } @Transactional(readOnly = true) @Override public String getTwitterName(final User user) { List list = getJdbcTemplate().queryForList( "SELECT uname FROM twitter WHERE user_id = ?", String.class, user.getUid()); return list.isEmpty() ? StringUtils.EMPTY : list.get(0); } @Transactional(readOnly = true) @Override public String getTelegramName(final User user) { List list = getJdbcTemplate().queryForList( "SELECT tg_name FROM telegram WHERE user_id = ?", String.class, user.getUid()); return list.isEmpty() ? StringUtils.EMPTY : list.get(0); } @Transactional(readOnly = true) @Override public Optional> getVkTokens(final User user) { List>> list = getJdbcTemplate().query( "SELECT vk_id, access_token FROM vk WHERE user_id = ? AND crosspost = 1", (rs, num) -> Optional.of(Pair.of(rs.getString(1), rs.getString(2))), user.getUid()); return list.isEmpty() ? Optional.empty() : list.get(0); } @Transactional @Override public void deleteVKUser(User user) { getJdbcTemplate().update("DELETE FROM vk WHERE user_id=?", user.getUid()); } @Transactional(readOnly = true) @Override public Optional getUserByFBID(long fbID) { return usersRepository.findByFacebookIds_FacebookId(fbID).map(EntityUtils::entityToUser); } @Transactional @Override public boolean createFacebookUser(long fbID, String loginhash, String token, String fbName, String fbLink) { return getJdbcTemplate().update("UPDATE facebook SET fb_id=?, access_token=?, fb_name=?, fb_link=? WHERE loginhash=?", fbID, token, fbName, fbLink, loginhash) > 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 Optional getUserByVKID(long vkID) { return usersRepository.findByVkIds_VkId(vkID).map(EntityUtils::entityToUser); } @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, User user) { return getJdbcTemplate().update("UPDATE facebook SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), 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, User user) { return getJdbcTemplate().update("UPDATE vk SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), hash) > 0; } @Transactional @Override public boolean setTelegramUser(String hash, User user) { return getJdbcTemplate().update("UPDATE telegram SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), 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, User user) { return getJdbcTemplate().update("UPDATE jids SET user_id=?,loginhash=NULL WHERE loginhash=?", user.getUid(), hash) > 0; } }