package fr.keemto.web;
import fr.keemto.core.AccountInterceptor;
import fr.keemto.core.User;
import fr.keemto.provider.social.SocialAccountKey;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionKey;
import org.springframework.social.connect.ConnectionRepository;
import org.springframework.util.MultiValueMap;
import java.util.List;
public class ObservableConnectionRepository implements ConnectionRepository {
private final String username;
private final ConnectionRepository repository;
private final AccountInterceptor interceptor;
public ObservableConnectionRepository(String username, ConnectionRepository repository, AccountInterceptor interceptor) {
this.username = username;
this.repository = repository;
this.interceptor = interceptor;
}
@Override
public void addConnection(Connection<?> connection) {
repository.addConnection(connection);
SocialAccountKey socialAccountKey = toSocialAccountKey(connection.getKey());
interceptor.accountCreated(socialAccountKey);
}
@Override
public void removeConnections(String providerId) {
List<Connection<?>> connections = repository.findConnections(providerId);
for (Connection<?> connection : connections) {
interceptor.accountDeleted(toSocialAccountKey(connection.getKey()));
}
repository.removeConnections(providerId);
}
@Override
public void removeConnection(ConnectionKey connectionKey) {
repository.removeConnection(connectionKey);
interceptor.accountDeleted(toSocialAccountKey(connectionKey));
}
public AccountInterceptor getInterceptor() {
return interceptor;
}
//TODO FIXME we build a fake user
private SocialAccountKey toSocialAccountKey(ConnectionKey connectionKey) {
return new SocialAccountKey(connectionKey, new User(username));
}
@Override
public MultiValueMap<String, Connection<?>> findAllConnections() {
return repository.findAllConnections();
}
@Override
public List<Connection<?>> findConnections(String providerId) {
return repository.findConnections(providerId);
}
@Override
public <A> List<Connection<A>> findConnections(Class<A> apiType) {
return repository.findConnections(apiType);
}
@Override
public MultiValueMap<String, Connection<?>> findConnectionsToUsers(MultiValueMap<String, String> providerUserIds) {
return repository.findConnectionsToUsers(providerUserIds);
}
@Override
public Connection<?> getConnection(ConnectionKey connectionKey) {
return repository.getConnection(connectionKey);
}
@Override
public <A> Connection<A> getConnection(Class<A> apiType, String providerUserId) {
return getConnection(apiType, providerUserId);
}
@Override
public <A> Connection<A> getPrimaryConnection(Class<A> apiType) {
return repository.getPrimaryConnection(apiType);
}
@Override
public <A> Connection<A> findPrimaryConnection(Class<A> apiType) {
return repository.getPrimaryConnection(apiType);
}
@Override
public void updateConnection(Connection<?> connection) {
repository.updateConnection(connection);
}
}