aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <yuuta@yuuta.moe>2021-04-03 17:04:15 -0700
committerTrumeet <yuuta@yuuta.moe>2021-04-03 17:04:15 -0700
commite97ab628c39a8650e73897b3156ae3f7d1b43d67 (patch)
tree0d3b58b388c24d81aaa980c8ae595042c83c0fc1
parentea3b64da3a5adb19f34e5a71c220b99e74c75259 (diff)
downloaddn42peering-e97ab628c39a8650e73897b3156ae3f7d1b43d67.tar
dn42peering-e97ab628c39a8650e73897b3156ae3f7d1b43d67.tar.gz
dn42peering-e97ab628c39a8650e73897b3156ae3f7d1b43d67.tar.bz2
dn42peering-e97ab628c39a8650e73897b3156ae3f7d1b43d67.zip
fix(central): editing peer does not handle duplication
-rw-r--r--central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java9
-rw-r--r--central/src/main/java/moe/yuuta/dn42peering/peer/PeerServiceImpl.java49
2 files changed, 38 insertions, 20 deletions
diff --git a/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java b/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java
index 4ba720a..8816dcb 100644
--- a/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java
+++ b/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java
@@ -260,7 +260,14 @@ public class ManageHandler implements ISubRouter {
).<Pair<Peer /* Existing */, Peer /* Input */>>compose(peer ->
Future.future(f -> peerService.updateTo(peer.b /* New Peer */, ar -> {
if (ar.succeeded()) f.complete(peer);
- else f.fail(ar.cause());
+ else {
+ if(((ServiceException)ar.cause()).getDebugInfo().getString("causeName")
+ .equals(DuplicatePeerException.class.getName())) {
+ f.fail(new FormException(peer.b, "A peer on your chosen node already exists. You can only create one peer per node."));
+ return;
+ }
+ f.fail(ar.cause());
+ }
})))
.onSuccess(pair -> {
ctx.response()
diff --git a/central/src/main/java/moe/yuuta/dn42peering/peer/PeerServiceImpl.java b/central/src/main/java/moe/yuuta/dn42peering/peer/PeerServiceImpl.java
index d202882..1f7f428 100644
--- a/central/src/main/java/moe/yuuta/dn42peering/peer/PeerServiceImpl.java
+++ b/central/src/main/java/moe/yuuta/dn42peering/peer/PeerServiceImpl.java
@@ -62,25 +62,36 @@ class PeerServiceImpl implements IPeerService {
@Nonnull
@Override
public IPeerService updateTo(@Nonnull Peer peer, @Nonnull Handler<AsyncResult<Void>> handler) {
- SqlTemplate
- .forUpdate(pool, "UPDATE peer SET " +
- "type = #{type}, " +
- "ipv4 = #{ipv4}, " +
- "ipv6 = #{ipv6}, " +
- "wg_endpoint = #{wg_endpoint}, " +
- "wg_endpoint_port = #{wg_endpoint_port}, " +
- "wg_self_pubkey = #{wg_self_pubkey}, " +
- "wg_self_privkey = #{wg_self_privkey}, " +
- "wg_peer_pubkey = #{wg_peer_pubkey}, " +
- "wg_preshared_secret = #{wg_preshared_secret}, " +
- "provision_status = #{provision_status}, " +
- "mpbgp = #{mpbgp}, " +
- "node = #{node} " +
- "WHERE id = #{id} AND asn = #{asn}")
- .mapFrom(PeerParametersMapper.INSTANCE)
- .execute(peer)
- .<Void>compose(res -> Future.succeededFuture(null))
- .onComplete(handler);
+ Future.<Void>future(f -> {
+ SqlTemplate
+ .forUpdate(pool, "UPDATE peer SET " +
+ "type = #{type}, " +
+ "ipv4 = #{ipv4}, " +
+ "ipv6 = #{ipv6}, " +
+ "wg_endpoint = #{wg_endpoint}, " +
+ "wg_endpoint_port = #{wg_endpoint_port}, " +
+ "wg_self_pubkey = #{wg_self_pubkey}, " +
+ "wg_self_privkey = #{wg_self_privkey}, " +
+ "wg_peer_pubkey = #{wg_peer_pubkey}, " +
+ "wg_preshared_secret = #{wg_preshared_secret}, " +
+ "provision_status = #{provision_status}, " +
+ "mpbgp = #{mpbgp}, " +
+ "node = #{node} " +
+ "WHERE id = #{id} AND asn = #{asn}")
+ .mapFrom(PeerParametersMapper.INSTANCE)
+ .execute(peer)
+ .<Void>compose(res -> Future.succeededFuture(null))
+ .onFailure(err -> {
+ if (err instanceof MySQLException) {
+ if (((MySQLException) err).getErrorCode() == 1062 /* Duplicate */) {
+ f.fail(new DuplicatePeerException());
+ return;
+ }
+ f.fail(err);
+ }
+ })
+ .onSuccess(f::complete);
+ }).onComplete(handler);
return this;
}