From e97ab628c39a8650e73897b3156ae3f7d1b43d67 Mon Sep 17 00:00:00 2001 From: Trumeet Date: Sat, 3 Apr 2021 17:04:15 -0700 Subject: fix(central): editing peer does not handle duplication --- .../yuuta/dn42peering/manage/ManageHandler.java | 9 +++- .../yuuta/dn42peering/peer/PeerServiceImpl.java | 49 +++++++++++++--------- 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 { ).>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> 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) - .compose(res -> Future.succeededFuture(null)) - .onComplete(handler); + Future.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) + .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; } -- cgit v1.2.3