diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/ApplicationRequest.java b/api/src/main/java/com/javadiscord/jdi/core/api/ApplicationRequest.java index 3ed14282..fbbe9fd7 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/ApplicationRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/ApplicationRequest.java @@ -1,11 +1,7 @@ package com.javadiscord.jdi.core.api; -import java.util.List; -import java.util.Map; - +import com.javadiscord.jdi.core.api.builders.EditCurrentApplicationBuilder; import com.javadiscord.jdi.core.models.application.Application; -import com.javadiscord.jdi.core.models.application.ApplicationInstallParams; -import com.javadiscord.jdi.internal.api.application.EditCurrentApplicationRequest; import com.javadiscord.jdi.internal.api.application.GetCurrentApplicationRequest; public class ApplicationRequest { @@ -17,33 +13,8 @@ public ApplicationRequest(DiscordResponseParser responseParser, long guildId) { this.guildId = guildId; } - public AsyncResponse editCurrentApplication( - String customInstallUrl, - String description, - String roleConnectionsVerificationUrl, - ApplicationInstallParams installParams, - Map integrationTypesConfig, - int flags, - String icon, - String coverImage, - String interactionsEndpointUrl, - List tags - ) { - return responseParser.callAndParse( - Application.class, - new EditCurrentApplicationRequest( - customInstallUrl, - description, - roleConnectionsVerificationUrl, - installParams, - integrationTypesConfig, - flags, - icon, - coverImage, - interactionsEndpointUrl, - tags - ) - ); + public AsyncResponse editCurrentApplication(EditCurrentApplicationBuilder builder) { + return responseParser.callAndParse(Application.class, builder.build()); } public AsyncResponse getCurrentApplication() { diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/builders/EditCurrentApplicationBuilder.java b/api/src/main/java/com/javadiscord/jdi/core/api/builders/EditCurrentApplicationBuilder.java new file mode 100644 index 00000000..79b972df --- /dev/null +++ b/api/src/main/java/com/javadiscord/jdi/core/api/builders/EditCurrentApplicationBuilder.java @@ -0,0 +1,88 @@ +package com.javadiscord.jdi.core.api.builders; + +import com.javadiscord.jdi.core.models.application.ApplicationInstallParams; +import com.javadiscord.jdi.internal.api.application.EditCurrentApplicationRequest; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class EditCurrentApplicationBuilder { + + private Optional customInstallUrl = Optional.empty(); + private Optional description = Optional.empty(); + private Optional roleConnectionsVerificationUrl = Optional.empty(); + private Optional installParams = Optional.empty(); + private Optional> integrationTypesConfig = Optional.empty(); + private Optional flags = Optional.empty(); + private Optional icon = Optional.empty(); + private Optional coverImage = Optional.empty(); + private Optional interactionsEndpointUrl = Optional.empty(); + private Optional> tags = Optional.empty(); + + public EditCurrentApplicationBuilder customInstallUrl(String customInstallUrl) { + this.customInstallUrl = Optional.of(customInstallUrl); + return this; + } + + public EditCurrentApplicationBuilder description(String description) { + this.description = Optional.of(description); + return this; + } + + public EditCurrentApplicationBuilder roleConnectionsVerificationUrl(String roleConnectionsVerificationUrl) { + this.roleConnectionsVerificationUrl = Optional.of(roleConnectionsVerificationUrl); + return this; + } + + public EditCurrentApplicationBuilder installParams(ApplicationInstallParams installParams) { + this.installParams = Optional.of(installParams); + return this; + } + + public EditCurrentApplicationBuilder integrationTypesConfig(Map integrationTypesConfig) { + this.integrationTypesConfig = Optional.of(integrationTypesConfig); + return this; + } + + public EditCurrentApplicationBuilder flags(int flags) { + this.flags = Optional.of(flags); + return this; + } + + public EditCurrentApplicationBuilder icon(String icon) { + this.icon = Optional.of(icon); + return this; + } + + public EditCurrentApplicationBuilder coverImage(String coverImage) { + this.coverImage = Optional.of(coverImage); + return this; + } + + public EditCurrentApplicationBuilder interactionsEndpointUrl(String interactionsEndpointUrl) { + this.interactionsEndpointUrl = Optional.of(interactionsEndpointUrl); + return this; + } + + public EditCurrentApplicationBuilder tags(List tags) { + this.tags = Optional.of(tags); + return this; + } + + public EditCurrentApplicationRequest build() { + return new EditCurrentApplicationRequest( + customInstallUrl, + description, + roleConnectionsVerificationUrl, + installParams, + integrationTypesConfig, + flags, + icon, + coverImage, + interactionsEndpointUrl, + tags + ); + } + +} diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequest.java b/api/src/main/java/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequest.java index 800ebc25..4265a32a 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequest.java @@ -1,43 +1,46 @@ package com.javadiscord.jdi.internal.api.application; -import java.util.List; -import java.util.Map; - import com.javadiscord.jdi.core.models.application.ApplicationInstallParams; import com.javadiscord.jdi.internal.api.DiscordRequest; import com.javadiscord.jdi.internal.api.DiscordRequestBuilder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + public record EditCurrentApplicationRequest( - String customInstallUrl, - String description, - String roleConnectionsVerificationUrl, - ApplicationInstallParams installParams, - Map integrationTypesConfig, - int flags, - String icon, - String coverImage, - String interactionsEndpointUrl, - List tags + Optional customInstallUrl, + Optional description, + Optional roleConnectionsVerificationUrl, + Optional installParams, + Optional> integrationTypesConfig, + Optional flags, + Optional icon, + Optional coverImage, + Optional interactionsEndpointUrl, + Optional> tags ) implements DiscordRequest { @Override public DiscordRequestBuilder create() { + Map body = new HashMap<>(); + + customInstallUrl.ifPresent(val -> body.put("custom_install_url", val)); + description.ifPresent(val -> body.put("description", val)); + roleConnectionsVerificationUrl.ifPresent(val -> body.put("role_connections_verification_url", val)); + installParams.ifPresent(val -> body.put("install_params", val)); + integrationTypesConfig.ifPresent(val -> body.put("integration_types_config", val)); + flags.ifPresent(val -> body.put("flags", val)); + icon.ifPresent(val -> body.put("icon", val)); + coverImage.ifPresent(val -> body.put("cover_image", val)); + interactionsEndpointUrl.ifPresent(val -> body.put("interactions_endpoint_url", val)); + tags.ifPresent(val -> body.put("tags", val)); + return new DiscordRequestBuilder() - .patch() - .path("/applications/@me") - .body( - Map.of( - "custom_install_url", customInstallUrl, - "description", description, - "role_connections_verification_url", roleConnectionsVerificationUrl, - "install_params", installParams, - "integration_types_config", integrationTypesConfig, - "flags", flags, - "icon", icon, - "cover_image", coverImage, - "interactions_endpoint_url", interactionsEndpointUrl, - "tags", tags - ) - ); + .patch() + .path("/applications/@me") + .body(body); } + } diff --git a/api/src/test/integration/com/javadiscord/jdi/core/api/ApplicationRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/core/api/ApplicationRequestTest.java new file mode 100644 index 00000000..08957261 --- /dev/null +++ b/api/src/test/integration/com/javadiscord/jdi/core/api/ApplicationRequestTest.java @@ -0,0 +1,47 @@ +package com.javadiscord.jdi.core.api; + +import com.javadiscord.jdi.core.Guild; +import com.javadiscord.jdi.core.api.builders.EditCurrentApplicationBuilder; +import com.javadiscord.jdi.core.models.application.Application; +import helpers.LiveDiscordHelper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + + +public class ApplicationRequestTest { + + private static Guild guild; + + @BeforeAll + public static void setup() throws InterruptedException { + guild = new LiveDiscordHelper().getGuild(); + } + + @Test + void testGetApplication() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + + AsyncResponse asyncResponse = guild.application().getCurrentApplication(); + asyncResponse.onSuccess(res -> latch.countDown()); + asyncResponse.onError(Assertions::fail); + + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } + + @Test + void testEditCurrentApplication() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + + AsyncResponse asyncResponse = guild.application(). + editCurrentApplication(new EditCurrentApplicationBuilder()); + asyncResponse.onSuccess(res -> latch.countDown()); + asyncResponse.onError(Assertions::fail); + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } +}