diff --git a/client/resources/config-default.properties b/client/resources/config-default.properties index 0009c6269..102be6245 100644 --- a/client/resources/config-default.properties +++ b/client/resources/config-default.properties @@ -21,3 +21,5 @@ voice-server-south-east-asia2=https://calling-apse2.api.sinch.com conversation-region= conversation-server=https://%s.conversation.api.sinch.com template-management-conversation-server=https://%s.template.api.sinch.com + +number-lookup-server=https://lookup.api.sinch.com diff --git a/client/src/main/com/sinch/sdk/SinchClient.java b/client/src/main/com/sinch/sdk/SinchClient.java index eee79badf..1612ea26a 100644 --- a/client/src/main/com/sinch/sdk/SinchClient.java +++ b/client/src/main/com/sinch/sdk/SinchClient.java @@ -2,6 +2,7 @@ import com.sinch.sdk.core.utils.StringUtil; import com.sinch.sdk.domains.conversation.ConversationService; +import com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService; import com.sinch.sdk.domains.numbers.NumbersService; import com.sinch.sdk.domains.sms.SMSService; import com.sinch.sdk.domains.verification.VerificationService; @@ -10,6 +11,7 @@ import com.sinch.sdk.models.Configuration; import com.sinch.sdk.models.ConversationContext; import com.sinch.sdk.models.ConversationRegion; +import com.sinch.sdk.models.NumberLookupContext; import com.sinch.sdk.models.NumbersContext; import com.sinch.sdk.models.SMSRegion; import com.sinch.sdk.models.SmsContext; @@ -50,6 +52,8 @@ public class SinchClient { private static final String CONVERSATION_TEMPLATE_SERVER_KEY = "template-management-conversation-server"; + private static final String NUMBER_LOOKUP_SERVER_KEY = "number-lookup-server"; + // sinch-sdk/{sdk_version} ({language}/{language_version}; {implementation_type}; // {auxiliary_flag}) private static final String SDK_USER_AGENT_HEADER = "User-Agent"; @@ -63,6 +67,7 @@ public class SinchClient { private volatile VerificationService verification; private volatile VoiceService voice; private volatile ConversationService conversation; + private volatile NumberLookupService lookup; private volatile HttpClientApache httpClient; /** @@ -88,6 +93,7 @@ public SinchClient(Configuration configuration) { handleDefaultVerificationSettings(configurationGuard, props, builder); handleDefaultVoiceSettings(configurationGuard, props, builder); handleDefaultConversationSettings(configurationGuard, props, builder); + handleDefaultNumberLookupSettings(configurationGuard, props, builder); Configuration newConfiguration = builder.build(); checkConfiguration(newConfiguration); @@ -228,6 +234,23 @@ private void handleDefaultConversationSettings( builder.setConversationContext(contextBuilder.build()); } + private void handleDefaultNumberLookupSettings( + Configuration configuration, Properties props, Configuration.Builder builder) { + + String url = + configuration + .getNumberLookupContext() + .map(NumberLookupContext::getNumberLookupUrl) + .orElse(null); + + if (null == url && props.containsKey(NUMBER_LOOKUP_SERVER_KEY)) { + builder.setNumberLookupContext( + NumberLookupContext.builder() + .setNumberLookupUrl(props.getProperty(NUMBER_LOOKUP_SERVER_KEY)) + .build()); + } + } + /** * Get current configuration * @@ -333,6 +356,23 @@ public ConversationService conversation() { return conversation; } + /** + * Get Number Lookup domain service + * + * @return Return instance onto Number Lookup API service + * @since 2.1 + */ + public NumberLookupService lookup() { + if (null == lookup) { + synchronized (this) { + if (null == lookup) { + lookup = lookupInit(); + } + } + } + return lookup; + } + private void checkConfiguration(Configuration configuration) throws NullPointerException { Objects.requireNonNull(configuration.getOAuthUrl(), "'oauthUrl' cannot be null"); } @@ -384,6 +424,14 @@ private ConversationService conversationInit() { this::getHttpClient); } + private NumberLookupService lookupInit() { + return new com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService( + getConfiguration().getUnifiedCredentials().orElse(null), + getConfiguration().getNumberLookupContext().orElse(null), + getConfiguration().getOAuthServer(), + this::getHttpClient); + } + private Properties handlePropertiesFile(String fileName) { Properties prop = new Properties(); @@ -466,6 +514,7 @@ public void close() { verification = null; voice = null; conversation = null; + lookup = null; if (local != null) { try { local.close(); diff --git a/client/src/main/com/sinch/sdk/domains/numberlookup/NumberLookupService.java b/client/src/main/com/sinch/sdk/domains/numberlookup/NumberLookupService.java new file mode 100644 index 000000000..0fbda1df4 --- /dev/null +++ b/client/src/main/com/sinch/sdk/domains/numberlookup/NumberLookupService.java @@ -0,0 +1,19 @@ +package com.sinch.sdk.domains.numberlookup; + +/** + * Number Lookup Service + * + * @see https://developers.sinch.com/docs/number-lookup-api-v2 + * @since 2.1 + */ +public interface NumberLookupService { + + /** + * Number Lookup Service V2 + * + * @return V2 service instance for project + * @since 2.1 + */ + com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2(); +} diff --git a/client/src/main/com/sinch/sdk/domains/numberlookup/adapters/NumberLookupService.java b/client/src/main/com/sinch/sdk/domains/numberlookup/adapters/NumberLookupService.java new file mode 100644 index 000000000..4e21d9ac8 --- /dev/null +++ b/client/src/main/com/sinch/sdk/domains/numberlookup/adapters/NumberLookupService.java @@ -0,0 +1,42 @@ +package com.sinch.sdk.domains.numberlookup.adapters; + +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.models.NumberLookupContext; +import com.sinch.sdk.models.UnifiedCredentials; +import java.util.function.Supplier; + +public class NumberLookupService implements com.sinch.sdk.domains.numberlookup.NumberLookupService { + + private final UnifiedCredentials credentials; + private final NumberLookupContext context; + private final ServerConfiguration oAuthServer; + private final Supplier httpClientSupplier; + + private volatile com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2; + + public NumberLookupService( + UnifiedCredentials credentials, + NumberLookupContext context, + ServerConfiguration oAuthServer, + Supplier httpClientSupplier) { + this.credentials = credentials; + this.context = context; + this.oAuthServer = oAuthServer; + this.httpClientSupplier = httpClientSupplier; + } + + @Override + public com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2() { + if (null == this.v2) { + synchronized (this) { + if (null == this.v2) { + this.v2 = + new com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService( + credentials, context, oAuthServer, httpClientSupplier); + } + } + } + return this.v2; + } +} diff --git a/client/src/main/com/sinch/sdk/domains/numberlookup/api/v2/NumberLookupService.java b/client/src/main/com/sinch/sdk/domains/numberlookup/api/v2/NumberLookupService.java new file mode 100644 index 000000000..cfeb8b218 --- /dev/null +++ b/client/src/main/com/sinch/sdk/domains/numberlookup/api/v2/NumberLookupService.java @@ -0,0 +1,19 @@ +package com.sinch.sdk.domains.numberlookup.api.v2; + +/** + * Number Lookup Service V2 + * + * @see https://developers.sinch.com/docs/number-lookup-api-v2 + * @since 2.1 + */ +public interface NumberLookupService { + + /** + * Number Lookup Service instance + * + * @return service instance for project + * @since 2.1 + */ + NumberLookupV2Service lookup(); +} diff --git a/client/src/main/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupService.java b/client/src/main/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupService.java new file mode 100644 index 000000000..6a943c298 --- /dev/null +++ b/client/src/main/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupService.java @@ -0,0 +1,103 @@ +package com.sinch.sdk.domains.numberlookup.api.v2.adapters; + +import com.sinch.sdk.auth.adapters.OAuthManager; +import com.sinch.sdk.core.http.AuthManager; +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.core.http.HttpMapper; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.core.utils.StringUtil; +import com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupV2Service; +import com.sinch.sdk.models.NumberLookupContext; +import com.sinch.sdk.models.UnifiedCredentials; +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.function.Supplier; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class NumberLookupService + implements com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService { + + private static final Logger LOGGER = Logger.getLogger(NumberLookupService.class.getName()); + private static final String SECURITY_SCHEME_KEYWORD_NUMBER_LOOKUP = "OAuth2"; + + private final UnifiedCredentials credentials; + private final NumberLookupContext context; + private final ServerConfiguration oAuthServer; + private final Supplier httpClientSupplier; + + private volatile String uriUUID; + private volatile Map authManagers; + + private volatile NumberLookupV2Service lookup; + + public NumberLookupService( + UnifiedCredentials credentials, + NumberLookupContext context, + ServerConfiguration oAuthServer, + Supplier httpClientSupplier) { + this.credentials = credentials; + this.context = context; + this.oAuthServer = oAuthServer; + this.httpClientSupplier = httpClientSupplier; + } + + @Override + public NumberLookupV2Service lookup() { + if (null == this.lookup) { + synchronized (this) { + if (null == this.lookup) { + instanceLazyInit(); + this.lookup = + new NumberLookupV2ServiceImpl( + httpClientSupplier.get(), + context.getNumberLookupServer(), + authManagers, + HttpMapper.getInstance(), + uriUUID); + } + } + } + return this.lookup; + } + + private void instanceLazyInit() { + if (null != this.authManagers) { + return; + } + synchronized (this) { + if (null == this.authManagers) { + Objects.requireNonNull( + credentials, "Number Lookup service requires unified credentials to be defined"); + Objects.requireNonNull(context, "Number Lookup service requires context to be defined"); + StringUtil.requireNonEmpty( + credentials.getKeyId(), "Number Lookup service requires 'keyId' to be defined"); + StringUtil.requireNonEmpty( + credentials.getKeySecret(), "Number Lookup service requires 'keySecret' to be defined"); + StringUtil.requireNonEmpty( + credentials.getProjectId(), "Number Lookup service requires 'projectId' to be defined"); + StringUtil.requireNonEmpty( + context.getNumberLookupUrl(), + "Number Lookup service requires 'numberLookupUrl' to be defined"); + + LOGGER.fine( + "Activate Number Lookup API with server='" + + context.getNumberLookupServer().getUrl() + + "'"); + + AuthManager authManager = + new OAuthManager( + credentials, oAuthServer, HttpMapper.getInstance(), httpClientSupplier); + + uriUUID = credentials.getProjectId(); + authManagers = + Stream.of( + new AbstractMap.SimpleEntry<>( + SECURITY_SCHEME_KEYWORD_NUMBER_LOOKUP, authManager)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + } + } +} diff --git a/client/src/main/com/sinch/sdk/models/Configuration.java b/client/src/main/com/sinch/sdk/models/Configuration.java index 398a448d8..962f03190 100644 --- a/client/src/main/com/sinch/sdk/models/Configuration.java +++ b/client/src/main/com/sinch/sdk/models/Configuration.java @@ -15,6 +15,7 @@ public class Configuration { private final VerificationContext verificationContext; private final VoiceContext voiceContext; private final ConversationContext conversationContext; + private final NumberLookupContext numberLookupContext; private Configuration( UnifiedCredentials unifiedCredentials, @@ -25,7 +26,8 @@ private Configuration( SmsContext smsContext, VerificationContext verificationContext, VoiceContext voiceContext, - ConversationContext conversationContext) { + ConversationContext conversationContext, + NumberLookupContext numberLookupContext) { this.unifiedCredentials = unifiedCredentials; this.applicationCredentials = applicationCredentials; this.smsServicePlanCredentials = smsServicePlanCredentials; @@ -35,6 +37,7 @@ private Configuration( this.voiceContext = voiceContext; this.verificationContext = verificationContext; this.conversationContext = conversationContext; + this.numberLookupContext = numberLookupContext; } @Override @@ -53,6 +56,8 @@ public String toString() { + voiceContext + ", conversationContext=" + conversationContext + + ", numberLookupContext=" + + numberLookupContext + "}"; } @@ -160,6 +165,16 @@ public Optional getConversationContext() { return Optional.ofNullable(conversationContext); } + /** + * Get Number Lookup domain related execution context + * + * @return Current Number Lookup context + * @since 2.1 + */ + public Optional getNumberLookupContext() { + return Optional.ofNullable(numberLookupContext); + } + /** * Getting Builder * @@ -197,6 +212,7 @@ public static class Builder { VerificationContext.Builder verificationContext; VoiceContext.Builder voiceContext; ConversationContext.Builder conversationContext; + NumberLookupContext.Builder numberLookupContext; protected Builder() {} @@ -228,6 +244,8 @@ protected Builder(Configuration configuration) { this.voiceContext = configuration.getVoiceContext().map(VoiceContext::builder).orElse(null); this.conversationContext = configuration.getConversationContext().map(ConversationContext::builder).orElse(null); + this.numberLookupContext = + configuration.getNumberLookupContext().map(NumberLookupContext::builder).orElse(null); } /** @@ -486,6 +504,33 @@ public Builder setConversationContext(ConversationContext context) { return this; } + /** + * Set Number Lookup API URL + * + * @param numberLookupUrl Number Lookup API URL + * @return Current builder + * @since 2.1 + */ + public Builder setNumberLookupUrl(String numberLookupUrl) { + if (null == this.numberLookupContext) { + this.numberLookupContext = NumberLookupContext.builder(); + } + this.numberLookupContext.setNumberLookupUrl(numberLookupUrl); + return this; + } + + /** + * Set Number Lookup related context + * + * @param context {@link #getNumberLookupContext() getter} + * @return Current builder + * @since 2.1 + */ + public Builder setNumberLookupContext(NumberLookupContext context) { + this.numberLookupContext = null != context ? NumberLookupContext.builder(context) : null; + return this; + } + /** * Build a Configuration instance from builder current state * @@ -503,7 +548,8 @@ public Configuration build() { null != smsContext ? smsContext.build() : null, null != verificationContext ? verificationContext.build() : null, null != voiceContext ? voiceContext.build() : null, - null != conversationContext ? conversationContext.build() : null); + null != conversationContext ? conversationContext.build() : null, + null != numberLookupContext ? numberLookupContext.build() : null); } } } diff --git a/client/src/main/com/sinch/sdk/models/NumberLookupContext.java b/client/src/main/com/sinch/sdk/models/NumberLookupContext.java new file mode 100644 index 000000000..8813767b1 --- /dev/null +++ b/client/src/main/com/sinch/sdk/models/NumberLookupContext.java @@ -0,0 +1,93 @@ +package com.sinch.sdk.models; + +import com.sinch.sdk.core.models.ServerConfiguration; + +/** Execution context related to Number Lookup domain */ +public class NumberLookupContext { + + private final String numberLookupUrl; + + private NumberLookupContext(String numberLookupUrl) { + this.numberLookupUrl = numberLookupUrl; + } + + /** + * Number Lookup Server Configuration + * + * @return Number Lookup Server configuration to be used + * @since 2.1 + */ + public ServerConfiguration getNumberLookupServer() { + return new ServerConfiguration(getNumberLookupUrl()); + } + + /** + * Number Lookup URL + * + * @return Number Lookup Server URL + * @since 2.1 + */ + public String getNumberLookupUrl() { + return numberLookupUrl; + } + + /** + * Getting Builder + * + * @return New Builder instance + * @since 2.1 + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Getting Builder + * + * @param context Source context to fill initial builder state + * @return New Builder instance + * @since 2.1 + */ + public static Builder builder(NumberLookupContext context) { + return new Builder(context); + } + + /** + * Dedicated Builder + * + * @since 2.1 + */ + public static class Builder { + + String numberLookupUrl; + + protected Builder() {} + + protected Builder(NumberLookupContext context) { + this.numberLookupUrl = null != context ? context.getNumberLookupUrl() : null; + } + + /** + * Set Number Lookup API URL + * + * @param numberLookupUrl Number Lookup API URL + * @return Current builder + * @since 2.1 + */ + public Builder setNumberLookupUrl(String numberLookupUrl) { + this.numberLookupUrl = numberLookupUrl; + return this; + } + + /** + * Create instance + * + * @return The instance build with current builder values + * @since 2.1 + */ + public NumberLookupContext build() { + + return new NumberLookupContext(numberLookupUrl); + } + } +} diff --git a/client/src/test/java/com/sinch/sdk/SinchClientTest.java b/client/src/test/java/com/sinch/sdk/SinchClientTest.java index 25de15ecf..5ec89d15a 100644 --- a/client/src/test/java/com/sinch/sdk/SinchClientTest.java +++ b/client/src/test/java/com/sinch/sdk/SinchClientTest.java @@ -142,6 +142,14 @@ void defaultVerificationUrlAvailable() { assertNotNull(client.getConfiguration().getVerificationContext().get().getVerificationUrl()); } + @Test + void defaultNumberLookupUrlAvailable() { + Configuration configuration = + Configuration.builder().setKeyId("foo").setKeySecret("foo").setProjectId("foo").build(); + SinchClient client = new SinchClient(configuration); + assertNotNull(client.getConfiguration().getNumberLookupContext().get().getNumberLookupUrl()); + } + @Test void defaultVoiceRegion() { Configuration configuration = Configuration.builder().build(); diff --git a/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/CredentialsValidationHelper.java b/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/CredentialsValidationHelper.java new file mode 100644 index 000000000..4df84f691 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/CredentialsValidationHelper.java @@ -0,0 +1,153 @@ +package com.sinch.sdk.domains.numberlookup.api.v2.adapters; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.models.NumberLookupContext; +import com.sinch.sdk.models.UnifiedCredentials; +import java.util.function.Consumer; +import java.util.function.Supplier; + +class CredentialsValidationHelper { + + static ServerConfiguration oAuthServer = new ServerConfiguration("https://oauth.foo.url"); + + static void checkCredentials( + Supplier httpClientSupplier, Consumer service) { + doNotAcceptNullCredentials(httpClientSupplier, service); + doNotAcceptNullKey(httpClientSupplier, service); + doNotAcceptNullKeySecret(httpClientSupplier, service); + doNotAcceptNullProject(httpClientSupplier, service); + doNotAcceptNullContext(httpClientSupplier, service); + doNotAcceptNullNumberLookupUrl(httpClientSupplier, service); + initPassed(httpClientSupplier, service); + } + + static void doNotAcceptNullCredentials( + Supplier httpClientSupplier, Consumer service) { + NumberLookupContext context = + NumberLookupContext.builder().setNumberLookupUrl("foo url").build(); + + Exception exception = + assertThrows( + NullPointerException.class, + () -> + service.accept( + new NumberLookupService(null, context, oAuthServer, httpClientSupplier))); + assertTrue( + exception + .getMessage() + .contains("Number Lookup service requires unified credentials to be defined")); + } + + static void doNotAcceptNullKey( + Supplier httpClientSupplier, Consumer service) { + UnifiedCredentials credentials = + UnifiedCredentials.builder().setKeyId(null).setKeySecret("foo").setProjectId("foo").build(); + NumberLookupContext context = + NumberLookupContext.builder().setNumberLookupUrl("foo url").build(); + + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> + service.accept( + new NumberLookupService( + credentials, context, oAuthServer, httpClientSupplier))); + assertTrue(exception.getMessage().contains("keyId")); + } + + static void doNotAcceptNullKeySecret( + Supplier httpClientSupplier, Consumer service) { + UnifiedCredentials credentials = + UnifiedCredentials.builder().setKeyId("foo").setKeySecret(null).setProjectId("foo").build(); + NumberLookupContext context = + NumberLookupContext.builder().setNumberLookupUrl("foo url").build(); + + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> + service.accept( + new NumberLookupService( + credentials, context, oAuthServer, httpClientSupplier))); + assertTrue(exception.getMessage().contains("keySecret")); + } + + static void doNotAcceptNullProject( + Supplier httpClientSupplier, Consumer service) { + UnifiedCredentials credentials = + UnifiedCredentials.builder().setKeyId("foo").setKeySecret("foo").setProjectId(null).build(); + NumberLookupContext context = + NumberLookupContext.builder().setNumberLookupUrl("foo url").build(); + + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> + service.accept( + new NumberLookupService( + credentials, context, oAuthServer, httpClientSupplier))); + assertTrue(exception.getMessage().contains("projectId")); + } + + static void doNotAcceptNullContext( + Supplier httpClientSupplier, Consumer service) { + UnifiedCredentials credentials = + UnifiedCredentials.builder() + .setKeyId("foo") + .setKeySecret("foo") + .setProjectId("foo") + .build(); + + Exception exception = + assertThrows( + NullPointerException.class, + () -> + service.accept( + new NumberLookupService(credentials, null, oAuthServer, httpClientSupplier))); + assertTrue( + exception.getMessage().contains("Number Lookup service requires context to be defined")); + } + + static void doNotAcceptNullNumberLookupUrl( + Supplier httpClientSupplier, Consumer service) { + UnifiedCredentials credentials = + UnifiedCredentials.builder() + .setKeyId("foo") + .setKeySecret("foo") + .setProjectId("foo") + .build(); + NumberLookupContext context = NumberLookupContext.builder().build(); + + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> + service.accept( + new NumberLookupService( + credentials, context, oAuthServer, httpClientSupplier))); + assertTrue(exception.getMessage().contains("numberLookupUrl")); + } + + static void initPassed( + Supplier httpClientSupplier, Consumer service) { + UnifiedCredentials credentials = + UnifiedCredentials.builder() + .setKeyId("foo") + .setKeySecret("foo") + .setProjectId("foo") + .build(); + NumberLookupContext context = + NumberLookupContext.builder().setNumberLookupUrl("foo url").build(); + + assertDoesNotThrow( + () -> + service.accept( + new NumberLookupService(credentials, context, oAuthServer, httpClientSupplier)), + "Init passed"); + } +} diff --git a/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupServiceTest.java b/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupServiceTest.java new file mode 100644 index 000000000..c6d7db2d7 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupServiceTest.java @@ -0,0 +1,15 @@ +package com.sinch.sdk.domains.numberlookup.api.v2.adapters; + +import com.sinch.sdk.core.http.HttpClient; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +class NumberLookupServiceTest { + + @Mock HttpClient httpClient; + + @Test + void checkCredentialsNumberLookup() { + CredentialsValidationHelper.checkCredentials(() -> httpClient, NumberLookupService::lookup); + } +} diff --git a/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupV2ServiceTest.java b/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupV2ServiceTest.java new file mode 100644 index 000000000..9aeaa5312 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupV2ServiceTest.java @@ -0,0 +1,173 @@ +package com.sinch.sdk.domains.numberlookup.api.v2.adapters; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.core.exceptions.ApiException; +import com.sinch.sdk.core.http.AuthManager; +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.core.http.HttpContentType; +import com.sinch.sdk.core.http.HttpMapper; +import com.sinch.sdk.core.http.HttpMethod; +import com.sinch.sdk.core.http.HttpRequest; +import com.sinch.sdk.core.http.HttpRequestTest.HttpRequestMatcher; +import com.sinch.sdk.core.http.HttpResponse; +import com.sinch.sdk.core.http.URLPathUtils; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupV2Service; +import com.sinch.sdk.domains.numberlookup.models.v2.request.NumberLookupRequestDtoTest; +import com.sinch.sdk.domains.numberlookup.models.v2.response.NumberLookupResponse; +import com.sinch.sdk.domains.numberlookup.models.v2.response.NumberLookupResponseDtoTest; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +@TestWithResources +public class NumberLookupV2ServiceTest extends BaseTest { + + @Mock HttpClient httpClient; + @Mock ServerConfiguration serverConfiguration; + @Mock Map authManagers; + + static final String PROJECT_ID = "test_project_id"; + static final Collection AUTH_NAMES = Arrays.asList("Basic", "OAuth2"); + + NumberLookupV2Service service; + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json") + String jsonNumberLookupRequestMinimalDto; + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json") + String jsonNumberLookupRequestWithFeaturesDto; + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json") + String jsonNumberLookupRequestWithRndOptionsDto; + + @GivenTextResource("/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json") + String jsonNumberLookupResponseMinimalDto; + + @GivenTextResource("/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json") + String jsonNumberLookupResponseFullDto; + + @BeforeEach + public void initMocks() { + service = + new NumberLookupV2ServiceImpl( + httpClient, serverConfiguration, authManagers, HttpMapper.getInstance(), PROJECT_ID); + } + + @Test + void lookupWithRequiredParameters() throws ApiException { + + HttpRequest httpRequest = + new HttpRequest( + "/v2/projects/" + URLPathUtils.encodePathSegment(PROJECT_ID) + "/lookups", + HttpMethod.POST, + Collections.emptyList(), + jsonNumberLookupRequestMinimalDto, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + AUTH_NAMES); + HttpResponse httpResponse = + new HttpResponse( + 200, null, Collections.emptyMap(), jsonNumberLookupResponseMinimalDto.getBytes()); + + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest)))) + .thenReturn(httpResponse); + + NumberLookupResponse response = + service.lookup(NumberLookupRequestDtoTest.numberLookupRequestMinimalDto); + + TestHelpers.recursiveEquals( + response, NumberLookupResponseDtoTest.numberLookupResponseMinimalDto); + } + + @Test + void lookupWithFeatures() throws ApiException { + + HttpRequest httpRequest = + new HttpRequest( + "/v2/projects/" + URLPathUtils.encodePathSegment(PROJECT_ID) + "/lookups", + HttpMethod.POST, + Collections.emptyList(), + jsonNumberLookupRequestWithFeaturesDto, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + AUTH_NAMES); + HttpResponse httpResponse = + new HttpResponse( + 200, null, Collections.emptyMap(), jsonNumberLookupResponseFullDto.getBytes()); + + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest)))) + .thenReturn(httpResponse); + + NumberLookupResponse response = + service.lookup(NumberLookupRequestDtoTest.numberLookupRequestWithFeaturesDto); + + TestHelpers.recursiveEquals(response, NumberLookupResponseDtoTest.numberLookupResponseFullDto); + } + + @Test + void lookupWithRndOptions() throws ApiException { + + HttpRequest httpRequest = + new HttpRequest( + "/v2/projects/" + URLPathUtils.encodePathSegment(PROJECT_ID) + "/lookups", + HttpMethod.POST, + Collections.emptyList(), + jsonNumberLookupRequestWithRndOptionsDto, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + AUTH_NAMES); + HttpResponse httpResponse = + new HttpResponse( + 200, null, Collections.emptyMap(), jsonNumberLookupResponseFullDto.getBytes()); + + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest)))) + .thenReturn(httpResponse); + + NumberLookupResponse response = + service.lookup(NumberLookupRequestDtoTest.numberLookupRequestWithRndOptionsDto); + + TestHelpers.recursiveEquals(response, NumberLookupResponseDtoTest.numberLookupResponseFullDto); + } + + @Test + void lookupMissingProjectIdThrows() { + + NumberLookupV2Service serviceWithoutProjectId = + new NumberLookupV2ServiceImpl( + httpClient, serverConfiguration, authManagers, HttpMapper.getInstance(), null); + + ApiException thrown = + Assertions.assertThrows( + ApiException.class, + () -> + serviceWithoutProjectId.lookup( + NumberLookupRequestDtoTest.numberLookupRequestMinimalDto)); + + Assertions.assertEquals(400, thrown.getCode()); + } +} diff --git a/client/src/test/java/com/sinch/sdk/e2e/Config.java b/client/src/test/java/com/sinch/sdk/e2e/Config.java index 830149340..badb5846a 100644 --- a/client/src/test/java/com/sinch/sdk/e2e/Config.java +++ b/client/src/test/java/com/sinch/sdk/e2e/Config.java @@ -4,6 +4,7 @@ import com.sinch.sdk.models.Configuration; import com.sinch.sdk.models.ConversationContext; import com.sinch.sdk.models.ConversationRegion; +import com.sinch.sdk.models.NumberLookupContext; import com.sinch.sdk.models.NumbersContext; import com.sinch.sdk.models.SMSRegion; import com.sinch.sdk.models.SmsContext; @@ -34,6 +35,8 @@ public class Config { public static final String VERIFICATION_HOST_NAME = "http://localhost:3018"; + public static final String NUMBER_LOOKUP_HOST_NAME = "http://localhost:3022"; + private final SinchClient client; private final SinchClient clientServicePlanId; @@ -63,6 +66,8 @@ private Config() { SmsContext.builder().setSmsUrl(SMS_HOST_NAME).setSmsRegion(SMSRegion.EU).build()) .setVerificationContext( VerificationContext.builder().setVerificationUrl(VERIFICATION_HOST_NAME).build()) + .setNumberLookupContext( + NumberLookupContext.builder().setNumberLookupUrl(NUMBER_LOOKUP_HOST_NAME).build()) .build(); client = new SinchClient(configuration); diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/numberlookup/v2/LookupsSteps.java b/client/src/test/java/com/sinch/sdk/e2e/domains/numberlookup/v2/LookupsSteps.java new file mode 100644 index 000000000..0423e77da --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/numberlookup/v2/LookupsSteps.java @@ -0,0 +1,124 @@ +package com.sinch.sdk.e2e.domains.numberlookup.v2; + +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupV2Service; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import com.sinch.sdk.domains.numberlookup.models.v2.request.LookupFeatureType; +import com.sinch.sdk.domains.numberlookup.models.v2.request.NumberLookupRequest; +import com.sinch.sdk.domains.numberlookup.models.v2.request.RndFeatureOptions; +import com.sinch.sdk.domains.numberlookup.models.v2.response.Line; +import com.sinch.sdk.domains.numberlookup.models.v2.response.LineType; +import com.sinch.sdk.domains.numberlookup.models.v2.response.NumberLookupResponse; +import com.sinch.sdk.domains.numberlookup.models.v2.response.Rnd; +import com.sinch.sdk.domains.numberlookup.models.v2.response.SimSwap; +import com.sinch.sdk.domains.numberlookup.models.v2.response.VoIPDetection; +import com.sinch.sdk.e2e.Config; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; + +public class LookupsSteps { + + NumberLookupV2Service service; + NumberLookupResponse lookupNoFeaturesResponse; + NumberLookupResponse lookupAllFeaturesResponse; + + @Given("the Number Lookup service is available") + public void serviceAvailable() { + service = Config.getSinchClient().lookup().lookup(); + Assertions.assertNotNull(service, "Number Lookup service is not available"); + } + + @When("I send a request to lookup for a phone number with no additional features") + public void lookupNoFeatures() { + NumberLookupRequest request = NumberLookupRequest.builder().setNumber("+12016666666").build(); + lookupNoFeaturesResponse = service.lookup(request); + } + + @Then("the response contains the details of the phone number lookup with line details only") + public void lookupNoFeaturesResult() { + + NumberLookupResponse expected = + NumberLookupResponse.builder() + .setNumber("+12016666666") + .setCountryCode("US") + .setTraceId("84c1fd4063c38d9f3900d06e56542d48") + .setLine( + Line.builder() + .setCarrier("T-Mobile USA") + .setType(LineType.MOBILE) + .setMobileCountryCode("310") + .setMobileNetworkCode("260") + .build()) + .build(); + + TestHelpers.recursiveEquals(lookupNoFeaturesResponse, expected); + } + + @When("I send a request to lookup for a phone number with all the features") + public void lookupAllFeatures() { + NumberLookupRequest request = + NumberLookupRequest.builder() + .setNumber("+12015555555") + .setFeatures( + Arrays.asList( + LookupFeatureType.LINE_TYPE, + LookupFeatureType.RND, + LookupFeatureType.SIM_SWAP, + LookupFeatureType.VO_IP_DETECTION)) + .setRndFeatureOptions( + RndFeatureOptions.builder().setContactDate(LocalDate.parse("2025-09-09")).build()) + .build(); + lookupAllFeaturesResponse = service.lookup(request); + } + + @Then("the response contains the details of the phone number lookup with all the features") + public void lookupAllFeaturesResult() { + + LookupError simSwapError = + LookupError.builder() + .setStatus(100) + .setTitle("Feature Disabled") + .setDetail("SimSwap feature is currently disabled.") + .build(); + + LookupError voIPDetectionError = + LookupError.builder() + .setStatus(100) + .setTitle("Feature Disabled") + .setDetail("VoIPDetection feature is currently disabled.") + .build(); + + LookupError rndError = + LookupError.builder() + .setStatus(100) + .setTitle("Feature Disabled") + .setDetail("RND feature is currently disabled.") + .build(); + + NumberLookupResponse expected = + NumberLookupResponse.builder() + .setNumber("+12015555555") + .setCountryCode("US") + .setTraceId("5c817a6b7351d80a6b1d8007e5c145b8") + .setLine( + Line.builder() + .setCarrier("AT&T") + .setType(LineType.MOBILE) + .setMobileCountryCode("310") + .setMobileNetworkCode("070") + .setPorted(true) + .setPortingDate(Instant.parse("2010-08-07T23:45:49Z")) + .build()) + .setSimSwap(SimSwap.builder().setError(simSwapError).build()) + .setVoIPDetection(VoIPDetection.builder().setError(voIPDetectionError).build()) + .setRnd(Rnd.builder().setError(rndError).build()) + .build(); + + TestHelpers.recursiveEquals(lookupAllFeaturesResponse, expected); + } +} diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/numberlookup/v2/NumberLookupIT.java b/client/src/test/java/com/sinch/sdk/e2e/domains/numberlookup/v2/NumberLookupIT.java new file mode 100644 index 000000000..668d5466a --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/numberlookup/v2/NumberLookupIT.java @@ -0,0 +1,18 @@ +package com.sinch.sdk.e2e.domains.numberlookup.v2; + +import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME; + +import org.junit.platform.suite.api.ConfigurationParameter; +import org.junit.platform.suite.api.IncludeEngines; +import org.junit.platform.suite.api.SelectClasspathResource; +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SuiteDisplayName; + +@Suite +@SuiteDisplayName("Number Lookup V2") +@IncludeEngines("cucumber") +@SelectClasspathResource("features/number-lookup") +@ConfigurationParameter( + key = GLUE_PROPERTY_NAME, + value = "com.sinch.sdk.e2e.domains.numberlookup.v2") +public class NumberLookupIT {} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/channelspecific/ChannelSpecificContactMessage.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/channelspecific/ChannelSpecificContactMessage.java index 74bebb7b3..2885f34a2 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/channelspecific/ChannelSpecificContactMessage.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/channelspecific/ChannelSpecificContactMessage.java @@ -54,7 +54,7 @@ public static String valueOf(MessageTypeEnum e) { MessageTypeEnum getMessageType(); /** - * Get message + * The message content. * * @return message */ diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/internal/ChannelSpecificContactMessageMessageInternal.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/internal/ChannelSpecificContactMessageMessageInternal.java index ca74a564f..a69f9a605 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/internal/ChannelSpecificContactMessageMessageInternal.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/messages/types/internal/ChannelSpecificContactMessageMessageInternal.java @@ -54,7 +54,7 @@ public static String valueOf(MessageTypeEnum e) { MessageTypeEnum getMessageType(); /** - * Get message + * The message content. * * @return message */ diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/api/v2/NumberLookupV2Service.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/api/v2/NumberLookupV2Service.java new file mode 100644 index 000000000..9cf5d65e1 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/api/v2/NumberLookupV2Service.java @@ -0,0 +1,28 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.api.v2; + +import com.sinch.sdk.core.exceptions.ApiException; +import com.sinch.sdk.domains.numberlookup.models.v2.request.NumberLookupRequest; +import com.sinch.sdk.domains.numberlookup.models.v2.response.NumberLookupResponse; + +/** NumberLookupV2 Service */ +public interface NumberLookupV2Service { + + /** + * Performs a number lookup. + * + * @param numberLookupRequest (optional) + * @return NumberLookupResponse + * @throws ApiException if fails to make API call + */ + NumberLookupResponse lookup(NumberLookupRequest numberLookupRequest) throws ApiException; +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupV2ServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupV2ServiceImpl.java new file mode 100644 index 000000000..6f74a84dd --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/api/v2/adapters/NumberLookupV2ServiceImpl.java @@ -0,0 +1,117 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.api.v2.adapters; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.sinch.sdk.core.exceptions.ApiException; +import com.sinch.sdk.core.exceptions.ApiExceptionBuilder; +import com.sinch.sdk.core.http.AuthManager; +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.core.http.HttpMapper; +import com.sinch.sdk.core.http.HttpMethod; +import com.sinch.sdk.core.http.HttpRequest; +import com.sinch.sdk.core.http.HttpResponse; +import com.sinch.sdk.core.http.HttpStatus; +import com.sinch.sdk.core.http.URLParameter; +import com.sinch.sdk.core.http.URLPathUtils; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.domains.numberlookup.models.v2.request.NumberLookupRequest; +import com.sinch.sdk.domains.numberlookup.models.v2.response.NumberLookupResponse; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +public class NumberLookupV2ServiceImpl + implements com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupV2Service { + + private static final Logger LOGGER = Logger.getLogger(NumberLookupV2ServiceImpl.class.getName()); + private final HttpClient httpClient; + private final ServerConfiguration serverConfiguration; + private final Map authManagersByOasSecuritySchemes; + private final HttpMapper mapper; + + private final String projectId; + + public NumberLookupV2ServiceImpl( + HttpClient httpClient, + ServerConfiguration serverConfiguration, + Map authManagersByOasSecuritySchemes, + HttpMapper mapper, + String projectId) { + this.httpClient = httpClient; + this.serverConfiguration = serverConfiguration; + this.authManagersByOasSecuritySchemes = authManagersByOasSecuritySchemes; + this.mapper = mapper; + this.projectId = projectId; + } + + @Override + public NumberLookupResponse lookup(NumberLookupRequest numberLookupRequest) throws ApiException { + + LOGGER.finest("[lookup]" + " " + "numberLookupRequest: " + numberLookupRequest); + + HttpRequest httpRequest = lookupRequestBuilder(numberLookupRequest); + HttpResponse response = + httpClient.invokeAPI( + this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); + + if (HttpStatus.isSuccessfulStatus(response.getCode())) { + return mapper.deserialize(response, new TypeReference() {}); + } + // fallback to default errors handling: + // all error cases definition are not required from specs: will try some "hardcoded" content + // parsing + throw ApiExceptionBuilder.build( + response.getMessage(), + response.getCode(), + mapper.deserialize(response, new TypeReference>() {})); + } + + private HttpRequest lookupRequestBuilder(NumberLookupRequest numberLookupRequest) + throws ApiException { + // verify the required parameter 'this.projectId' is set + if (this.projectId == null) { + throw new ApiException( + 400, "Missing the required parameter 'this.projectId' when calling lookup"); + } + + String localVarPath = + "/v2/projects/{projectId}/lookups" + .replaceAll( + "\\{" + "projectId" + "\\}", + URLPathUtils.encodePathSegment(this.projectId.toString())); + + List localVarQueryParams = new ArrayList<>(); + + Map localVarHeaderParams = new HashMap<>(); + + final Collection localVarAccepts = Arrays.asList("application/json"); + + final Collection localVarContentTypes = Arrays.asList("application/json"); + + final Collection localVarAuthNames = Arrays.asList("Basic", "OAuth2"); + final String serializedBody = mapper.serialize(localVarContentTypes, numberLookupRequest); + + return new HttpRequest( + localVarPath, + HttpMethod.POST, + localVarQueryParams, + serializedBody, + localVarHeaderParams, + localVarAccepts, + localVarContentTypes, + localVarAuthNames); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupError.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupError.java new file mode 100644 index 000000000..d6c42a708 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupError.java @@ -0,0 +1,102 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.errors; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +/** LookupError */ +@JsonDeserialize(builder = LookupErrorImpl.Builder.class) +public interface LookupError { + + /** + * The error status code. + * + * @return status + */ + Integer getStatus(); + + /** + * A short, human-readable summary of the error type. + * + * @return title + */ + String getTitle(); + + /** + * A human-readable explanation specific to this occurrence of the error. + * + * @return detail + */ + String getDetail(); + + /** + * A URI reference that identifies the error type. + * + * @return type + */ + String getType(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new LookupErrorImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param status see getter + * @return Current builder + * @see #getStatus + */ + Builder setStatus(Integer status); + + /** + * see getter + * + * @param title see getter + * @return Current builder + * @see #getTitle + */ + Builder setTitle(String title); + + /** + * see getter + * + * @param detail see getter + * @return Current builder + * @see #getDetail + */ + Builder setDetail(String detail); + + /** + * see getter + * + * @param type see getter + * @return Current builder + * @see #getType + */ + Builder setType(String type); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + LookupError build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorImpl.java new file mode 100644 index 000000000..8501d0679 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorImpl.java @@ -0,0 +1,174 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.errors; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import java.util.Objects; + +@JsonPropertyOrder({ + LookupErrorImpl.JSON_PROPERTY_STATUS, + LookupErrorImpl.JSON_PROPERTY_TITLE, + LookupErrorImpl.JSON_PROPERTY_DETAIL, + LookupErrorImpl.JSON_PROPERTY_TYPE +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class LookupErrorImpl implements LookupError { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_STATUS = "status"; + + private OptionalValue status; + + public static final String JSON_PROPERTY_TITLE = "title"; + + private OptionalValue title; + + public static final String JSON_PROPERTY_DETAIL = "detail"; + + private OptionalValue detail; + + public static final String JSON_PROPERTY_TYPE = "type"; + + private OptionalValue type; + + public LookupErrorImpl() {} + + protected LookupErrorImpl( + OptionalValue status, + OptionalValue title, + OptionalValue detail, + OptionalValue type) { + this.status = status; + this.title = title; + this.detail = detail; + this.type = type; + } + + @JsonIgnore + public Integer getStatus() { + return status.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_STATUS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue status() { + return status; + } + + @JsonIgnore + public String getTitle() { + return title.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TITLE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue title() { + return title; + } + + @JsonIgnore + public String getDetail() { + return detail.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_DETAIL) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue detail() { + return detail; + } + + @JsonIgnore + public String getType() { + return type.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TYPE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue type() { + return type; + } + + /** Return true if this ErrorResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + LookupErrorImpl errorResponse = (LookupErrorImpl) o; + return Objects.equals(this.status, errorResponse.status) + && Objects.equals(this.title, errorResponse.title) + && Objects.equals(this.detail, errorResponse.detail) + && Objects.equals(this.type, errorResponse.type); + } + + @Override + public int hashCode() { + return Objects.hash(status, title, detail, type); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class LookupErrorImpl {\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" title: ").append(toIndentedString(title)).append("\n"); + sb.append(" detail: ").append(toIndentedString(detail)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements LookupError.Builder { + OptionalValue status = OptionalValue.empty(); + OptionalValue title = OptionalValue.empty(); + OptionalValue detail = OptionalValue.empty(); + OptionalValue type = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_STATUS) + public Builder setStatus(Integer status) { + this.status = OptionalValue.of(status); + return this; + } + + @JsonProperty(JSON_PROPERTY_TITLE) + public Builder setTitle(String title) { + this.title = OptionalValue.of(title); + return this; + } + + @JsonProperty(JSON_PROPERTY_DETAIL) + public Builder setDetail(String detail) { + this.detail = OptionalValue.of(detail); + return this; + } + + @JsonProperty(JSON_PROPERTY_TYPE) + public Builder setType(String type) { + this.type = OptionalValue.of(type); + return this; + } + + public LookupError build() { + return new LookupErrorImpl(status, title, detail, type); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetails.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetails.java new file mode 100644 index 000000000..db503a96a --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetails.java @@ -0,0 +1,102 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.errors; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +/** ProblemDetails */ +@JsonDeserialize(builder = ProblemDetailsImpl.Builder.class) +public interface ProblemDetails { + + /** + * A URI reference that identifies the problem type. + * + * @return type + */ + String getType(); + + /** + * A short, human-readable summary of the problem type. + * + * @return title + */ + String getTitle(); + + /** + * The HTTP status code. + * + * @return status + */ + Integer getStatus(); + + /** + * The identifier for a trace. + * + * @return traceId + */ + String getTraceId(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new ProblemDetailsImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param type see getter + * @return Current builder + * @see #getType + */ + Builder setType(String type); + + /** + * see getter + * + * @param title see getter + * @return Current builder + * @see #getTitle + */ + Builder setTitle(String title); + + /** + * see getter + * + * @param status see getter + * @return Current builder + * @see #getStatus + */ + Builder setStatus(Integer status); + + /** + * see getter + * + * @param traceId see getter + * @return Current builder + * @see #getTraceId + */ + Builder setTraceId(String traceId); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + ProblemDetails build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsImpl.java new file mode 100644 index 000000000..0ba6140b3 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsImpl.java @@ -0,0 +1,174 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.errors; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import java.util.Objects; + +@JsonPropertyOrder({ + ProblemDetailsImpl.JSON_PROPERTY_TYPE, + ProblemDetailsImpl.JSON_PROPERTY_TITLE, + ProblemDetailsImpl.JSON_PROPERTY_STATUS, + ProblemDetailsImpl.JSON_PROPERTY_TRACE_ID +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class ProblemDetailsImpl implements ProblemDetails { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_TYPE = "type"; + + private OptionalValue type; + + public static final String JSON_PROPERTY_TITLE = "title"; + + private OptionalValue title; + + public static final String JSON_PROPERTY_STATUS = "status"; + + private OptionalValue status; + + public static final String JSON_PROPERTY_TRACE_ID = "traceId"; + + private OptionalValue traceId; + + public ProblemDetailsImpl() {} + + protected ProblemDetailsImpl( + OptionalValue type, + OptionalValue title, + OptionalValue status, + OptionalValue traceId) { + this.type = type; + this.title = title; + this.status = status; + this.traceId = traceId; + } + + @JsonIgnore + public String getType() { + return type.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TYPE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue type() { + return type; + } + + @JsonIgnore + public String getTitle() { + return title.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TITLE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue title() { + return title; + } + + @JsonIgnore + public Integer getStatus() { + return status.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_STATUS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue status() { + return status; + } + + @JsonIgnore + public String getTraceId() { + return traceId.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TRACE_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue traceId() { + return traceId; + } + + /** Return true if this ProblemDetails object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProblemDetailsImpl problemDetails = (ProblemDetailsImpl) o; + return Objects.equals(this.type, problemDetails.type) + && Objects.equals(this.title, problemDetails.title) + && Objects.equals(this.status, problemDetails.status) + && Objects.equals(this.traceId, problemDetails.traceId); + } + + @Override + public int hashCode() { + return Objects.hash(type, title, status, traceId); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ProblemDetailsImpl {\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" title: ").append(toIndentedString(title)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" traceId: ").append(toIndentedString(traceId)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements ProblemDetails.Builder { + OptionalValue type = OptionalValue.empty(); + OptionalValue title = OptionalValue.empty(); + OptionalValue status = OptionalValue.empty(); + OptionalValue traceId = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_TYPE) + public Builder setType(String type) { + this.type = OptionalValue.of(type); + return this; + } + + @JsonProperty(JSON_PROPERTY_TITLE) + public Builder setTitle(String title) { + this.title = OptionalValue.of(title); + return this; + } + + @JsonProperty(JSON_PROPERTY_STATUS) + public Builder setStatus(Integer status) { + this.status = OptionalValue.of(status); + return this; + } + + @JsonProperty(JSON_PROPERTY_TRACE_ID) + public Builder setTraceId(String traceId) { + this.traceId = OptionalValue.of(traceId); + return this; + } + + public ProblemDetails build() { + return new ProblemDetailsImpl(type, title, status, traceId); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/LookupFeatureType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/LookupFeatureType.java new file mode 100644 index 000000000..c93224cc9 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/LookupFeatureType.java @@ -0,0 +1,44 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import java.util.Arrays; +import java.util.stream.Stream; + +/** */ +public class LookupFeatureType extends EnumDynamic { + + /** Use to return line type information for the phone number. */ + public static final LookupFeatureType LINE_TYPE = new LookupFeatureType("LineType"); + + /** Use to determine whether the phone number is SIM swapped. */ + public static final LookupFeatureType SIM_SWAP = new LookupFeatureType("SimSwap"); + + /** Use to determine if the carrier is associated with a VoIP provider (alpha). */ + public static final LookupFeatureType VO_IP_DETECTION = new LookupFeatureType("VoIPDetection"); + + /** Use to determine whether the phone number has been disconnected (alpha). */ + public static final LookupFeatureType RND = new LookupFeatureType("RND"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + LookupFeatureType.class, + LookupFeatureType::new, + Arrays.asList(LINE_TYPE, SIM_SWAP, VO_IP_DETECTION, RND)); + + private LookupFeatureType(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static LookupFeatureType from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(LookupFeatureType e) { + return ENUM_SUPPORT.valueOf(e); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequest.java new file mode 100644 index 000000000..94d358a3b --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequest.java @@ -0,0 +1,89 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.util.List; + +/** NumberLookupRequest */ +@JsonDeserialize(builder = NumberLookupRequestImpl.Builder.class) +public interface NumberLookupRequest { + + /** + * MSISDN in E.164 format to query. + * + *

Field is required + * + * @return number + */ + String getNumber(); + + /** + * Contains requested features. Fallback to LineType if not provided. + * + * @return features + */ + List getFeatures(); + + /** + * Required when RND feature is requested. + * + * @return rndFeatureOptions + */ + RndFeatureOptions getRndFeatureOptions(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new NumberLookupRequestImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param number see getter + * @return Current builder + * @see #getNumber + */ + Builder setNumber(String number); + + /** + * see getter + * + * @param features see getter + * @return Current builder + * @see #getFeatures + */ + Builder setFeatures(List features); + + /** + * see getter + * + * @param rndFeatureOptions see getter + * @return Current builder + * @see #getRndFeatureOptions + */ + Builder setRndFeatureOptions(RndFeatureOptions rndFeatureOptions); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + NumberLookupRequest build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestImpl.java new file mode 100644 index 000000000..53a6f397b --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestImpl.java @@ -0,0 +1,148 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import java.util.List; +import java.util.Objects; + +@JsonPropertyOrder({ + NumberLookupRequestImpl.JSON_PROPERTY_NUMBER, + NumberLookupRequestImpl.JSON_PROPERTY_FEATURES, + NumberLookupRequestImpl.JSON_PROPERTY_RND_FEATURE_OPTIONS +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class NumberLookupRequestImpl implements NumberLookupRequest { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_NUMBER = "number"; + + private OptionalValue number; + + public static final String JSON_PROPERTY_FEATURES = "features"; + + private OptionalValue> features; + + public static final String JSON_PROPERTY_RND_FEATURE_OPTIONS = "rndFeatureOptions"; + + private OptionalValue rndFeatureOptions; + + public NumberLookupRequestImpl() {} + + protected NumberLookupRequestImpl( + OptionalValue number, + OptionalValue> features, + OptionalValue rndFeatureOptions) { + this.number = number; + this.features = features; + this.rndFeatureOptions = rndFeatureOptions; + } + + @JsonIgnore + public String getNumber() { + return number.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_NUMBER) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue number() { + return number; + } + + @JsonIgnore + public List getFeatures() { + return features.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_FEATURES) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue> features() { + return features; + } + + @JsonIgnore + public RndFeatureOptions getRndFeatureOptions() { + return rndFeatureOptions.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_RND_FEATURE_OPTIONS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue rndFeatureOptions() { + return rndFeatureOptions; + } + + /** Return true if this NumberLookupRequest object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NumberLookupRequestImpl numberLookupRequest = (NumberLookupRequestImpl) o; + return Objects.equals(this.number, numberLookupRequest.number) + && Objects.equals(this.features, numberLookupRequest.features) + && Objects.equals(this.rndFeatureOptions, numberLookupRequest.rndFeatureOptions); + } + + @Override + public int hashCode() { + return Objects.hash(number, features, rndFeatureOptions); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class NumberLookupRequestImpl {\n"); + sb.append(" number: ").append(toIndentedString(number)).append("\n"); + sb.append(" features: ").append(toIndentedString(features)).append("\n"); + sb.append(" rndFeatureOptions: ").append(toIndentedString(rndFeatureOptions)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements NumberLookupRequest.Builder { + OptionalValue number = OptionalValue.empty(); + OptionalValue> features = OptionalValue.empty(); + OptionalValue rndFeatureOptions = OptionalValue.empty(); + + @JsonProperty(value = JSON_PROPERTY_NUMBER, required = true) + public Builder setNumber(String number) { + this.number = OptionalValue.of(number); + return this; + } + + @JsonProperty(JSON_PROPERTY_FEATURES) + public Builder setFeatures(List features) { + this.features = OptionalValue.of(features); + return this; + } + + @JsonProperty(JSON_PROPERTY_RND_FEATURE_OPTIONS) + public Builder setRndFeatureOptions(RndFeatureOptions rndFeatureOptions) { + this.rndFeatureOptions = OptionalValue.of(rndFeatureOptions); + return this; + } + + public NumberLookupRequest build() { + return new NumberLookupRequestImpl(number, features, rndFeatureOptions); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptions.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptions.java new file mode 100644 index 000000000..0c120d1ec --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptions.java @@ -0,0 +1,55 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.time.LocalDate; + +/** RndFeatureOptions */ +@JsonDeserialize(builder = RndFeatureOptionsImpl.Builder.class) +public interface RndFeatureOptions { + + /** + * Last contact date in YYYY-MM-DD format. + * + * @return contactDate + */ + LocalDate getContactDate(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new RndFeatureOptionsImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param contactDate see getter + * @return Current builder + * @see #getContactDate + */ + Builder setContactDate(LocalDate contactDate); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + RndFeatureOptions build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsImpl.java new file mode 100644 index 000000000..e4c1856b8 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsImpl.java @@ -0,0 +1,91 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import java.time.LocalDate; +import java.util.Objects; + +@JsonPropertyOrder({RndFeatureOptionsImpl.JSON_PROPERTY_CONTACT_DATE}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class RndFeatureOptionsImpl implements RndFeatureOptions { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_CONTACT_DATE = "contactDate"; + + private OptionalValue contactDate; + + public RndFeatureOptionsImpl() {} + + protected RndFeatureOptionsImpl(OptionalValue contactDate) { + this.contactDate = contactDate; + } + + @JsonIgnore + public LocalDate getContactDate() { + return contactDate.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_CONTACT_DATE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue contactDate() { + return contactDate; + } + + /** Return true if this RndFeatureOptions object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + RndFeatureOptionsImpl rndFeatureOptions = (RndFeatureOptionsImpl) o; + return Objects.equals(this.contactDate, rndFeatureOptions.contactDate); + } + + @Override + public int hashCode() { + return Objects.hash(contactDate); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class RndFeatureOptionsImpl {\n"); + sb.append(" contactDate: ").append(toIndentedString(contactDate)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements RndFeatureOptions.Builder { + OptionalValue contactDate = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_CONTACT_DATE) + public Builder setContactDate(LocalDate contactDate) { + this.contactDate = OptionalValue.of(contactDate); + return this; + } + + public RndFeatureOptions build() { + return new RndFeatureOptionsImpl(contactDate); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Line.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Line.java new file mode 100644 index 000000000..183787d36 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Line.java @@ -0,0 +1,156 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import java.time.Instant; + +/** Line */ +@JsonDeserialize(builder = LineImpl.Builder.class) +public interface Line { + + /** + * Name of the carrier. + * + * @return carrier + */ + String getCarrier(); + + /** + * Number type e.g. wireless, mobile, fixed. + * + * @return type + */ + LineType getType(); + + /** + * A numeric code (MCC) that uniquely identifies a country within the international + * telecommunications network. + * + * @return mobileCountryCode + */ + String getMobileCountryCode(); + + /** + * A distinct identifier assigned to a mobile network operator within a specific country, used in + * combination with MCC. + * + * @return mobileNetworkCode + */ + String getMobileNetworkCode(); + + /** + * Indicates if a phone number has been transferred from its original network to a different + * provider. + * + * @return ported + */ + Boolean getPorted(); + + /** + * Specifies the date, in ISO 8601 format, when a phone number was transferred from its original + * network to a new provider. + * + * @return portingDate + */ + Instant getPortingDate(); + + /** + * Get error + * + * @return error + */ + LookupError getError(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new LineImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param carrier see getter + * @return Current builder + * @see #getCarrier + */ + Builder setCarrier(String carrier); + + /** + * see getter + * + * @param type see getter + * @return Current builder + * @see #getType + */ + Builder setType(LineType type); + + /** + * see getter + * + * @param mobileCountryCode see getter + * @return Current builder + * @see #getMobileCountryCode + */ + Builder setMobileCountryCode(String mobileCountryCode); + + /** + * see getter + * + * @param mobileNetworkCode see getter + * @return Current builder + * @see #getMobileNetworkCode + */ + Builder setMobileNetworkCode(String mobileNetworkCode); + + /** + * see getter + * + * @param ported see getter + * @return Current builder + * @see #getPorted + */ + Builder setPorted(Boolean ported); + + /** + * see getter + * + * @param portingDate see getter + * @return Current builder + * @see #getPortingDate + */ + Builder setPortingDate(Instant portingDate); + + /** + * see getter + * + * @param error see getter + * @return Current builder + * @see #getError + */ + Builder setError(LookupError error); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + Line build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineImpl.java new file mode 100644 index 000000000..0cf94544b --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineImpl.java @@ -0,0 +1,259 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import java.time.Instant; +import java.util.Objects; + +@JsonPropertyOrder({ + LineImpl.JSON_PROPERTY_CARRIER, + LineImpl.JSON_PROPERTY_TYPE, + LineImpl.JSON_PROPERTY_MOBILE_COUNTRY_CODE, + LineImpl.JSON_PROPERTY_MOBILE_NETWORK_CODE, + LineImpl.JSON_PROPERTY_PORTED, + LineImpl.JSON_PROPERTY_PORTING_DATE, + LineImpl.JSON_PROPERTY_ERROR +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class LineImpl implements Line { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_CARRIER = "carrier"; + + private OptionalValue carrier; + + public static final String JSON_PROPERTY_TYPE = "type"; + + private OptionalValue type; + + public static final String JSON_PROPERTY_MOBILE_COUNTRY_CODE = "mobileCountryCode"; + + private OptionalValue mobileCountryCode; + + public static final String JSON_PROPERTY_MOBILE_NETWORK_CODE = "mobileNetworkCode"; + + private OptionalValue mobileNetworkCode; + + public static final String JSON_PROPERTY_PORTED = "ported"; + + private OptionalValue ported; + + public static final String JSON_PROPERTY_PORTING_DATE = "portingDate"; + + private OptionalValue portingDate; + + public static final String JSON_PROPERTY_ERROR = "error"; + + private OptionalValue error; + + public LineImpl() {} + + protected LineImpl( + OptionalValue carrier, + OptionalValue type, + OptionalValue mobileCountryCode, + OptionalValue mobileNetworkCode, + OptionalValue ported, + OptionalValue portingDate, + OptionalValue error) { + this.carrier = carrier; + this.type = type; + this.mobileCountryCode = mobileCountryCode; + this.mobileNetworkCode = mobileNetworkCode; + this.ported = ported; + this.portingDate = portingDate; + this.error = error; + } + + @JsonIgnore + public String getCarrier() { + return carrier.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_CARRIER) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue carrier() { + return carrier; + } + + @JsonIgnore + public LineType getType() { + return type.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TYPE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue type() { + return type; + } + + @JsonIgnore + public String getMobileCountryCode() { + return mobileCountryCode.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_MOBILE_COUNTRY_CODE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue mobileCountryCode() { + return mobileCountryCode; + } + + @JsonIgnore + public String getMobileNetworkCode() { + return mobileNetworkCode.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_MOBILE_NETWORK_CODE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue mobileNetworkCode() { + return mobileNetworkCode; + } + + @JsonIgnore + public Boolean getPorted() { + return ported.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_PORTED) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue ported() { + return ported; + } + + @JsonIgnore + public Instant getPortingDate() { + return portingDate.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_PORTING_DATE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue portingDate() { + return portingDate; + } + + @JsonIgnore + public LookupError getError() { + return error.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_ERROR) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue error() { + return error; + } + + /** Return true if this LineResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + LineImpl lineResponse = (LineImpl) o; + return Objects.equals(this.carrier, lineResponse.carrier) + && Objects.equals(this.type, lineResponse.type) + && Objects.equals(this.mobileCountryCode, lineResponse.mobileCountryCode) + && Objects.equals(this.mobileNetworkCode, lineResponse.mobileNetworkCode) + && Objects.equals(this.ported, lineResponse.ported) + && Objects.equals(this.portingDate, lineResponse.portingDate) + && Objects.equals(this.error, lineResponse.error); + } + + @Override + public int hashCode() { + return Objects.hash( + carrier, type, mobileCountryCode, mobileNetworkCode, ported, portingDate, error); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class LineImpl {\n"); + sb.append(" carrier: ").append(toIndentedString(carrier)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" mobileCountryCode: ").append(toIndentedString(mobileCountryCode)).append("\n"); + sb.append(" mobileNetworkCode: ").append(toIndentedString(mobileNetworkCode)).append("\n"); + sb.append(" ported: ").append(toIndentedString(ported)).append("\n"); + sb.append(" portingDate: ").append(toIndentedString(portingDate)).append("\n"); + sb.append(" error: ").append(toIndentedString(error)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements Line.Builder { + OptionalValue carrier = OptionalValue.empty(); + OptionalValue type = OptionalValue.empty(); + OptionalValue mobileCountryCode = OptionalValue.empty(); + OptionalValue mobileNetworkCode = OptionalValue.empty(); + OptionalValue ported = OptionalValue.empty(); + OptionalValue portingDate = OptionalValue.empty(); + OptionalValue error = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_CARRIER) + public Builder setCarrier(String carrier) { + this.carrier = OptionalValue.of(carrier); + return this; + } + + @JsonProperty(JSON_PROPERTY_TYPE) + public Builder setType(LineType type) { + this.type = OptionalValue.of(type); + return this; + } + + @JsonProperty(JSON_PROPERTY_MOBILE_COUNTRY_CODE) + public Builder setMobileCountryCode(String mobileCountryCode) { + this.mobileCountryCode = OptionalValue.of(mobileCountryCode); + return this; + } + + @JsonProperty(JSON_PROPERTY_MOBILE_NETWORK_CODE) + public Builder setMobileNetworkCode(String mobileNetworkCode) { + this.mobileNetworkCode = OptionalValue.of(mobileNetworkCode); + return this; + } + + @JsonProperty(JSON_PROPERTY_PORTED) + public Builder setPorted(Boolean ported) { + this.ported = OptionalValue.of(ported); + return this; + } + + @JsonProperty(JSON_PROPERTY_PORTING_DATE) + public Builder setPortingDate(Instant portingDate) { + this.portingDate = OptionalValue.of(portingDate); + return this; + } + + @JsonProperty(JSON_PROPERTY_ERROR) + public Builder setError(LookupError error) { + this.error = OptionalValue.of(error); + return this; + } + + public Line build() { + return new LineImpl( + carrier, type, mobileCountryCode, mobileNetworkCode, ported, portingDate, error); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineType.java new file mode 100644 index 000000000..7dc2cc9f4 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineType.java @@ -0,0 +1,50 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import java.util.Arrays; +import java.util.stream.Stream; + +/** Represents the type of a phone line. */ +public class LineType extends EnumDynamic { + + /** A landline phone number. */ + public static final LineType LANDLINE = new LineType("Landline"); + + /** A mobile network phone number. */ + public static final LineType MOBILE = new LineType("Mobile"); + + /** A Voice over IP phone number. */ + public static final LineType VO_IP = new LineType("VoIP"); + + /** A specialty type of number, such as a satellite phone or fax line. */ + public static final LineType SPECIAL = new LineType("Special"); + + /** A freephone type phone number. */ + public static final LineType FREEPHONE = new LineType("Freephone"); + + /** Another type. */ + public static final LineType OTHER = new LineType("Other"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + LineType.class, + LineType::new, + Arrays.asList(LANDLINE, MOBILE, VO_IP, SPECIAL, FREEPHONE, OTHER)); + + private LineType(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static LineType from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(LineType e) { + return ENUM_SUPPORT.valueOf(e); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponse.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponse.java new file mode 100644 index 000000000..cf692ca44 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponse.java @@ -0,0 +1,150 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +/** NumberLookupResponse */ +@JsonDeserialize(builder = NumberLookupResponseImpl.Builder.class) +public interface NumberLookupResponse { + + /** + * An object containing information about the line type of the number. + * + * @return line + */ + Line getLine(); + + /** + * An object containing information about the SimSwap verification performed on the number. + * + * @return simSwap + */ + SimSwap getSimSwap(); + + /** + * An object containing information about the VoIP detection performed on the number. + * + * @return voIPDetection + */ + VoIPDetection getVoIPDetection(); + + /** + * An object containing information whether number is disconnected. + * + * @return rnd + */ + Rnd getRnd(); + + /** + * ISO 3166-1 alpha-2 two-letter country identifier + * + * @return countryCode + */ + String getCountryCode(); + + /** + * The identifier for a trace. + * + * @return traceId + */ + String getTraceId(); + + /** + * Requested MSISDN in E.164 format. + * + * @return number + */ + String getNumber(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new NumberLookupResponseImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param line see getter + * @return Current builder + * @see #getLine + */ + Builder setLine(Line line); + + /** + * see getter + * + * @param simSwap see getter + * @return Current builder + * @see #getSimSwap + */ + Builder setSimSwap(SimSwap simSwap); + + /** + * see getter + * + * @param voIPDetection see getter + * @return Current builder + * @see #getVoIPDetection + */ + Builder setVoIPDetection(VoIPDetection voIPDetection); + + /** + * see getter + * + * @param rnd see getter + * @return Current builder + * @see #getRnd + */ + Builder setRnd(Rnd rnd); + + /** + * see getter + * + * @param countryCode see getter + * @return Current builder + * @see #getCountryCode + */ + Builder setCountryCode(String countryCode); + + /** + * see getter + * + * @param traceId see getter + * @return Current builder + * @see #getTraceId + */ + Builder setTraceId(String traceId); + + /** + * see getter + * + * @param number see getter + * @return Current builder + * @see #getNumber + */ + Builder setNumber(String number); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + NumberLookupResponse build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseImpl.java new file mode 100644 index 000000000..a7168f17e --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseImpl.java @@ -0,0 +1,256 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import java.util.Objects; + +@JsonPropertyOrder({ + NumberLookupResponseImpl.JSON_PROPERTY_LINE, + NumberLookupResponseImpl.JSON_PROPERTY_SIM_SWAP, + NumberLookupResponseImpl.JSON_PROPERTY_VO_I_P_DETECTION, + NumberLookupResponseImpl.JSON_PROPERTY_RND, + NumberLookupResponseImpl.JSON_PROPERTY_COUNTRY_CODE, + NumberLookupResponseImpl.JSON_PROPERTY_TRACE_ID, + NumberLookupResponseImpl.JSON_PROPERTY_NUMBER +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class NumberLookupResponseImpl implements NumberLookupResponse { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_LINE = "line"; + + private OptionalValue line; + + public static final String JSON_PROPERTY_SIM_SWAP = "simSwap"; + + private OptionalValue simSwap; + + public static final String JSON_PROPERTY_VO_I_P_DETECTION = "voIPDetection"; + + private OptionalValue voIPDetection; + + public static final String JSON_PROPERTY_RND = "rnd"; + + private OptionalValue rnd; + + public static final String JSON_PROPERTY_COUNTRY_CODE = "countryCode"; + + private OptionalValue countryCode; + + public static final String JSON_PROPERTY_TRACE_ID = "traceId"; + + private OptionalValue traceId; + + public static final String JSON_PROPERTY_NUMBER = "number"; + + private OptionalValue number; + + public NumberLookupResponseImpl() {} + + protected NumberLookupResponseImpl( + OptionalValue line, + OptionalValue simSwap, + OptionalValue voIPDetection, + OptionalValue rnd, + OptionalValue countryCode, + OptionalValue traceId, + OptionalValue number) { + this.line = line; + this.simSwap = simSwap; + this.voIPDetection = voIPDetection; + this.rnd = rnd; + this.countryCode = countryCode; + this.traceId = traceId; + this.number = number; + } + + @JsonIgnore + public Line getLine() { + return line.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_LINE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue line() { + return line; + } + + @JsonIgnore + public SimSwap getSimSwap() { + return simSwap.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_SIM_SWAP) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue simSwap() { + return simSwap; + } + + @JsonIgnore + public VoIPDetection getVoIPDetection() { + return voIPDetection.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_VO_I_P_DETECTION) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue voIPDetection() { + return voIPDetection; + } + + @JsonIgnore + public Rnd getRnd() { + return rnd.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_RND) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue rnd() { + return rnd; + } + + @JsonIgnore + public String getCountryCode() { + return countryCode.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_COUNTRY_CODE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue countryCode() { + return countryCode; + } + + @JsonIgnore + public String getTraceId() { + return traceId.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_TRACE_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue traceId() { + return traceId; + } + + @JsonIgnore + public String getNumber() { + return number.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_NUMBER) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue number() { + return number; + } + + /** Return true if this NumberLookupResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NumberLookupResponseImpl numberLookupResponse = (NumberLookupResponseImpl) o; + return Objects.equals(this.line, numberLookupResponse.line) + && Objects.equals(this.simSwap, numberLookupResponse.simSwap) + && Objects.equals(this.voIPDetection, numberLookupResponse.voIPDetection) + && Objects.equals(this.rnd, numberLookupResponse.rnd) + && Objects.equals(this.countryCode, numberLookupResponse.countryCode) + && Objects.equals(this.traceId, numberLookupResponse.traceId) + && Objects.equals(this.number, numberLookupResponse.number); + } + + @Override + public int hashCode() { + return Objects.hash(line, simSwap, voIPDetection, rnd, countryCode, traceId, number); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class NumberLookupResponseImpl {\n"); + sb.append(" line: ").append(toIndentedString(line)).append("\n"); + sb.append(" simSwap: ").append(toIndentedString(simSwap)).append("\n"); + sb.append(" voIPDetection: ").append(toIndentedString(voIPDetection)).append("\n"); + sb.append(" rnd: ").append(toIndentedString(rnd)).append("\n"); + sb.append(" countryCode: ").append(toIndentedString(countryCode)).append("\n"); + sb.append(" traceId: ").append(toIndentedString(traceId)).append("\n"); + sb.append(" number: ").append(toIndentedString(number)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements NumberLookupResponse.Builder { + OptionalValue line = OptionalValue.empty(); + OptionalValue simSwap = OptionalValue.empty(); + OptionalValue voIPDetection = OptionalValue.empty(); + OptionalValue rnd = OptionalValue.empty(); + OptionalValue countryCode = OptionalValue.empty(); + OptionalValue traceId = OptionalValue.empty(); + OptionalValue number = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_LINE) + public Builder setLine(Line line) { + this.line = OptionalValue.of(line); + return this; + } + + @JsonProperty(JSON_PROPERTY_SIM_SWAP) + public Builder setSimSwap(SimSwap simSwap) { + this.simSwap = OptionalValue.of(simSwap); + return this; + } + + @JsonProperty(JSON_PROPERTY_VO_I_P_DETECTION) + public Builder setVoIPDetection(VoIPDetection voIPDetection) { + this.voIPDetection = OptionalValue.of(voIPDetection); + return this; + } + + @JsonProperty(JSON_PROPERTY_RND) + public Builder setRnd(Rnd rnd) { + this.rnd = OptionalValue.of(rnd); + return this; + } + + @JsonProperty(JSON_PROPERTY_COUNTRY_CODE) + public Builder setCountryCode(String countryCode) { + this.countryCode = OptionalValue.of(countryCode); + return this; + } + + @JsonProperty(JSON_PROPERTY_TRACE_ID) + public Builder setTraceId(String traceId) { + this.traceId = OptionalValue.of(traceId); + return this; + } + + @JsonProperty(JSON_PROPERTY_NUMBER) + public Builder setNumber(String number) { + this.number = OptionalValue.of(number); + return this; + } + + public NumberLookupResponse build() { + return new NumberLookupResponseImpl( + line, simSwap, voIPDetection, rnd, countryCode, traceId, number); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Rnd.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Rnd.java new file mode 100644 index 000000000..28dfb1be8 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Rnd.java @@ -0,0 +1,71 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; + +/** Rnd */ +@JsonDeserialize(builder = RndImpl.Builder.class) +public interface Rnd { + + /** + * Provides information whether the number was disconnected after provided last contact date. + * + * @return disconnected + */ + Boolean getDisconnected(); + + /** + * Get error + * + * @return error + */ + LookupError getError(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new RndImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param disconnected see getter + * @return Current builder + * @see #getDisconnected + */ + Builder setDisconnected(Boolean disconnected); + + /** + * see getter + * + * @param error see getter + * @return Current builder + * @see #getError + */ + Builder setError(LookupError error); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + Rnd build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/RndImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/RndImpl.java new file mode 100644 index 000000000..5b8d83a71 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/RndImpl.java @@ -0,0 +1,116 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import java.util.Objects; + +@JsonPropertyOrder({RndImpl.JSON_PROPERTY_DISCONNECTED, RndImpl.JSON_PROPERTY_ERROR}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class RndImpl implements Rnd { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_DISCONNECTED = "disconnected"; + + private OptionalValue disconnected; + + public static final String JSON_PROPERTY_ERROR = "error"; + + private OptionalValue error; + + public RndImpl() {} + + protected RndImpl(OptionalValue disconnected, OptionalValue error) { + this.disconnected = disconnected; + this.error = error; + } + + @JsonIgnore + public Boolean getDisconnected() { + return disconnected.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_DISCONNECTED) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue disconnected() { + return disconnected; + } + + @JsonIgnore + public LookupError getError() { + return error.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_ERROR) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue error() { + return error; + } + + /** Return true if this RndResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + RndImpl rndResponse = (RndImpl) o; + return Objects.equals(this.disconnected, rndResponse.disconnected) + && Objects.equals(this.error, rndResponse.error); + } + + @Override + public int hashCode() { + return Objects.hash(disconnected, error); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class RndImpl {\n"); + sb.append(" disconnected: ").append(toIndentedString(disconnected)).append("\n"); + sb.append(" error: ").append(toIndentedString(error)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements Rnd.Builder { + OptionalValue disconnected = OptionalValue.empty(); + OptionalValue error = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_DISCONNECTED) + public Builder setDisconnected(Boolean disconnected) { + this.disconnected = OptionalValue.of(disconnected); + return this; + } + + @JsonProperty(JSON_PROPERTY_ERROR) + public Builder setError(LookupError error) { + this.error = OptionalValue.of(error); + return this; + } + + public Rnd build() { + return new RndImpl(disconnected, error); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwap.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwap.java new file mode 100644 index 000000000..ad7872612 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwap.java @@ -0,0 +1,87 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; + +/** SimSwap */ +@JsonDeserialize(builder = SimSwapImpl.Builder.class) +public interface SimSwap { + + /** + * Indicates whether SIM was changed. + * + * @return swapped + */ + Boolean getSwapped(); + + /** + * Threshold for sim swap check. + * + * @return swapPeriod + */ + SwapPeriodType getSwapPeriod(); + + /** + * Get error + * + * @return error + */ + LookupError getError(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new SimSwapImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param swapped see getter + * @return Current builder + * @see #getSwapped + */ + Builder setSwapped(Boolean swapped); + + /** + * see getter + * + * @param swapPeriod see getter + * @return Current builder + * @see #getSwapPeriod + */ + Builder setSwapPeriod(SwapPeriodType swapPeriod); + + /** + * see getter + * + * @param error see getter + * @return Current builder + * @see #getError + */ + Builder setError(LookupError error); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + SimSwap build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapImpl.java new file mode 100644 index 000000000..e0ab9aab4 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapImpl.java @@ -0,0 +1,148 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import java.util.Objects; + +@JsonPropertyOrder({ + SimSwapImpl.JSON_PROPERTY_SWAPPED, + SimSwapImpl.JSON_PROPERTY_SWAP_PERIOD, + SimSwapImpl.JSON_PROPERTY_ERROR +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class SimSwapImpl implements SimSwap { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_SWAPPED = "swapped"; + + private OptionalValue swapped; + + public static final String JSON_PROPERTY_SWAP_PERIOD = "swapPeriod"; + + private OptionalValue swapPeriod; + + public static final String JSON_PROPERTY_ERROR = "error"; + + private OptionalValue error; + + public SimSwapImpl() {} + + protected SimSwapImpl( + OptionalValue swapped, + OptionalValue swapPeriod, + OptionalValue error) { + this.swapped = swapped; + this.swapPeriod = swapPeriod; + this.error = error; + } + + @JsonIgnore + public Boolean getSwapped() { + return swapped.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_SWAPPED) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue swapped() { + return swapped; + } + + @JsonIgnore + public SwapPeriodType getSwapPeriod() { + return swapPeriod.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_SWAP_PERIOD) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue swapPeriod() { + return swapPeriod; + } + + @JsonIgnore + public LookupError getError() { + return error.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_ERROR) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue error() { + return error; + } + + /** Return true if this SimSwapResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SimSwapImpl simSwapResponse = (SimSwapImpl) o; + return Objects.equals(this.swapped, simSwapResponse.swapped) + && Objects.equals(this.swapPeriod, simSwapResponse.swapPeriod) + && Objects.equals(this.error, simSwapResponse.error); + } + + @Override + public int hashCode() { + return Objects.hash(swapped, swapPeriod, error); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class SimSwapImpl {\n"); + sb.append(" swapped: ").append(toIndentedString(swapped)).append("\n"); + sb.append(" swapPeriod: ").append(toIndentedString(swapPeriod)).append("\n"); + sb.append(" error: ").append(toIndentedString(error)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements SimSwap.Builder { + OptionalValue swapped = OptionalValue.empty(); + OptionalValue swapPeriod = OptionalValue.empty(); + OptionalValue error = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_SWAPPED) + public Builder setSwapped(Boolean swapped) { + this.swapped = OptionalValue.of(swapped); + return this; + } + + @JsonProperty(JSON_PROPERTY_SWAP_PERIOD) + public Builder setSwapPeriod(SwapPeriodType swapPeriod) { + this.swapPeriod = OptionalValue.of(swapPeriod); + return this; + } + + @JsonProperty(JSON_PROPERTY_ERROR) + public Builder setError(LookupError error) { + this.error = OptionalValue.of(error); + return this; + } + + public SimSwap build() { + return new SimSwapImpl(swapped, swapPeriod, error); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SwapPeriodType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SwapPeriodType.java new file mode 100644 index 000000000..c5a1de7b2 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SwapPeriodType.java @@ -0,0 +1,63 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import java.util.Arrays; +import java.util.stream.Stream; + +/** */ +public class SwapPeriodType extends EnumDynamic { + + /** Undefined */ + public static final SwapPeriodType UNDEFINED = new SwapPeriodType("Undefined"); + + /** 4 Hours */ + public static final SwapPeriodType SP4_H = new SwapPeriodType("SP4H"); + + /** 12 Hours */ + public static final SwapPeriodType SP12_H = new SwapPeriodType("SP12H"); + + /** 24 Hours */ + public static final SwapPeriodType SP24_H = new SwapPeriodType("SP24H"); + + /** 48 Hours */ + public static final SwapPeriodType SP48_H = new SwapPeriodType("SP48H"); + + /** 5 Days */ + public static final SwapPeriodType SP5_D = new SwapPeriodType("SP5D"); + + /** 7 Days */ + public static final SwapPeriodType SP7_D = new SwapPeriodType("SP7D"); + + /** 14 Days */ + public static final SwapPeriodType SP14_D = new SwapPeriodType("SP14D"); + + /** 30 Days */ + public static final SwapPeriodType SP30_D = new SwapPeriodType("SP30D"); + + /** Maximum */ + public static final SwapPeriodType SPMAX = new SwapPeriodType("SPMAX"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + SwapPeriodType.class, + SwapPeriodType::new, + Arrays.asList( + UNDEFINED, SP4_H, SP12_H, SP24_H, SP48_H, SP5_D, SP7_D, SP14_D, SP30_D, SPMAX)); + + private SwapPeriodType(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static SwapPeriodType from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(SwapPeriodType e) { + return ENUM_SUPPORT.valueOf(e); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetection.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetection.java new file mode 100644 index 000000000..f5814dc5c --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetection.java @@ -0,0 +1,71 @@ +/* + * Number Lookup Api v2 + * + * OpenAPI document version: 0.1.0 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; + +/** VoIPDetection */ +@JsonDeserialize(builder = VoIPDetectionImpl.Builder.class) +public interface VoIPDetection { + + /** + * Probability of number being VoIP based on the AI analysis. + * + * @return probability + */ + VoIPProbabilityType getProbability(); + + /** + * Get error + * + * @return error + */ + LookupError getError(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new VoIPDetectionImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param probability see getter + * @return Current builder + * @see #getProbability + */ + Builder setProbability(VoIPProbabilityType probability); + + /** + * see getter + * + * @param error see getter + * @return Current builder + * @see #getError + */ + Builder setError(LookupError error); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + VoIPDetection build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionImpl.java new file mode 100644 index 000000000..e6ebe85d9 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionImpl.java @@ -0,0 +1,120 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import java.util.Objects; + +@JsonPropertyOrder({ + VoIPDetectionImpl.JSON_PROPERTY_PROBABILITY, + VoIPDetectionImpl.JSON_PROPERTY_ERROR +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class VoIPDetectionImpl implements VoIPDetection { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_PROBABILITY = "probability"; + + private OptionalValue probability; + + public static final String JSON_PROPERTY_ERROR = "error"; + + private OptionalValue error; + + public VoIPDetectionImpl() {} + + protected VoIPDetectionImpl( + OptionalValue probability, OptionalValue error) { + this.probability = probability; + this.error = error; + } + + @JsonIgnore + public VoIPProbabilityType getProbability() { + return probability.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_PROBABILITY) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue probability() { + return probability; + } + + @JsonIgnore + public LookupError getError() { + return error.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_ERROR) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue error() { + return error; + } + + /** Return true if this VoIPDetectionResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + VoIPDetectionImpl voIPDetectionResponse = (VoIPDetectionImpl) o; + return Objects.equals(this.probability, voIPDetectionResponse.probability) + && Objects.equals(this.error, voIPDetectionResponse.error); + } + + @Override + public int hashCode() { + return Objects.hash(probability, error); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class VoIPDetectionImpl {\n"); + sb.append(" probability: ").append(toIndentedString(probability)).append("\n"); + sb.append(" error: ").append(toIndentedString(error)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements VoIPDetection.Builder { + OptionalValue probability = OptionalValue.empty(); + OptionalValue error = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_PROBABILITY) + public Builder setProbability(VoIPProbabilityType probability) { + this.probability = OptionalValue.of(probability); + return this; + } + + @JsonProperty(JSON_PROPERTY_ERROR) + public Builder setError(LookupError error) { + this.error = OptionalValue.of(error); + return this; + } + + public VoIPDetection build() { + return new VoIPDetectionImpl(probability, error); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPProbabilityType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPProbabilityType.java new file mode 100644 index 000000000..d6e81a332 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPProbabilityType.java @@ -0,0 +1,44 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import java.util.Arrays; +import java.util.stream.Stream; + +/** */ +public class VoIPProbabilityType extends EnumDynamic { + + /** Undefined */ + public static final VoIPProbabilityType UNKNOWN = new VoIPProbabilityType("Unknown"); + + /** Low */ + public static final VoIPProbabilityType LOW = new VoIPProbabilityType("Low"); + + /** Likely */ + public static final VoIPProbabilityType LIKELY = new VoIPProbabilityType("Likely"); + + /** High */ + public static final VoIPProbabilityType HIGH = new VoIPProbabilityType("High"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + VoIPProbabilityType.class, + VoIPProbabilityType::new, + Arrays.asList(UNKNOWN, LOW, LIKELY, HIGH)); + + private VoIPProbabilityType(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static VoIPProbabilityType from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(VoIPProbabilityType e) { + return ENUM_SUPPORT.valueOf(e); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorDtoTest.java new file mode 100644 index 000000000..faf6e7261 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorDtoTest.java @@ -0,0 +1,42 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.errors; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import org.junit.jupiter.api.Test; + +@TestWithResources +public class LookupErrorDtoTest extends BaseTest { + + public static LookupError lookupErrorDto = + LookupError.builder() + .setStatus(100) + .setTitle("Feature Disabled") + .setDetail("VoIPDetection feature is currently disabled.") + .setType("validation_error") + .build(); + + public static LookupError lookupErrorEmptyDto = LookupError.builder().build(); + + @GivenTextResource("/domains/numberlookup/v2/errors/LookupErrorDto.json") + String jsonLookupErrorDto; + + @GivenTextResource("/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json") + String jsonLookupErrorEmptyDto; + + @Test + void deserializeDto() throws JsonProcessingException { + LookupError deserialized = objectMapper.readValue(jsonLookupErrorDto, LookupError.class); + + TestHelpers.recursiveEquals(deserialized, lookupErrorDto); + } + + @Test + void deserializeEmptyDto() throws JsonProcessingException { + LookupError deserialized = objectMapper.readValue(jsonLookupErrorEmptyDto, LookupError.class); + + TestHelpers.recursiveEquals(deserialized, lookupErrorEmptyDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsDtoTest.java new file mode 100644 index 000000000..d94af3def --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsDtoTest.java @@ -0,0 +1,31 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.errors; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import org.junit.jupiter.api.Test; + +@TestWithResources +public class ProblemDetailsDtoTest extends BaseTest { + + public static ProblemDetails problemDetailsDto = + ProblemDetails.builder() + .setType("https://developers.sinch.com/docs/lookup/api/errors/validation") + .setTitle("Validation error") + .setStatus(400) + .setTraceId("84c1fd4063c38d9f3900d06e56542d48") + .build(); + + @GivenTextResource("/domains/numberlookup/v2/errors/ProblemDetailsDto.json") + String jsonProblemDetailsDto; + + @Test + void deserializeDto() throws JsonProcessingException { + ProblemDetails deserialized = + objectMapper.readValue(jsonProblemDetailsDto, ProblemDetails.class); + + TestHelpers.recursiveEquals(deserialized, problemDetailsDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestDtoTest.java new file mode 100644 index 000000000..8d20f0465 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestDtoTest.java @@ -0,0 +1,120 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import java.time.LocalDate; +import java.util.Arrays; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class NumberLookupRequestDtoTest extends BaseTest { + + public static NumberLookupRequest numberLookupRequestMinimalDto = + NumberLookupRequest.builder().setNumber("+15551234567").build(); + + public static NumberLookupRequest numberLookupRequestWithFeaturesDto = + NumberLookupRequest.builder() + .setNumber("+15552345678") + .setFeatures( + Arrays.asList( + LookupFeatureType.LINE_TYPE, + LookupFeatureType.SIM_SWAP, + LookupFeatureType.VO_IP_DETECTION)) + .build(); + + public static NumberLookupRequest numberLookupRequestWithRndOptionsDto = + NumberLookupRequest.builder() + .setNumber("+15553456789") + .setFeatures(Arrays.asList(LookupFeatureType.RND)) + .setRndFeatureOptions( + RndFeatureOptions.builder().setContactDate(LocalDate.parse("2025-01-01")).build()) + .build(); + + public static NumberLookupRequest numberLookupRequestAllFeaturesDto = + NumberLookupRequest.builder() + .setNumber("+15554567890") + .setFeatures( + Arrays.asList( + LookupFeatureType.LINE_TYPE, + LookupFeatureType.SIM_SWAP, + LookupFeatureType.VO_IP_DETECTION, + LookupFeatureType.RND)) + .build(); + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json") + String jsonNumberLookupRequestMinimalDto; + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json") + String jsonNumberLookupRequestWithFeaturesDto; + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json") + String jsonNumberLookupRequestWithRndOptionsDto; + + @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json") + String jsonNumberLookupRequestAllFeaturesDto; + + @Test + void serializeMinimalDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(numberLookupRequestMinimalDto); + + JSONAssert.assertEquals(jsonNumberLookupRequestMinimalDto, serializedString, true); + } + + @Test + void deserializeMinimalDto() throws JsonProcessingException { + NumberLookupRequest deserialized = + objectMapper.readValue(jsonNumberLookupRequestMinimalDto, NumberLookupRequest.class); + + TestHelpers.recursiveEquals(deserialized, numberLookupRequestMinimalDto); + } + + @Test + void serializeWithFeaturesDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(numberLookupRequestWithFeaturesDto); + + JSONAssert.assertEquals(jsonNumberLookupRequestWithFeaturesDto, serializedString, true); + } + + @Test + void deserializeWithFeaturesDto() throws JsonProcessingException { + NumberLookupRequest deserialized = + objectMapper.readValue(jsonNumberLookupRequestWithFeaturesDto, NumberLookupRequest.class); + + TestHelpers.recursiveEquals(deserialized, numberLookupRequestWithFeaturesDto); + } + + @Test + void serializeWithRndOptionsDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(numberLookupRequestWithRndOptionsDto); + + JSONAssert.assertEquals(jsonNumberLookupRequestWithRndOptionsDto, serializedString, true); + } + + @Test + void deserializeWithRndOptionsDto() throws JsonProcessingException { + NumberLookupRequest deserialized = + objectMapper.readValue(jsonNumberLookupRequestWithRndOptionsDto, NumberLookupRequest.class); + + TestHelpers.recursiveEquals(deserialized, numberLookupRequestWithRndOptionsDto); + } + + @Test + void serializeAllFeaturesDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(numberLookupRequestAllFeaturesDto); + + JSONAssert.assertEquals(jsonNumberLookupRequestAllFeaturesDto, serializedString, true); + } + + @Test + void deserializeAllFeaturesDto() throws JsonProcessingException { + NumberLookupRequest deserialized = + objectMapper.readValue(jsonNumberLookupRequestAllFeaturesDto, NumberLookupRequest.class); + + TestHelpers.recursiveEquals(deserialized, numberLookupRequestAllFeaturesDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsDtoTest.java new file mode 100644 index 000000000..305d7d031 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsDtoTest.java @@ -0,0 +1,36 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.request; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import java.time.LocalDate; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class RndFeatureOptionsDtoTest extends BaseTest { + + public static RndFeatureOptions rndFeatureOptionsDto = + RndFeatureOptions.builder().setContactDate(LocalDate.parse("2025-01-15")).build(); + + @GivenTextResource("/domains/numberlookup/v2/request/RndFeatureOptionsDto.json") + String jsonRndFeatureOptionsDto; + + @Test + void serializeDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(rndFeatureOptionsDto); + + JSONAssert.assertEquals(jsonRndFeatureOptionsDto, serializedString, true); + } + + @Test + void deserializeDto() throws JsonProcessingException { + RndFeatureOptions deserialized = + objectMapper.readValue(jsonRndFeatureOptionsDto, RndFeatureOptions.class); + + TestHelpers.recursiveEquals(deserialized, rndFeatureOptionsDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/LineResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/LineResponseDtoTest.java new file mode 100644 index 000000000..b16e73c01 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/LineResponseDtoTest.java @@ -0,0 +1,54 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import java.time.Instant; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class LineResponseDtoTest extends BaseTest { + + public static Line lineResponseDto = + Line.builder() + .setCarrier("T-Mobile USA") + .setType(LineType.MOBILE) + .setMobileCountryCode("310") + .setMobileNetworkCode("260") + .setPorted(true) + .setPortingDate(Instant.parse("2024-06-15T14:30:00Z")) + .build(); + + public static Line lineResponseEmptyDto = Line.builder().build(); + + @GivenTextResource("/domains/numberlookup/v2/response/LineResponseDto.json") + String jsonLineResponseDto; + + @GivenTextResource("/domains/numberlookup/v2/response/LineResponseEmptyDto.json") + String jsonLineResponseEmptyDto; + + @Test + void serializeDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(lineResponseDto); + + JSONAssert.assertEquals(jsonLineResponseDto, serializedString, true); + } + + @Test + void deserializeDto() throws JsonProcessingException { + Line deserialized = objectMapper.readValue(jsonLineResponseDto, Line.class); + + TestHelpers.recursiveEquals(deserialized, lineResponseDto); + } + + @Test + void deserializeEmptyDto() throws JsonProcessingException { + Line deserialized = objectMapper.readValue(jsonLineResponseEmptyDto, Line.class); + + TestHelpers.recursiveEquals(deserialized, lineResponseEmptyDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseDtoTest.java new file mode 100644 index 000000000..1aa55dbc4 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseDtoTest.java @@ -0,0 +1,63 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import java.time.Instant; +import org.junit.jupiter.api.Test; + +@TestWithResources +public class NumberLookupResponseDtoTest extends BaseTest { + + public static NumberLookupResponse numberLookupResponseMinimalDto = + NumberLookupResponse.builder() + .setNumber("+15551234567") + .setCountryCode("US") + .setTraceId("test-trace-id") + .build(); + + public static NumberLookupResponse numberLookupResponseFullDto = + NumberLookupResponse.builder() + .setLine( + Line.builder() + .setCarrier("T-Mobile USA") + .setType(LineType.MOBILE) + .setMobileCountryCode("310") + .setMobileNetworkCode("260") + .setPorted(true) + .setPortingDate(Instant.parse("2024-08-20T10:15:30Z")) + .build()) + .setSimSwap( + SimSwap.builder().setSwapped(true).setSwapPeriod(SwapPeriodType.SP24_H).build()) + .setVoIPDetection( + VoIPDetection.builder().setProbability(VoIPProbabilityType.HIGH).build()) + .setRnd(Rnd.builder().setDisconnected(true).build()) + .setCountryCode("US") + .setTraceId("84c1fd4063c38d9f3900d06e56542d48") + .setNumber("+15557890123") + .build(); + + @GivenTextResource("/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json") + String jsonNumberLookupResponseMinimalDto; + + @GivenTextResource("/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json") + String jsonNumberLookupResponseFullDto; + + @Test + void deserializeMinimalDto() throws JsonProcessingException { + NumberLookupResponse deserialized = + objectMapper.readValue(jsonNumberLookupResponseMinimalDto, NumberLookupResponse.class); + + TestHelpers.recursiveEquals(deserialized, numberLookupResponseMinimalDto); + } + + @Test + void deserializeFullDto() throws JsonProcessingException { + NumberLookupResponse deserialized = + objectMapper.readValue(jsonNumberLookupResponseFullDto, NumberLookupResponse.class); + + TestHelpers.recursiveEquals(deserialized, numberLookupResponseFullDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/RndResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/RndResponseDtoTest.java new file mode 100644 index 000000000..36f25d8e4 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/RndResponseDtoTest.java @@ -0,0 +1,45 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class RndResponseDtoTest extends BaseTest { + + public static Rnd rndResponseDto = Rnd.builder().setDisconnected(true).build(); + + public static Rnd rndResponseEmptyDto = Rnd.builder().build(); + + @GivenTextResource("/domains/numberlookup/v2/response/RndResponseDto.json") + String jsonRndResponseDto; + + @GivenTextResource("/domains/numberlookup/v2/response/RndResponseEmptyDto.json") + String jsonRndResponseEmptyDto; + + @Test + void serializeDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(rndResponseDto); + + JSONAssert.assertEquals(jsonRndResponseDto, serializedString, true); + } + + @Test + void deserializeDto() throws JsonProcessingException { + Rnd deserialized = objectMapper.readValue(jsonRndResponseDto, Rnd.class); + + TestHelpers.recursiveEquals(deserialized, rndResponseDto); + } + + @Test + void deserializeEmptyDto() throws JsonProcessingException { + Rnd deserialized = objectMapper.readValue(jsonRndResponseEmptyDto, Rnd.class); + + TestHelpers.recursiveEquals(deserialized, rndResponseEmptyDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapResponseDtoTest.java new file mode 100644 index 000000000..ff7a6d510 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapResponseDtoTest.java @@ -0,0 +1,62 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class SimSwapResponseDtoTest extends BaseTest { + + public static SimSwap simSwapResponseDto = + SimSwap.builder().setSwapped(true).setSwapPeriod(SwapPeriodType.SP24_H).build(); + + public static SimSwap simSwapResponseWithErrorDto = + SimSwap.builder() + .setError( + LookupError.builder() + .setStatus(100) + .setTitle("Feature Disabled") + .setDetail("SimSwap feature is currently disabled.") + .build()) + .build(); + + @GivenTextResource("/domains/numberlookup/v2/response/SimSwapResponseDto.json") + String jsonSimSwapDto; + + @GivenTextResource("/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json") + String jsonSimSwapWithErrorDto; + + @Test + void serializeDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(simSwapResponseDto); + + JSONAssert.assertEquals(jsonSimSwapDto, serializedString, true); + } + + @Test + void deserializeDto() throws JsonProcessingException { + SimSwap deserialized = objectMapper.readValue(jsonSimSwapDto, SimSwap.class); + + TestHelpers.recursiveEquals(deserialized, simSwapResponseDto); + } + + @Test + void serializeWithErrorDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(simSwapResponseWithErrorDto); + + JSONAssert.assertEquals(jsonSimSwapWithErrorDto, serializedString, true); + } + + @Test + void deserializeWithErrorDto() throws JsonProcessingException { + SimSwap deserialized = objectMapper.readValue(jsonSimSwapWithErrorDto, SimSwap.class); + + TestHelpers.recursiveEquals(deserialized, simSwapResponseWithErrorDto); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionResponseDtoTest.java new file mode 100644 index 000000000..d7e86ef47 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionResponseDtoTest.java @@ -0,0 +1,47 @@ +package com.sinch.sdk.domains.numberlookup.models.v2.response; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class VoIPDetectionResponseDtoTest extends BaseTest { + + public static VoIPDetection voIPDetectionResponseDto = + VoIPDetection.builder().setProbability(VoIPProbabilityType.HIGH).build(); + + public static VoIPDetection voIPDetectionResponseEmptyDto = VoIPDetection.builder().build(); + + @GivenTextResource("/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json") + String jsonVoIPDetectionDto; + + @GivenTextResource("/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json") + String jsonVoIPDetectionEmptyDto; + + @Test + void serializeDto() throws JsonProcessingException, JSONException { + String serializedString = objectMapper.writeValueAsString(voIPDetectionResponseDto); + + JSONAssert.assertEquals(jsonVoIPDetectionDto, serializedString, true); + } + + @Test + void deserializeDto() throws JsonProcessingException { + VoIPDetection deserialized = objectMapper.readValue(jsonVoIPDetectionDto, VoIPDetection.class); + + TestHelpers.recursiveEquals(deserialized, voIPDetectionResponseDto); + } + + @Test + void deserializeEmptyDto() throws JsonProcessingException { + VoIPDetection deserialized = + objectMapper.readValue(jsonVoIPDetectionEmptyDto, VoIPDetection.class); + + TestHelpers.recursiveEquals(deserialized, voIPDetectionResponseEmptyDto); + } +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorDto.json new file mode 100644 index 000000000..86220e9d1 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorDto.json @@ -0,0 +1,6 @@ +{ + "status": 100, + "title": "Feature Disabled", + "detail": "VoIPDetection feature is currently disabled.", + "type": "validation_error" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json @@ -0,0 +1 @@ +{} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/ProblemDetailsDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/ProblemDetailsDto.json new file mode 100644 index 000000000..1e1590f3c --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/ProblemDetailsDto.json @@ -0,0 +1,6 @@ +{ + "type": "https://developers.sinch.com/docs/lookup/api/errors/validation", + "title": "Validation error", + "status": 400, + "traceId": "84c1fd4063c38d9f3900d06e56542d48" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json new file mode 100644 index 000000000..84b20c39e --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json @@ -0,0 +1,9 @@ +{ + "number": "+15554567890", + "features": [ + "LineType", + "SimSwap", + "VoIPDetection", + "RND" + ] +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json new file mode 100644 index 000000000..b190f89ba --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json @@ -0,0 +1,3 @@ +{ + "number": "+15551234567" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json new file mode 100644 index 000000000..33bad4262 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json @@ -0,0 +1,8 @@ +{ + "number": "+15552345678", + "features": [ + "LineType", + "SimSwap", + "VoIPDetection" + ] +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json new file mode 100644 index 000000000..7ef54e3e4 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json @@ -0,0 +1,9 @@ +{ + "number": "+15553456789", + "features": [ + "RND" + ], + "rndFeatureOptions": { + "contactDate": "2025-01-01" + } +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/RndFeatureOptionsDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/RndFeatureOptionsDto.json new file mode 100644 index 000000000..45a365f9c --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/RndFeatureOptionsDto.json @@ -0,0 +1,3 @@ +{ + "contactDate": "2025-01-15" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseDto.json new file mode 100644 index 000000000..cc7ff9007 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseDto.json @@ -0,0 +1,8 @@ +{ + "carrier": "T-Mobile USA", + "type": "Mobile", + "mobileCountryCode": "310", + "mobileNetworkCode": "260", + "ported": true, + "portingDate": "2024-06-15T14:30:00Z" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseEmptyDto.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseEmptyDto.json @@ -0,0 +1 @@ +{} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json new file mode 100644 index 000000000..b43781206 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json @@ -0,0 +1,23 @@ +{ + "line": { + "carrier": "T-Mobile USA", + "type": "Mobile", + "mobileCountryCode": "310", + "mobileNetworkCode": "260", + "ported": true, + "portingDate": "2024-08-20T10:15:30Z" + }, + "simSwap": { + "swapped": true, + "swapPeriod": "SP24H" + }, + "voIPDetection": { + "probability": "High" + }, + "rnd": { + "disconnected": true + }, + "countryCode": "US", + "traceId": "84c1fd4063c38d9f3900d06e56542d48", + "number": "+15557890123" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json new file mode 100644 index 000000000..d6334b7e9 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json @@ -0,0 +1,5 @@ +{ + "countryCode": "US", + "traceId": "test-trace-id", + "number": "+15551234567" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseDto.json new file mode 100644 index 000000000..29102b577 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseDto.json @@ -0,0 +1,3 @@ +{ + "disconnected": true +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseEmptyDto.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseEmptyDto.json @@ -0,0 +1 @@ +{} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseDto.json new file mode 100644 index 000000000..9815704d5 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseDto.json @@ -0,0 +1,4 @@ +{ + "swapped": true, + "swapPeriod": "SP24H" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json new file mode 100644 index 000000000..4ef301ba4 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json @@ -0,0 +1,7 @@ +{ + "error": { + "status": 100, + "title": "Feature Disabled", + "detail": "SimSwap feature is currently disabled." + } +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json new file mode 100644 index 000000000..792988b4c --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json @@ -0,0 +1,3 @@ +{ + "probability": "High" +} diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json @@ -0,0 +1 @@ +{} diff --git a/pom.xml b/pom.xml index 656cd3dda..021a0bf4d 100644 --- a/pom.xml +++ b/pom.xml @@ -262,6 +262,9 @@ openapi-contracts/src/test/resources + + sinch-sdk-mockserver + @@ -297,6 +300,7 @@ com.sinch.sdk.e2e.domains.sms.v1.SmsIT com.sinch.sdk.e2e.domains.voice.v1.VoiceIT com.sinch.sdk.e2e.domains.verification.v1.VerificationIT + com.sinch.sdk.e2e.domains.numberlookup.v2.NumberLookupIT