package com.juick.service; 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> 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); } @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; } }