Fix API call POST /peers so it returns "false" for existing peer, instead of throwing / Internal Server Error

This commit is contained in:
catbref 2020-05-08 10:32:27 +01:00
parent 2ab695f308
commit 59ae070c83
2 changed files with 14 additions and 8 deletions

View File

@ -8,7 +8,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.Arrays; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -169,13 +169,14 @@ public class PeersResource {
try { try {
PeerAddress peerAddress = PeerAddress.fromString(address); PeerAddress peerAddress = PeerAddress.fromString(address);
Network.getInstance().mergePeers("API", addedWhen, Arrays.asList(peerAddress)); List<PeerAddress> newPeerAddresses = new ArrayList<>(1);
newPeerAddresses.add(peerAddress);
return "true"; boolean addResult = Network.getInstance().mergePeers("API", addedWhen, newPeerAddresses);
return addResult ? "true" : "false";
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_NETWORK_ADDRESS); throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_NETWORK_ADDRESS);
} catch (ApiException e) {
throw e;
} catch (DataException e) { } catch (DataException e) {
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e);
} }

View File

@ -1123,11 +1123,11 @@ public class Network {
} }
} }
public void mergePeers(String addedBy, long addedWhen, List<PeerAddress> peerAddresses) throws DataException { public boolean mergePeers(String addedBy, long addedWhen, List<PeerAddress> peerAddresses) throws DataException {
mergePeersLock.lock(); mergePeersLock.lock();
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
this.mergePeers(repository, addedBy, addedWhen, peerAddresses); return this.mergePeers(repository, addedBy, addedWhen, peerAddresses);
} finally { } finally {
mergePeersLock.unlock(); mergePeersLock.unlock();
} }
@ -1158,7 +1158,7 @@ public class Network {
} }
} }
private void mergePeers(Repository repository, String addedBy, long addedWhen, List<PeerAddress> peerAddresses) throws DataException { private boolean mergePeers(Repository repository, String addedBy, long addedWhen, List<PeerAddress> peerAddresses) throws DataException {
List<PeerData> newPeers; List<PeerData> newPeers;
synchronized (this.allKnownPeers) { synchronized (this.allKnownPeers) {
for (PeerData knownPeerData : this.allKnownPeers) { for (PeerData knownPeerData : this.allKnownPeers) {
@ -1167,6 +1167,9 @@ public class Network {
peerAddresses.removeIf(isKnownAddress); peerAddresses.removeIf(isKnownAddress);
} }
if (peerAddresses.isEmpty())
return false;
// Add leftover peer addresses to known peers list // Add leftover peer addresses to known peers list
newPeers = peerAddresses.stream().map(peerAddress -> new PeerData(peerAddress, addedWhen, addedBy)).collect(Collectors.toList()); newPeers = peerAddresses.stream().map(peerAddress -> new PeerData(peerAddress, addedWhen, addedBy)).collect(Collectors.toList());
@ -1184,6 +1187,8 @@ public class Network {
LOGGER.error(String.format("Repository issue while merging peers list from %s", addedBy), e); LOGGER.error(String.format("Repository issue while merging peers list from %s", addedBy), e);
throw e; throw e;
} }
return true;
} }
} }