diff --git a/application/build.gradle b/application/build.gradle index f1cec486..529c8868 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -3,6 +3,8 @@ plugins { } dependencies { + implementation('org.springframework.boot:spring-boot-starter-web') + implementation('org.springframework.boot:spring-boot-starter-actuator') implementation project(':grpc-adapter') implementation project(':model') runtimeOnly 'org.postgresql:postgresql' diff --git a/application/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java b/application/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java new file mode 100644 index 00000000..f4b26aa2 --- /dev/null +++ b/application/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java @@ -0,0 +1,30 @@ +package de.cotto.lndmanagej.controller; + +import de.cotto.lndmanagej.grpc.GrpcNodeInfo; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +import static de.cotto.lndmanagej.model.NodeFixtures.ALIAS; +import static de.cotto.lndmanagej.model.NodeFixtures.NODE; +import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; + +@WebMvcTest(controllers = NodeController.class) +class NodeControllerIT { + @Autowired + private MockMvc mockMvc; + + @MockBean + private GrpcNodeInfo grpcNodeInfo; + + @Test + void getAlias() throws Exception { + when(grpcNodeInfo.getNode(PUBKEY)).thenReturn(NODE); + mockMvc.perform(get("/api/node/" + PUBKEY + "/alias")).andExpect(content().string(ALIAS)); + } +} \ No newline at end of file diff --git a/application/src/main/java/de/cotto/lndmanagej/controller/NodeController.java b/application/src/main/java/de/cotto/lndmanagej/controller/NodeController.java new file mode 100644 index 00000000..22df065a --- /dev/null +++ b/application/src/main/java/de/cotto/lndmanagej/controller/NodeController.java @@ -0,0 +1,23 @@ +package de.cotto.lndmanagej.controller; + +import de.cotto.lndmanagej.grpc.GrpcNodeInfo; +import de.cotto.lndmanagej.model.Pubkey; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/node/") +public class NodeController { + private final GrpcNodeInfo grpcNodeInfo; + + public NodeController(GrpcNodeInfo grpcNodeInfo) { + this.grpcNodeInfo = grpcNodeInfo; + } + + @GetMapping("/{pubkey}/alias") + public String getAlias(@PathVariable Pubkey pubkey) { + return grpcNodeInfo.getNode(pubkey).alias(); + } +} diff --git a/application/src/main/java/de/cotto/lndmanagej/controller/PubkeyConverter.java b/application/src/main/java/de/cotto/lndmanagej/controller/PubkeyConverter.java new file mode 100644 index 00000000..3a9615ef --- /dev/null +++ b/application/src/main/java/de/cotto/lndmanagej/controller/PubkeyConverter.java @@ -0,0 +1,19 @@ +package de.cotto.lndmanagej.controller; + +import de.cotto.lndmanagej.model.Pubkey; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +import javax.annotation.Nonnull; + +@Component +public class PubkeyConverter implements Converter { + public PubkeyConverter() { + // default constructor + } + + @Override + public Pubkey convert(@Nonnull String source) { + return Pubkey.create(source); + } +} diff --git a/application/src/main/resources/application.properties b/application/src/main/resources/application.properties index 0ae260e8..4034a4af 100644 --- a/application/src/main/resources/application.properties +++ b/application/src/main/resources/application.properties @@ -4,6 +4,8 @@ spring.profiles.active=default logging.level.root=info logging.pattern.console=%d %clr(%-5p) %logger: %m%rEx{2}%n spring.task.scheduling.pool.size=20 +server.address=127.0.0.1 +server.port=8080 lndmanagej.macaroon-file=${user.home}/.lnd/data/chain/bitcoin/mainnet/admin.macaroon lndmanagej.cert-file=${user.home}/.lnd/tls.cert diff --git a/application/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java b/application/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java new file mode 100644 index 00000000..956c0734 --- /dev/null +++ b/application/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java @@ -0,0 +1,35 @@ +package de.cotto.lndmanagej.controller; + +import de.cotto.lndmanagej.grpc.GrpcNodeInfo; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static de.cotto.lndmanagej.model.NodeFixtures.ALIAS; +import static de.cotto.lndmanagej.model.NodeFixtures.NODE; +import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith({MockitoExtension.class}) +class NodeControllerTest { + @InjectMocks + private NodeController nodeController; + + @Mock + private GrpcNodeInfo grpcNodeInfo; + + @Test + void getAlias() { + when(grpcNodeInfo.getNode(PUBKEY)).thenReturn(NODE); + assertThat(nodeController.getAlias(PUBKEY)).isEqualTo(ALIAS); + } + + @Test + void getAlias_uppercase_pubkey() { + when(grpcNodeInfo.getNode(PUBKEY)).thenReturn(NODE); + assertThat(nodeController.getAlias(PUBKEY)).isEqualTo(ALIAS); + } +} \ No newline at end of file diff --git a/application/src/test/java/de/cotto/lndmanagej/controller/PubkeyConverterTest.java b/application/src/test/java/de/cotto/lndmanagej/controller/PubkeyConverterTest.java new file mode 100644 index 00000000..9074458d --- /dev/null +++ b/application/src/test/java/de/cotto/lndmanagej/controller/PubkeyConverterTest.java @@ -0,0 +1,13 @@ +package de.cotto.lndmanagej.controller; + +import org.junit.jupiter.api.Test; + +import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; +import static org.assertj.core.api.Assertions.assertThat; + +class PubkeyConverterTest { + @Test + void convert() { + assertThat(new PubkeyConverter().convert(PUBKEY.toString())).isEqualTo(PUBKEY); + } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/lnd-manageJ.integration-tests.gradle b/buildSrc/src/main/groovy/lnd-manageJ.integration-tests.gradle index 2b8a115f..8889dc31 100644 --- a/buildSrc/src/main/groovy/lnd-manageJ.integration-tests.gradle +++ b/buildSrc/src/main/groovy/lnd-manageJ.integration-tests.gradle @@ -27,7 +27,8 @@ check.dependsOn integrationTest dependencies { testImplementation 'com.tngtech.archunit:archunit:0.21.0' testImplementation 'org.awaitility:awaitility:4.1.0' - + configurations.getByName('integrationTestRuntimeOnly').exclude group: 'ch.qos.logback', module: 'logback-classic' + configurations.getByName('integrationTestRuntimeOnly').exclude group: 'org.slf4j', module: 'slf4j-nop' } integrationTest { diff --git a/buildSrc/src/main/groovy/lnd-manageJ.tests.gradle b/buildSrc/src/main/groovy/lnd-manageJ.tests.gradle index 68638c73..95c3877c 100644 --- a/buildSrc/src/main/groovy/lnd-manageJ.tests.gradle +++ b/buildSrc/src/main/groovy/lnd-manageJ.tests.gradle @@ -7,8 +7,6 @@ dependencies { testImplementation 'nl.jqno.equalsverifier:equalsverifier:3.7.2' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'uk.org.lidalia:slf4j-test:1.2.0' -// configurations.getByName('integrationTestRuntimeOnly').exclude group: 'ch.qos.logback', module: 'logback-classic' -// configurations.getByName('integrationTestRuntimeOnly').exclude group: 'org.slf4j', module: 'slf4j-nop' } tasks.withType(Test).configureEach {