Skip to content

Commit 434ba16

Browse files
committed
Support events not containing an installation
This is the case of ping for instance but also of various web hooks. Note that in this case, you can't get an installation client: - The injected GitHub client will be the very limited application one (I'm even wondering if I should prevent people from using it) - The GraphQL client cannot be injected. For anything advanced, you will have to create your own GitHub client with a token.
1 parent 8120f99 commit 434ba16

File tree

5 files changed

+30
-25
lines changed

5 files changed

+30
-25
lines changed

deployment/src/main/java/io/quarkiverse/githubapp/deployment/GitHubAppProcessor.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@
106106
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
107107
import io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyBuildItem;
108108
import io.quarkus.gizmo.AnnotatedElement;
109+
import io.quarkus.gizmo.AssignableResultHandle;
110+
import io.quarkus.gizmo.BranchResult;
109111
import io.quarkus.gizmo.BytecodeCreator;
110112
import io.quarkus.gizmo.CatchBlockCreator;
111113
import io.quarkus.gizmo.ClassCreator;
@@ -554,25 +556,37 @@ private static void generateDispatcher(ClassOutput beanClassOutput,
554556

555557
TryBlock tryBlock = dispatchMethodCreator.tryBlock();
556558

557-
ResultHandle gitHubRh = tryBlock.invokeVirtualMethod(
559+
// if the installation id is defined, we can push the installation client
560+
// if not, we have to use the very limited application client
561+
AssignableResultHandle gitHubRh = tryBlock.createVariable(GitHub.class);
562+
AssignableResultHandle gitHubGraphQLClientRh = tryBlock.createVariable(DynamicGraphQLClient.class);
563+
BranchResult testInstallationId = tryBlock.ifNotNull(installationIdRh);
564+
BytecodeCreator installationIdSet = testInstallationId.trueBranch();
565+
installationIdSet.assign(gitHubRh, installationIdSet.invokeVirtualMethod(
558566
MethodDescriptor.ofMethod(GitHubService.class, "getInstallationClient", GitHub.class, long.class),
559-
tryBlock.readInstanceField(
567+
installationIdSet.readInstanceField(
560568
FieldDescriptor.of(dispatcherClassCreator.getClassName(), GITHUB_SERVICE_FIELD, GitHubService.class),
561-
tryBlock.getThis()),
562-
installationIdRh);
563-
564-
ResultHandle gitHubGraphQLClientRh = tryBlock.loadNull();
565-
569+
installationIdSet.getThis()),
570+
installationIdRh));
566571
if (dispatchingConfiguration.requiresGraphQLClient()) {
567-
gitHubGraphQLClientRh = tryBlock.invokeVirtualMethod(
572+
installationIdSet.assign(gitHubGraphQLClientRh, installationIdSet.invokeVirtualMethod(
568573
MethodDescriptor.ofMethod(GitHubService.class, "getInstallationGraphQLClient", DynamicGraphQLClient.class,
569574
long.class),
570-
tryBlock.readInstanceField(
575+
installationIdSet.readInstanceField(
571576
FieldDescriptor.of(dispatcherClassCreator.getClassName(), GITHUB_SERVICE_FIELD,
572577
GitHubService.class),
573-
tryBlock.getThis()),
574-
installationIdRh);
578+
installationIdSet.getThis()),
579+
installationIdRh));
580+
} else {
581+
installationIdSet.assign(gitHubGraphQLClientRh, installationIdSet.loadNull());
575582
}
583+
BytecodeCreator installationIdNull = testInstallationId.falseBranch();
584+
installationIdNull.assign(gitHubRh, installationIdNull.invokeVirtualMethod(
585+
MethodDescriptor.ofMethod(GitHubService.class, "getApplicationClient", GitHub.class),
586+
installationIdNull.readInstanceField(
587+
FieldDescriptor.of(dispatcherClassCreator.getClassName(), GITHUB_SERVICE_FIELD, GitHubService.class),
588+
installationIdNull.getThis())));
589+
installationIdNull.assign(gitHubGraphQLClientRh, installationIdNull.loadNull());
576590

577591
for (EventDispatchingConfiguration eventDispatchingConfiguration : dispatchingConfiguration.getEventConfigurations()
578592
.values()) {

runtime/src/main/java/io/quarkiverse/githubapp/runtime/Routes.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -168,16 +168,7 @@ public Long extractInstallationId(JsonObject body) {
168168
}
169169
}
170170

171-
if (launchMode == LaunchMode.TEST || launchMode == LaunchMode.DEVELOPMENT) {
172-
long defaultInstallationId = 1L;
173-
LOG.infof(
174-
"Payload is lacking an installation ID; the payload was probably copy/pasted from GitHub's delivery history?"
175-
+ " Defaulting to installation ID %s",
176-
defaultInstallationId);
177-
return defaultInstallationId;
178-
}
179-
180-
throw new IllegalStateException("Unable to extract installation id from payload");
171+
return null;
181172
}
182173

183174
private static String extractRepository(JsonObject body) {

testing/src/main/java/io/quarkiverse/githubapp/testing/internal/EventSenderOptionsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ final class EventSenderOptionsImpl implements EventSenderOptions {
2929

3030
private UUID requestId;
3131
private UUID deliveryId;
32-
private long installationId;
32+
private Long installationId;
3333
private String payload;
3434
private String contentType;
3535

testing/src/main/java/io/quarkiverse/githubapp/testing/internal/GitHubMockContextImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,8 @@ void init() {
181181
.thenAnswer(invocation -> installationGraphQLClient(invocation.getArgument(0, Long.class)));
182182
}
183183

184-
void initEventStubs(long installationId) {
185-
GitHub clientMock = installationClient(installationId);
184+
void initEventStubs(Long installationId) {
185+
GitHub clientMock = applicationOrInstallationClient(installationId);
186186
MockitoUtils.doWithMockedClassClassLoader(GitHub.class, () -> {
187187
try {
188188
when(clientMock.parseEventPayload(any(), any())).thenAnswer(invocation -> {

testing/src/test/java/io/quarkiverse/githubapp/testing/internal/GitHubMockContextImplEventMocksTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static void assertionsSettings() {
3535
@BeforeEach
3636
public void init() {
3737
context.init();
38-
context.initEventStubs(123);
38+
context.initEventStubs(123L);
3939
client = context.installationClient(123);
4040
}
4141

0 commit comments

Comments
 (0)