Skip to content

Commit

Permalink
refactor(core-api): sort peers by height, latency, port
Browse files Browse the repository at this point in the history
  • Loading branch information
dated committed Oct 16, 2019
1 parent 8dbe404 commit 47f5e9c
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 8 deletions.
60 changes: 59 additions & 1 deletion __tests__/integration/core-api/handlers/peers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@ import { utils } from "../utils";
const peers = [
{
ip: "1.0.0.99",
port: 4000,
port: 4001,
version: "2.4.0-next.3",
height: 2,
latency: 2,
},
{
ip: "1.0.0.98",
port: 4000,
version: "2.4.0-next.1",
height: 1,
latency: 1,
},
];

Expand Down Expand Up @@ -65,6 +69,60 @@ describe("API 2.0 - Peers", () => {
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});

it("should GET all the peers sorted by height,asc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "height:asc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[1].ip);
expect(response.data.data[1].ip).toBe(peers[0].ip);
});

it("should GET all the peers sorted by height,desc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "height:desc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});

it("should GET all the peers sorted by latency,asc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "latency:asc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[1].ip);
expect(response.data.data[1].ip).toBe(peers[0].ip);
});

it("should GET all the peers sorted by latency,desc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "latency:desc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});

it("should GET all the peers sorted by port,asc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "port:asc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[1].ip);
expect(response.data.data[1].ip).toBe(peers[0].ip);
});

it("should GET all the peers sorted by port,desc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "port:desc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});
});

describe("GET /peers/:ip", () => {
Expand Down
26 changes: 19 additions & 7 deletions packages/core-api/src/handlers/peers/controller.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { P2P } from "@arkecosystem/core-interfaces";
import { orderBy } from "@arkecosystem/utils";
import Boom from "@hapi/boom";
import Hapi from "@hapi/hapi";
import semver from "semver";
Expand All @@ -19,13 +20,24 @@ export class PeersController extends Controller {

const orderBy: string = request.query.orderBy as string;
if (orderBy) {
const order = orderBy.split(":");

if (order[0] === "version") {
result =
order[1].toUpperCase() === "ASC"
? result.sort((a, b) => semver.compare(a[order[0]], b[order[0]]))
: result.sort((a, b) => semver.rcompare(a[order[0]], b[order[0]]));
const order = orderBy.split(":").map(p => p.toLowerCase());

switch (order[0]) {
case "version": {
result =
order[1] === "asc"
? result.sort((a, b) => semver.compare(a[order[0]], b[order[0]]))
: result.sort((a, b) => semver.rcompare(a[order[0]], b[order[0]]));
break;
}
case "height":
case "latency":
case "port": {
result = orderBy(result, order[0], order[1] === "asc" ? "asc" : "desc");
break;
}
default:
break;
}
}

Expand Down

0 comments on commit 47f5e9c

Please sign in to comment.