From d45c01be627ee49649d6e3f64d08701cb682ad35 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Fri, 17 Apr 2026 15:29:29 +0200 Subject: [PATCH 1/2] feat (Conversation/Consents): Support 'Consents' --- CHANGELOG.md | 7 + .../api/v1/ConversationService.java | 8 + .../api/v1/adapters/ConversationService.java | 20 ++ .../api/v1/adapters/ConsentsServiceTest.java | 205 ++++++++++++++++++ .../domains/conversation/ConsentsSteps.java | 70 ++++-- .../src/main/java/conversation/README.md | 3 + .../consents/ListAuditRecords.java | 53 +++++ .../conversation/consents/ListIdentities.java | 57 +++++ .../models/v1/consents/ConsentsDtoTest.java | 79 +++++++ .../v1/consents/AuditRecordsResponseDto.json | 15 ++ .../ConsentsListResponseDtoPage0.json | 11 + .../ConsentsListResponseDtoPage1.json | 8 + 12 files changed, 523 insertions(+), 13 deletions(-) create mode 100644 client/src/test/java/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceTest.java create mode 100644 examples/snippets/src/main/java/conversation/consents/ListAuditRecords.java create mode 100644 examples/snippets/src/main/java/conversation/consents/ListIdentities.java create mode 100644 openapi-contracts/src/test/java/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsDtoTest.java create mode 100644 openapi-contracts/src/test/resources/domains/conversation/v1/consents/AuditRecordsResponseDto.json create mode 100644 openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage0.json create mode 100644 openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage1.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 7683628b2..cfee36b11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,13 @@ All notable changes to the **Sinch Java SDK** are documented in this file. --- +## v2.1 – unreleased + +### Conversation +- **[feature]** Support `Consents` API: `listIdentities` and `listAuditRecords` endpoints + +--- + ## v2.0 – 2026-03-31 ### Major breaking changes with major release diff --git a/client/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationService.java b/client/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationService.java index dd36aec6c..d26ac5d4e 100644 --- a/client/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationService.java +++ b/client/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationService.java @@ -98,4 +98,12 @@ public interface ConversationService { * @since 2.0 */ TemplatesService templates(); + + /** + * Consents Service instance + * + * @return service instance for project + * @since 2.1 + */ + ConsentsService consents(); } diff --git a/client/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationService.java b/client/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationService.java index ce9c0160d..aa6ad3230 100644 --- a/client/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationService.java +++ b/client/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationService.java @@ -9,6 +9,7 @@ import com.sinch.sdk.core.utils.StringUtil; import com.sinch.sdk.domains.conversation.api.v1.AppsService; import com.sinch.sdk.domains.conversation.api.v1.CapabilityService; +import com.sinch.sdk.domains.conversation.api.v1.ConsentsService; import com.sinch.sdk.domains.conversation.api.v1.ContactsService; import com.sinch.sdk.domains.conversation.api.v1.ConversationsService; import com.sinch.sdk.domains.conversation.api.v1.EventDestinationsService; @@ -66,6 +67,7 @@ public class ConversationService private volatile Map authManagers; private volatile AppsService apps; + private volatile ConsentsService consents; private volatile ContactsService contacts; private volatile MessagesService messages; private volatile ConversationsService conversations; @@ -112,6 +114,24 @@ public AppsService apps() { return this.apps; } + public ConsentsService consents() { + if (null == this.consents) { + synchronized (this) { + if (null == this.consents) { + instanceLazyInit(); + this.consents = + new ConsentsServiceImpl( + httpClientSupplier.get(), + context.getServer(), + authManagers, + HttpMapper.getInstance(), + uriUUID); + } + } + } + return this.consents; + } + public ContactsService contacts() { if (null == this.contacts) { synchronized (this) { diff --git a/client/src/test/java/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceTest.java b/client/src/test/java/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceTest.java new file mode 100644 index 000000000..9d5c47eb2 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceTest.java @@ -0,0 +1,205 @@ +package com.sinch.sdk.domains.conversation.api.v1.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.URLParameter; +import com.sinch.sdk.core.http.URLParameter.STYLE; +import com.sinch.sdk.core.http.URLPathUtils; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.domains.conversation.api.v1.ConsentsService; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsDtoTest; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsListType; +import com.sinch.sdk.domains.conversation.models.v1.consents.Identity; +import com.sinch.sdk.domains.conversation.models.v1.consents.request.ConsentsListQueryParameters; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecordsResponse; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.ConsentsListResponse; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +@TestWithResources +class ConsentsServiceTest extends BaseTest { + + @Mock HttpClient httpClient; + @Mock ServerConfiguration serverConfiguration; + @Mock Map authManagers; + + static final String uriUUID = "foo"; + static final String APP_ID = "an app id"; + static final String IDENTITY = "an identity value"; + static final Collection AUTH_NAMES = Arrays.asList("Basic", "oAuth2"); + + ConsentsService service; + + @GivenTextResource("/domains/conversation/v1/consents/ConsentsListResponseDtoPage0.json") + String jsonConsentsListResponseDtoPage0; + + @GivenTextResource("/domains/conversation/v1/consents/ConsentsListResponseDtoPage1.json") + String jsonConsentsListResponseDtoPage1; + + @GivenTextResource("/domains/conversation/v1/consents/AuditRecordsResponseDto.json") + String jsonAuditRecordsResponseDto; + + @BeforeEach + public void initMocks() { + service = + new ConsentsServiceImpl( + httpClient, serverConfiguration, authManagers, HttpMapper.getInstance(), uriUUID); + } + + @Test + void listIdentities() throws ApiException { + + HttpRequest httpRequest1 = + new HttpRequest( + String.format( + "/v1/projects/%s/apps/%s/consents/%s", + URLPathUtils.encodePathSegment(uriUUID), + URLPathUtils.encodePathSegment(APP_ID), + URLPathUtils.encodePathSegment(ConsentsListType.OPT_OUT_ALL.toString())), + HttpMethod.GET, + Collections.emptyList(), + (String) null, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.emptyList(), + AUTH_NAMES); + HttpRequest httpRequest2 = + new HttpRequest( + String.format( + "/v1/projects/%s/apps/%s/consents/%s", + URLPathUtils.encodePathSegment(uriUUID), + URLPathUtils.encodePathSegment(APP_ID), + URLPathUtils.encodePathSegment(ConsentsListType.OPT_OUT_ALL.toString())), + HttpMethod.GET, + Collections.singletonList( + new URLParameter("page_token", "the next page token value", STYLE.FORM, true)), + (String) null, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.emptyList(), + AUTH_NAMES); + HttpResponse httpResponse1 = + new HttpResponse( + 200, null, Collections.emptyMap(), jsonConsentsListResponseDtoPage0.getBytes()); + HttpResponse httpResponse2 = + new HttpResponse( + 200, null, Collections.emptyMap(), jsonConsentsListResponseDtoPage1.getBytes()); + + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest1)))) + .thenReturn(httpResponse1); + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest2)))) + .thenReturn(httpResponse2); + + ConsentsListResponse response = service.listIdentities(APP_ID, ConsentsListType.OPT_OUT_ALL); + + Iterator iterator = response.iterator(); + + Assertions.assertThat(iterator.hasNext()).isEqualTo(true); + Identity item = iterator.next(); + TestHelpers.recursiveEquals(item, ConsentsDtoTest.expectedIdentityDto); + + item = iterator.next(); + TestHelpers.recursiveEquals( + item, Identity.builder().setIdentity("a 2nd identity value").build()); + Assertions.assertThat(iterator.hasNext()).isEqualTo(true); + + item = iterator.next(); + TestHelpers.recursiveEquals( + item, Identity.builder().setIdentity("a 3rd identity value").build()); + Assertions.assertThat(iterator.hasNext()).isEqualTo(false); + } + + @Test + void listIdentitiesWithQueryParameters() throws ApiException { + + HttpRequest httpRequest = + new HttpRequest( + String.format( + "/v1/projects/%s/apps/%s/consents/%s", + URLPathUtils.encodePathSegment(uriUUID), + URLPathUtils.encodePathSegment(APP_ID), + URLPathUtils.encodePathSegment(ConsentsListType.OPT_OUT_MARKETING.toString())), + HttpMethod.GET, + Collections.singletonList(new URLParameter("page_size", 5, STYLE.FORM, true)), + (String) null, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.emptyList(), + AUTH_NAMES); + HttpResponse httpResponse = + new HttpResponse( + 200, null, Collections.emptyMap(), jsonConsentsListResponseDtoPage1.getBytes()); + + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest)))) + .thenReturn(httpResponse); + + ConsentsListQueryParameters queryParams = + ConsentsListQueryParameters.builder().setPageSize(5).build(); + ConsentsListResponse response = + service.listIdentities(APP_ID, ConsentsListType.OPT_OUT_MARKETING, queryParams); + + Assertions.assertThat(response.getContent()).isNotEmpty(); + } + + @Test + void listAuditRecords() throws ApiException { + + HttpRequest httpRequest = + new HttpRequest( + String.format( + "/v1/projects/%s/apps/%s/consents/identities/%s", + URLPathUtils.encodePathSegment(uriUUID), + URLPathUtils.encodePathSegment(APP_ID), + URLPathUtils.encodePathSegment(IDENTITY)), + HttpMethod.GET, + Collections.emptyList(), + (String) null, + Collections.emptyMap(), + Collections.singletonList(HttpContentType.APPLICATION_JSON), + Collections.emptyList(), + AUTH_NAMES); + HttpResponse httpResponse = + new HttpResponse(200, null, Collections.emptyMap(), jsonAuditRecordsResponseDto.getBytes()); + + when(httpClient.invokeAPI( + eq(serverConfiguration), + eq(authManagers), + argThat(new HttpRequestMatcher(httpRequest)))) + .thenReturn(httpResponse); + + AuditRecordsResponse response = service.listAuditRecords(APP_ID, IDENTITY); + + TestHelpers.recursiveEquals(response, ConsentsDtoTest.expectedAuditRecordsResponseDto); + } +} diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/conversation/ConsentsSteps.java b/client/src/test/java/com/sinch/sdk/e2e/domains/conversation/ConsentsSteps.java index 8c04b3c41..8597f86aa 100644 --- a/client/src/test/java/com/sinch/sdk/e2e/domains/conversation/ConsentsSteps.java +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/conversation/ConsentsSteps.java @@ -1,57 +1,101 @@ package com.sinch.sdk.e2e.domains.conversation; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.domains.conversation.api.v1.ConsentsService; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsListType; +import com.sinch.sdk.domains.conversation.models.v1.consents.request.ConsentsListQueryParameters; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecord; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecordsResponse; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.ConsentsListResponse; +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.util.Iterator; +import org.junit.jupiter.api.Assertions; public class ConsentsSteps { + static final String APP_ID = AppsSteps.APP_ID; + static final String IDENTITY = "33612345678"; + + ConsentsService service; + ConsentsListResponse listPageResponse; + AuditRecordsResponse listAuditRecordsResponse; + @Given("^the Conversation service \"Consents\" is available$") public void serviceAvailable() { - // TODO implement conversation consents steps + service = Config.getSinchClient().conversation().v1().consents(); } @When("^I send a request to list the existing Consent Identities$") public void listPage() { - - // TODO implement conversation consents steps + ConsentsListQueryParameters queryParams = + ConsentsListQueryParameters.builder().setPageSize(10).build(); + listPageResponse = service.listIdentities(APP_ID, ConsentsListType.OPT_OUT_ALL, queryParams); } @When("^I send a request to list all the Consent Identities$") public void listAll() { - - // TODO implement conversation consents steps + ConsentsListQueryParameters queryParams = + ConsentsListQueryParameters.builder().setPageSize(10).build(); + listPageResponse = service.listIdentities(APP_ID, ConsentsListType.OPT_OUT_ALL, queryParams); } @When("^I iterate manually over the Consent Identities pages$") public void listIterateManually() { - - // TODO implement conversation consents steps + ConsentsListQueryParameters queryParams = + ConsentsListQueryParameters.builder().setPageSize(10).build(); + listPageResponse = service.listIdentities(APP_ID, ConsentsListType.OPT_OUT_ALL, queryParams); } @When("^I send a request to list the Audit Records associated with an identity$") public void listAuditRecords() { - - // TODO implement conversation consents steps + listAuditRecordsResponse = service.listAuditRecords(APP_ID, IDENTITY); } @Then("the response contains \"{int}\" Consent Identities") public void listPageResult(int count) { - // TODO implement conversation consents steps + Assertions.assertEquals(count, listPageResponse.getContent().size()); } @Then("the Consent Identities list contains \"{int}\" Consent Identities") public void listAllResult(int count) { - // TODO implement conversation consents steps + Iterator iterator = listPageResponse.iterator(); + TestHelpers.checkIteratorItems(iterator, count); } @Then("the Consent Identities iteration result contains the data from \"{int}\" pages") public void listPageIterateResult(int count) { - // TODO implement conversation consents steps + int pageCount = 0; + ConsentsListResponse currentPage = listPageResponse; + do { + pageCount++; + if (!currentPage.hasNextPage()) { + break; + } + currentPage = currentPage.nextPage(); + } while (true); + + Assertions.assertEquals(pageCount, count); } @Then("the response contains list of the Audit Records associated with an identity") public void listAuditRecordsResult() { - // TODO implement conversation consents steps + Assertions.assertNotNull(listAuditRecordsResponse); + Assertions.assertNotNull(listAuditRecordsResponse.getIdentity()); + Assertions.assertEquals("33612345678", listAuditRecordsResponse.getIdentity().getIdentity()); + + Assertions.assertNotNull(listAuditRecordsResponse.getAuditRecords()); + Assertions.assertEquals(1, listAuditRecordsResponse.getAuditRecords().size()); + + AuditRecord record = listAuditRecordsResponse.getAuditRecords().get(0); + Assertions.assertEquals(AuditRecord.OriginEnum.ORIGIN_MO, record.getOrigin()); + Assertions.assertEquals(AuditRecord.OperationEnum.OPERATION_INSERT, record.getOperation()); + Assertions.assertEquals(ConsentsListType.OPT_OUT_ALL, record.getListType()); + Assertions.assertEquals("123coffee-dada-beef-cafe-baadc0de5678", record.getProjectId()); + Assertions.assertEquals(APP_ID, record.getAppId()); + Assertions.assertEquals(Instant.parse("2025-06-06T14:42:56.031323Z"), record.getDatetime()); } } diff --git a/examples/snippets/src/main/java/conversation/README.md b/examples/snippets/src/main/java/conversation/README.md index c39413f40..161f1365f 100644 --- a/examples/snippets/src/main/java/conversation/README.md +++ b/examples/snippets/src/main/java/conversation/README.md @@ -11,6 +11,9 @@ See main [README.md](../../../../README.md) for how to execute snippets - [conversation/applications/Update](./applications/Update.java) - Capability - [conversation/capability/Capability](./capability/Capability.java) +- Consents + - [conversation/consents/ListIdentities](./consents/ListIdentities.java) + - [conversation/consents/ListAuditRecords](./consents/ListAuditRecords.java) - Contacts - [conversation/contacts/List](./contacts/List.java) - [conversation/contacts/Create](./contacts/Create.java) diff --git a/examples/snippets/src/main/java/conversation/consents/ListAuditRecords.java b/examples/snippets/src/main/java/conversation/consents/ListAuditRecords.java new file mode 100644 index 000000000..0663ce475 --- /dev/null +++ b/examples/snippets/src/main/java/conversation/consents/ListAuditRecords.java @@ -0,0 +1,53 @@ +/** + * Sinch Java Snippet + * + *

This snippet is available at https://github.com/sinch/sinch-sdk-java + * + *

See https://github.com/sinch/sinch-sdk-java/blob/main/examples/snippets/README.md for details + */ +package conversation.consents; + +import com.sinch.sdk.SinchClient; +import com.sinch.sdk.domains.conversation.api.v1.ConsentsService; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecordsResponse; +import com.sinch.sdk.models.Configuration; +import com.sinch.sdk.models.ConversationRegion; +import java.util.logging.Logger; +import utils.Settings; + +public class ListAuditRecords { + + private static final Logger LOGGER = Logger.getLogger(ListAuditRecords.class.getName()); + + public static void main(String[] args) { + + String projectId = Settings.getProjectId().orElse("MY_PROJECT_ID"); + String keyId = Settings.getKeyId().orElse("MY_KEY_ID"); + String keySecret = Settings.getKeySecret().orElse("MY_KEY_SECRET"); + String conversationRegion = Settings.getConversationRegion().orElse("MY_CONVERSATION_REGION"); + + // The ID of the Conversation App + String appId = "CONVERSATION_APP_ID"; + + // The identity to retrieve audit records for (e.g. a phone number) + String identity = "MY_IDENTITY"; + + Configuration configuration = + Configuration.builder() + .setProjectId(projectId) + .setKeyId(keyId) + .setKeySecret(keySecret) + .setConversationRegion(ConversationRegion.from(conversationRegion)) + .build(); + + SinchClient client = new SinchClient(configuration); + + ConsentsService consentsService = client.conversation().v1().consents(); + + LOGGER.info(String.format("List audit records for identity '%s' in app '%s'", identity, appId)); + + AuditRecordsResponse response = consentsService.listAuditRecords(appId, identity); + + LOGGER.info("Response: " + response); + } +} diff --git a/examples/snippets/src/main/java/conversation/consents/ListIdentities.java b/examples/snippets/src/main/java/conversation/consents/ListIdentities.java new file mode 100644 index 000000000..cbd0388be --- /dev/null +++ b/examples/snippets/src/main/java/conversation/consents/ListIdentities.java @@ -0,0 +1,57 @@ +/** + * Sinch Java Snippet + * + *

This snippet is available at https://github.com/sinch/sinch-sdk-java + * + *

See https://github.com/sinch/sinch-sdk-java/blob/main/examples/snippets/README.md for details + */ +package conversation.consents; + +import com.sinch.sdk.SinchClient; +import com.sinch.sdk.domains.conversation.api.v1.ConsentsService; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsListType; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.ConsentsListResponse; +import com.sinch.sdk.models.Configuration; +import com.sinch.sdk.models.ConversationRegion; +import java.util.logging.Logger; +import utils.Settings; + +public class ListIdentities { + + private static final Logger LOGGER = Logger.getLogger(ListIdentities.class.getName()); + + public static void main(String[] args) { + + String projectId = Settings.getProjectId().orElse("MY_PROJECT_ID"); + String keyId = Settings.getKeyId().orElse("MY_KEY_ID"); + String keySecret = Settings.getKeySecret().orElse("MY_KEY_SECRET"); + String conversationRegion = Settings.getConversationRegion().orElse("MY_CONVERSATION_REGION"); + + // The ID of the Conversation App + String appId = "CONVERSATION_APP_ID"; + + // The consent list type to query + ConsentsListType listType = ConsentsListType.OPT_OUT_ALL; + + Configuration configuration = + Configuration.builder() + .setProjectId(projectId) + .setKeyId(keyId) + .setKeySecret(keySecret) + .setConversationRegion(ConversationRegion.from(conversationRegion)) + .build(); + + SinchClient client = new SinchClient(configuration); + + ConsentsService consentsService = client.conversation().v1().consents(); + + LOGGER.info( + String.format("List identities from consent list '%s' for app '%s'", listType, appId)); + + ConsentsListResponse response = consentsService.listIdentities(appId, listType); + + LOGGER.info("Response: "); + + response.iterator().forEachRemaining(f -> LOGGER.info(f.toString())); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsDtoTest.java new file mode 100644 index 000000000..b9d25f487 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsDtoTest.java @@ -0,0 +1,79 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents; + +import com.adelean.inject.resources.junit.jupiter.GivenJsonResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.domains.conversation.api.v1.adapters.ConversationBaseTest; +import com.sinch.sdk.domains.conversation.models.v1.consents.internal.ConsentsListResponseInternal; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecord; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecordsResponse; +import java.time.Instant; +import java.util.Arrays; +import java.util.Collections; +import org.junit.jupiter.api.Test; + +@TestWithResources +public class ConsentsDtoTest extends ConversationBaseTest { + + @GivenJsonResource("/domains/conversation/v1/consents/ConsentsListResponseDtoPage0.json") + ConsentsListResponseInternal loadedConsentsListResponseDtoPage0; + + @GivenJsonResource("/domains/conversation/v1/consents/ConsentsListResponseDtoPage1.json") + ConsentsListResponseInternal loadedConsentsListResponseDtoPage1; + + @GivenJsonResource("/domains/conversation/v1/consents/AuditRecordsResponseDto.json") + AuditRecordsResponse loadedAuditRecordsResponseDto; + + public static Identity expectedIdentityDto = + Identity.builder().setIdentity("an identity value").build(); + + public static ConsentsListResponseInternal expectedConsentsListResponseDtoPage0 = + ConsentsListResponseInternal.builder() + .setIdentities( + Arrays.asList( + expectedIdentityDto, + Identity.builder().setIdentity("a 2nd identity value").build())) + .setNextPageToken("the next page token value") + .build(); + + public static ConsentsListResponseInternal expectedConsentsListResponseDtoPage1 = + ConsentsListResponseInternal.builder() + .setIdentities( + Collections.singletonList( + Identity.builder().setIdentity("a 3rd identity value").build())) + .setNextPageToken("") + .build(); + + public static AuditRecord expectedAuditRecordDto = + AuditRecord.builder() + .setOrigin(AuditRecord.OriginEnum.ORIGIN_API) + .setOperation(AuditRecord.OperationEnum.OPERATION_INSERT) + .setListType(ConsentsListType.OPT_OUT_ALL) + .setProjectId("a project id") + .setAppId("an app id") + .setDatetime(Instant.parse("2025-06-06T14:42:56.031323Z")) + .build(); + + public static AuditRecordsResponse expectedAuditRecordsResponseDto = + AuditRecordsResponse.builder() + .setIdentity(expectedIdentityDto) + .setAuditRecords(Collections.singletonList(expectedAuditRecordDto)) + .build(); + + @Test + void deserializeConsentsListResponseDtoPage0() { + TestHelpers.recursiveEquals( + loadedConsentsListResponseDtoPage0, expectedConsentsListResponseDtoPage0); + } + + @Test + void deserializeConsentsListResponseDtoPage1() { + TestHelpers.recursiveEquals( + loadedConsentsListResponseDtoPage1, expectedConsentsListResponseDtoPage1); + } + + @Test + void deserializeAuditRecordsResponseDto() { + TestHelpers.recursiveEquals(loadedAuditRecordsResponseDto, expectedAuditRecordsResponseDto); + } +} diff --git a/openapi-contracts/src/test/resources/domains/conversation/v1/consents/AuditRecordsResponseDto.json b/openapi-contracts/src/test/resources/domains/conversation/v1/consents/AuditRecordsResponseDto.json new file mode 100644 index 000000000..186d70673 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/conversation/v1/consents/AuditRecordsResponseDto.json @@ -0,0 +1,15 @@ +{ + "identity": { + "identity": "an identity value" + }, + "audit_records": [ + { + "origin": "ORIGIN_API", + "operation": "OPERATION_INSERT", + "list_type": "OPT_OUT_ALL", + "project_id": "a project id", + "app_id": "an app id", + "datetime": "2025-06-06T14:42:56.031323Z" + } + ] +} diff --git a/openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage0.json b/openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage0.json new file mode 100644 index 000000000..8bcaa092d --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage0.json @@ -0,0 +1,11 @@ +{ + "identities": [ + { + "identity": "an identity value" + }, + { + "identity": "a 2nd identity value" + } + ], + "next_page_token": "the next page token value" +} diff --git a/openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage1.json b/openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage1.json new file mode 100644 index 000000000..171b46a24 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/conversation/v1/consents/ConsentsListResponseDtoPage1.json @@ -0,0 +1,8 @@ +{ + "identities": [ + { + "identity": "a 3rd identity value" + } + ], + "next_page_token": "" +} From d605410e8a66af14535a0a1b26a256bdbe85192d Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Fri, 17 Apr 2026 15:47:57 +0200 Subject: [PATCH 2/2] feat (Conversation/Consents): API contract --- .../conversation/api/v1/ConsentsService.java | 68 +++++ .../api/v1/adapters/ConsentsServiceImpl.java | 271 ++++++++++++++++++ .../models/v1/consents/ConsentsListType.java | 47 +++ .../models/v1/consents/Identity.java | 56 ++++ .../models/v1/consents/IdentityImpl.java | 90 ++++++ .../ConsentsListResponseInternal.java | 72 +++++ .../ConsentsListResponseInternalImpl.java | 122 ++++++++ .../request/ConsentsListQueryParameters.java | 78 +++++ .../ConsentsListQueryParametersImpl.java | 94 ++++++ .../v1/consents/response/AuditRecord.java | 211 ++++++++++++++ .../v1/consents/response/AuditRecordImpl.java | 230 +++++++++++++++ .../response/AuditRecordsResponse.java | 72 +++++ .../response/AuditRecordsResponseImpl.java | 121 ++++++++ .../response/ConsentsListResponse.java | 59 ++++ 14 files changed, 1591 insertions(+) create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConsentsService.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceImpl.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsListType.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/Identity.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/IdentityImpl.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternal.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternalImpl.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParameters.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParametersImpl.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecord.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordImpl.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponse.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponseImpl.java create mode 100644 openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/ConsentsListResponse.java diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConsentsService.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConsentsService.java new file mode 100644 index 000000000..4e70cfb3b --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConsentsService.java @@ -0,0 +1,68 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.api.v1; + +import com.sinch.sdk.core.exceptions.ApiException; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsListType; +import com.sinch.sdk.domains.conversation.models.v1.consents.request.ConsentsListQueryParameters; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecordsResponse; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.ConsentsListResponse; + +/** Consents Service */ +public interface ConsentsService { + + /** + * Get audit records from consent lists + * + *

Get all audit records associated with the given identity from the consent lists within the + * specified project and app. + * + * @param appId The unique ID of the app. You can find this on the [Sinch + * Dashboard](https://dashboard.sinch.com/convapi/apps). (required) + * @param identity An identity to use on Consent audit records queries. (required) + * @return AuditRecordsResponse + * @throws ApiException if fails to make API call + */ + AuditRecordsResponse listAuditRecords(String appId, String identity) throws ApiException; + + /** + * Get identities from consent list (using default parameters) + * + *

Get all identities contained within a consent list for a given project id, app id, and list + * type. + * + * @param appId The unique ID of the app. You can find this on the [Sinch + * Dashboard](https://dashboard.sinch.com/convapi/apps). (required) + * @param listType The consent list type. One of `OPT_OUT_ALL`, + * `OPT_OUT_MARKETING`, and or `OPT_OUT_NOTIFICATION`. (required) + * @return ConsentsListResponse + * @throws ApiException if fails to make API call + */ + ConsentsListResponse listIdentities(String appId, ConsentsListType listType) throws ApiException; + + /** + * Get identities from consent list + * + *

Get all identities contained within a consent list for a given project id, app id, and list + * type. + * + * @param appId The unique ID of the app. You can find this on the [Sinch + * Dashboard](https://dashboard.sinch.com/convapi/apps). (required) + * @param listType The consent list type. One of `OPT_OUT_ALL`, + * `OPT_OUT_MARKETING`, and or `OPT_OUT_NOTIFICATION`. (required) + * @param queryParameter (optional) + * @return ConsentsListResponse + * @throws ApiException if fails to make API call + */ + ConsentsListResponse listIdentities( + String appId, ConsentsListType listType, ConsentsListQueryParameters queryParameter) + throws ApiException; +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceImpl.java new file mode 100644 index 000000000..20e4017c1 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConsentsServiceImpl.java @@ -0,0 +1,271 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.api.v1.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.URLParameterUtils; +import com.sinch.sdk.core.http.URLPathUtils; +import com.sinch.sdk.core.models.ServerConfiguration; +import com.sinch.sdk.core.models.pagination.Page; +import com.sinch.sdk.core.models.pagination.PageNavigator; +import com.sinch.sdk.core.utils.StringUtil; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsListType; +import com.sinch.sdk.domains.conversation.models.v1.consents.internal.ConsentsListResponseInternal; +import com.sinch.sdk.domains.conversation.models.v1.consents.request.ConsentsListQueryParameters; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.AuditRecordsResponse; +import com.sinch.sdk.domains.conversation.models.v1.consents.response.ConsentsListResponse; +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.function.Function; +import java.util.logging.Logger; + +public class ConsentsServiceImpl + implements com.sinch.sdk.domains.conversation.api.v1.ConsentsService { + + private static final Logger LOGGER = Logger.getLogger(ConsentsServiceImpl.class.getName()); + private final HttpClient httpClient; + private final ServerConfiguration serverConfiguration; + private final Map authManagersByOasSecuritySchemes; + private final HttpMapper mapper; + + private final String projectId; + + public ConsentsServiceImpl( + 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 AuditRecordsResponse listAuditRecords(String appId, String identity) throws ApiException { + + LOGGER.finest("[listAuditRecords]" + " " + "appId: " + appId + ", " + "identity: " + identity); + + HttpRequest httpRequest = listAuditRecordsRequestBuilder(appId, identity); + 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 listAuditRecordsRequestBuilder(String appId, String identity) + 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 listAuditRecords"); + } + // verify the required parameter 'appId' is set + if (appId == null) { + throw new ApiException( + 400, "Missing the required parameter 'appId' when calling listAuditRecords"); + } + // verify the required parameter 'identity' is set + if (identity == null) { + throw new ApiException( + 400, "Missing the required parameter 'identity' when calling listAuditRecords"); + } + + String localVarPath = + "/v1/projects/{project_id}/apps/{app_id}/consents/identities/{identity}" + .replaceAll( + "\\{" + "project_id" + "\\}", + URLPathUtils.encodePathSegment(this.projectId.toString())) + .replaceAll("\\{" + "app_id" + "\\}", URLPathUtils.encodePathSegment(appId.toString())) + .replaceAll( + "\\{" + "identity" + "\\}", URLPathUtils.encodePathSegment(identity.toString())); + + List localVarQueryParams = new ArrayList<>(); + + Map localVarHeaderParams = new HashMap<>(); + + final Collection localVarAccepts = Arrays.asList("application/json"); + + final Collection localVarContentTypes = Arrays.asList(); + + final Collection localVarAuthNames = Arrays.asList("Basic", "oAuth2"); + final String serializedBody = null; + + return new HttpRequest( + localVarPath, + HttpMethod.GET, + localVarQueryParams, + serializedBody, + localVarHeaderParams, + localVarAccepts, + localVarContentTypes, + localVarAuthNames); + } + + @Override + public ConsentsListResponse listIdentities(String appId, ConsentsListType listType) + throws ApiException { + return listIdentities(appId, listType, (ConsentsListQueryParameters) null); + } + + @Override + public ConsentsListResponse listIdentities( + String appId, ConsentsListType listType, ConsentsListQueryParameters queryParameter) + throws ApiException { + + LOGGER.finest( + "[listIdentities]" + + " " + + "appId: " + + appId + + ", " + + "listType: " + + listType + + ", " + + "queryParameter: " + + queryParameter); + + HttpRequest httpRequest = listIdentitiesRequestBuilder(appId, listType, queryParameter); + return _fetchListIdentitiesPage( + (queryParameters) -> listIdentitiesRequestBuilder(appId, listType, queryParameters), + queryParameter, + httpRequest); + } + + private ConsentsListResponse _fetchListIdentitiesPage( + Function requestBuilder, + ConsentsListQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { + HttpResponse response = + httpClient.invokeAPI( + this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); + + if (HttpStatus.isSuccessfulStatus(response.getCode())) { + + ConsentsListResponseInternal deserialized = + mapper.deserialize(response, new TypeReference() {}); + + String nextToken = deserialized.getNextPageToken(); + + ConsentsListQueryParameters nextParameters = + ConsentsListQueryParameters.builder(queryParameter).setPageToken(nextToken).build(); + + final HttpRequest nextHttpRequest = + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; + + return new ConsentsListResponse( + () -> _fetchListIdentitiesPage(requestBuilder, nextParameters, nextHttpRequest), + new Page<>(deserialized.getIdentities(), new PageNavigator<>(nextHttpRequest))); + } + // 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 listIdentitiesRequestBuilder( + String appId, ConsentsListType listType, ConsentsListQueryParameters queryParameter) + 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 listIdentities"); + } + // verify the required parameter 'appId' is set + if (appId == null) { + throw new ApiException( + 400, "Missing the required parameter 'appId' when calling listIdentities"); + } + // verify the required parameter 'listType' is set + if (listType == null) { + throw new ApiException( + 400, "Missing the required parameter 'listType' when calling listIdentities"); + } + + String localVarPath = + "/v1/projects/{project_id}/apps/{app_id}/consents/{list_type}" + .replaceAll( + "\\{" + "project_id" + "\\}", + URLPathUtils.encodePathSegment(this.projectId.toString())) + .replaceAll("\\{" + "app_id" + "\\}", URLPathUtils.encodePathSegment(appId.toString())) + .replaceAll( + "\\{" + "list_type" + "\\}", URLPathUtils.encodePathSegment(listType.toString())); + + List localVarQueryParams = new ArrayList<>(); + if (null != queryParameter) { + + URLParameterUtils.addQueryParam( + queryParameter.getPageSize(), + "page_size", + URLParameter.form, + null, + localVarQueryParams, + true); + + URLParameterUtils.addQueryParam( + queryParameter.getPageToken(), + "page_token", + URLParameter.form, + null, + localVarQueryParams, + true); + } + + Map localVarHeaderParams = new HashMap<>(); + + final Collection localVarAccepts = Arrays.asList("application/json"); + + final Collection localVarContentTypes = Arrays.asList(); + + final Collection localVarAuthNames = Arrays.asList("Basic", "oAuth2"); + final String serializedBody = null; + + return new HttpRequest( + localVarPath, + HttpMethod.GET, + localVarQueryParams, + serializedBody, + localVarHeaderParams, + localVarAccepts, + localVarContentTypes, + localVarAuthNames); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsListType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsListType.java new file mode 100644 index 000000000..45a29e214 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/ConsentsListType.java @@ -0,0 +1,47 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents; + +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import java.util.Arrays; +import java.util.stream.Stream; + +/** + * The consent list type. See consent management + * page for more information. + */ +public class ConsentsListType extends EnumDynamic { + + /** List type that blocks all kinds of messages */ + public static final ConsentsListType OPT_OUT_ALL = new ConsentsListType("OPT_OUT_ALL"); + + /** List type that blocks only marketing messages */ + public static final ConsentsListType OPT_OUT_MARKETING = + new ConsentsListType("OPT_OUT_MARKETING"); + + /** List type that blocks only notification messages */ + public static final ConsentsListType OPT_OUT_NOTIFICATION = + new ConsentsListType("OPT_OUT_NOTIFICATION"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + ConsentsListType.class, + ConsentsListType::new, + Arrays.asList(OPT_OUT_ALL, OPT_OUT_MARKETING, OPT_OUT_NOTIFICATION)); + + private ConsentsListType(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static ConsentsListType from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(ConsentsListType e) { + return ENUM_SUPPORT.valueOf(e); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/Identity.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/Identity.java new file mode 100644 index 000000000..b04f75e05 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/Identity.java @@ -0,0 +1,56 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.models.v1.consents; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +/** Represents a identity from the Conversation API. */ +@JsonDeserialize(builder = IdentityImpl.Builder.class) +public interface Identity { + + /** + * The identity from Conversation API. + * + *

Field is required + * + * @return identity + */ + String getIdentity(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new IdentityImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param identity see getter + * @return Current builder + * @see #getIdentity + */ + Builder setIdentity(String identity); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + Identity build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/IdentityImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/IdentityImpl.java new file mode 100644 index 000000000..4d28c5203 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/IdentityImpl.java @@ -0,0 +1,90 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents; + +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({IdentityImpl.JSON_PROPERTY_IDENTITY}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class IdentityImpl implements Identity { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_IDENTITY = "identity"; + + private OptionalValue identity; + + public IdentityImpl() {} + + protected IdentityImpl(OptionalValue identity) { + this.identity = identity; + } + + @JsonIgnore + public String getIdentity() { + return identity.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_IDENTITY) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue identity() { + return identity; + } + + /** Return true if this Identity object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + IdentityImpl identity = (IdentityImpl) o; + return Objects.equals(this.identity, identity.identity); + } + + @Override + public int hashCode() { + return Objects.hash(identity); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class IdentityImpl {\n"); + sb.append(" identity: ").append(toIndentedString(identity)).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 Identity.Builder { + OptionalValue identity = OptionalValue.empty(); + + @JsonProperty(value = JSON_PROPERTY_IDENTITY, required = true) + public Builder setIdentity(String identity) { + this.identity = OptionalValue.of(identity); + return this; + } + + public Identity build() { + return new IdentityImpl(identity); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternal.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternal.java new file mode 100644 index 000000000..39dc2aa6e --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternal.java @@ -0,0 +1,72 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.models.v1.consents.internal; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.conversation.models.v1.consents.Identity; +import java.util.List; + +/** ConsentsListResponseInternal */ +@JsonDeserialize(builder = ConsentsListResponseInternalImpl.Builder.class) +public interface ConsentsListResponseInternal { + + /** + * List of identities belonging to a specific project ID, app ID, and list type + * + * @return identities + */ + List getIdentities(); + + /** + * Token for the next page of the search, to be used in the next call. + * + * @return nextPageToken + */ + String getNextPageToken(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new ConsentsListResponseInternalImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param identities see getter + * @return Current builder + * @see #getIdentities + */ + Builder setIdentities(List identities); + + /** + * see getter + * + * @param nextPageToken see getter + * @return Current builder + * @see #getNextPageToken + */ + Builder setNextPageToken(String nextPageToken); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + ConsentsListResponseInternal build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternalImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternalImpl.java new file mode 100644 index 000000000..13dddc29c --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/internal/ConsentsListResponseInternalImpl.java @@ -0,0 +1,122 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents.internal; + +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.conversation.models.v1.consents.Identity; +import java.util.List; +import java.util.Objects; + +@JsonPropertyOrder({ + ConsentsListResponseInternalImpl.JSON_PROPERTY_IDENTITIES, + ConsentsListResponseInternalImpl.JSON_PROPERTY_NEXT_PAGE_TOKEN +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class ConsentsListResponseInternalImpl implements ConsentsListResponseInternal { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_IDENTITIES = "identities"; + + private OptionalValue> identities; + + public static final String JSON_PROPERTY_NEXT_PAGE_TOKEN = "next_page_token"; + + private OptionalValue nextPageToken; + + public ConsentsListResponseInternalImpl() {} + + protected ConsentsListResponseInternalImpl( + OptionalValue> identities, OptionalValue nextPageToken) { + this.identities = identities; + this.nextPageToken = nextPageToken; + } + + @JsonIgnore + public List getIdentities() { + return identities.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_IDENTITIES) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue> identities() { + return identities; + } + + @JsonIgnore + public String getNextPageToken() { + return nextPageToken.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_NEXT_PAGE_TOKEN) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue nextPageToken() { + return nextPageToken; + } + + /** Return true if this GetIdentitiesFromConsentResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ConsentsListResponseInternalImpl getIdentitiesFromConsentResponse = + (ConsentsListResponseInternalImpl) o; + return Objects.equals(this.identities, getIdentitiesFromConsentResponse.identities) + && Objects.equals(this.nextPageToken, getIdentitiesFromConsentResponse.nextPageToken); + } + + @Override + public int hashCode() { + return Objects.hash(identities, nextPageToken); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ConsentsListResponseInternalImpl {\n"); + sb.append(" identities: ").append(toIndentedString(identities)).append("\n"); + sb.append(" nextPageToken: ").append(toIndentedString(nextPageToken)).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 ConsentsListResponseInternal.Builder { + OptionalValue> identities = OptionalValue.empty(); + OptionalValue nextPageToken = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_IDENTITIES) + public Builder setIdentities(List identities) { + this.identities = OptionalValue.of(identities); + return this; + } + + @JsonProperty(JSON_PROPERTY_NEXT_PAGE_TOKEN) + public Builder setNextPageToken(String nextPageToken) { + this.nextPageToken = OptionalValue.of(nextPageToken); + return this; + } + + public ConsentsListResponseInternal build() { + return new ConsentsListResponseInternalImpl(identities, nextPageToken); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParameters.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParameters.java new file mode 100644 index 000000000..6dfa04a86 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParameters.java @@ -0,0 +1,78 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.models.v1.consents.request; + +import com.sinch.sdk.core.models.OptionalValue; + +/** ConsentsListQueryParameters */ +public interface ConsentsListQueryParameters { + + /** + * Get pageSize + * + * @return pageSize + */ + OptionalValue getPageSize(); + + /** + * Get pageToken + * + * @return pageToken + */ + OptionalValue getPageToken(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new ConsentsListQueryParametersImpl.Builder(); + } + + /** + * Getting builder from existing instance + * + * @return New Builder instance + */ + static Builder builder(ConsentsListQueryParameters parameters) { + return new ConsentsListQueryParametersImpl.Builder(parameters); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param pageSize see getter + * @return Current builder + * @see #getPageSize + */ + Builder setPageSize(Integer pageSize); + + /** + * see getter + * + * @param pageToken see getter + * @return Current builder + * @see #getPageToken + */ + Builder setPageToken(String pageToken); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + ConsentsListQueryParameters build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParametersImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParametersImpl.java new file mode 100644 index 000000000..f2077f61a --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/request/ConsentsListQueryParametersImpl.java @@ -0,0 +1,94 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents.request; + +import com.sinch.sdk.core.models.OptionalValue; +import java.util.Objects; + +public class ConsentsListQueryParametersImpl implements ConsentsListQueryParameters { + + private final OptionalValue pageSize; + private final OptionalValue pageToken; + + private ConsentsListQueryParametersImpl( + OptionalValue pageSize, OptionalValue pageToken) { + this.pageSize = pageSize; + this.pageToken = pageToken; + } + + public OptionalValue getPageSize() { + return pageSize; + } + + public OptionalValue getPageToken() { + return pageToken; + } + + /** Return true if this ConsentsGetConsentsQueryParameters object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ConsentsListQueryParametersImpl consentsGetConsentsQueryParameters = + (ConsentsListQueryParametersImpl) o; + return Objects.equals(this.pageSize, consentsGetConsentsQueryParameters.pageSize) + && Objects.equals(this.pageToken, consentsGetConsentsQueryParameters.pageToken); + } + + @Override + public int hashCode() { + return Objects.hash(pageSize, pageToken); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ConsentsListQueryParametersImpl {\n"); + sb.append(" pageSize: ").append(toIndentedString(pageSize)).append("\n"); + sb.append(" pageToken: ").append(toIndentedString(pageToken)).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 "); + } + + static class Builder implements ConsentsListQueryParameters.Builder { + OptionalValue pageSize = OptionalValue.empty(); + OptionalValue pageToken = OptionalValue.empty(); + + protected Builder() {} + + protected Builder(ConsentsListQueryParameters _parameters) { + if (null == _parameters) { + return; + } + ConsentsListQueryParametersImpl parameters = (ConsentsListQueryParametersImpl) _parameters; + this.pageSize = parameters.getPageSize(); + this.pageToken = parameters.getPageToken(); + } + + public Builder setPageSize(Integer pageSize) { + this.pageSize = OptionalValue.of(pageSize); + return this; + } + + public Builder setPageToken(String pageToken) { + this.pageToken = OptionalValue.of(pageToken); + return this; + } + + public ConsentsListQueryParameters build() { + return new ConsentsListQueryParametersImpl(pageSize, pageToken); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecord.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecord.java new file mode 100644 index 000000000..a4fb5c34f --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecord.java @@ -0,0 +1,211 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.models.v1.consents.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import com.sinch.sdk.domains.conversation.models.v1.consents.ConsentsListType; +import java.time.Instant; +import java.util.Arrays; +import java.util.stream.Stream; + +/** Represents a consent audit record from the Conversation API. */ +@JsonDeserialize(builder = AuditRecordImpl.Builder.class) +public interface AuditRecord { + + /** + * The origin from the opt-out or opt-in. This could be the Batch API or an MO (when matched with + * an end-user MO). + */ + public class OriginEnum extends EnumDynamic { + public static final OriginEnum ORIGIN_API = new OriginEnum("ORIGIN_API"); + public static final OriginEnum ORIGIN_MO = new OriginEnum("ORIGIN_MO"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + OriginEnum.class, OriginEnum::new, Arrays.asList(ORIGIN_API, ORIGIN_MO)); + + private OriginEnum(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static OriginEnum from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(OriginEnum e) { + return ENUM_SUPPORT.valueOf(e); + } + } + + /** + * The origin from the opt-out or opt-in. This could be the Batch API or an MO (when matched with + * an end-user MO). + * + *

Field is required + * + * @return origin + */ + OriginEnum getOrigin(); + + /** The operation that the audit record refers to. Can be INSERT, UPDATE or DELETE. */ + public class OperationEnum extends EnumDynamic { + public static final OperationEnum OPERATION_INSERT = new OperationEnum("OPERATION_INSERT"); + public static final OperationEnum OPERATION_UPDATE = new OperationEnum("OPERATION_UPDATE"); + public static final OperationEnum OPERATION_DELETE = new OperationEnum("OPERATION_DELETE"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>( + OperationEnum.class, + OperationEnum::new, + Arrays.asList(OPERATION_INSERT, OPERATION_UPDATE, OPERATION_DELETE)); + + private OperationEnum(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static OperationEnum from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(OperationEnum e) { + return ENUM_SUPPORT.valueOf(e); + } + } + + /** + * The operation that the audit record refers to. Can be INSERT, UPDATE or DELETE. + * + *

Field is required + * + * @return operation + */ + OperationEnum getOperation(); + + /** + * The list type of the consent list the audit record refers to. + * + *

Field is required + * + * @return listType + */ + ConsentsListType getListType(); + + /** + * The project ID associated with the consent list the audit record refers to. + * + *

Field is required + * + * @return projectId + */ + String getProjectId(); + + /** + * The app ID associated with the consent list the audit record refers to. + * + *

Field is required + * + * @return appId + */ + String getAppId(); + + /** + * Datetime of when the consent list audit record happened. + * + *

Field is required + * + * @return datetime + */ + Instant getDatetime(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new AuditRecordImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param origin see getter + * @return Current builder + * @see #getOrigin + */ + Builder setOrigin(OriginEnum origin); + + /** + * see getter + * + * @param operation see getter + * @return Current builder + * @see #getOperation + */ + Builder setOperation(OperationEnum operation); + + /** + * see getter + * + * @param listType see getter + * @return Current builder + * @see #getListType + */ + Builder setListType(ConsentsListType listType); + + /** + * see getter + * + * @param projectId see getter + * @return Current builder + * @see #getProjectId + */ + Builder setProjectId(String projectId); + + /** + * see getter + * + * @param appId see getter + * @return Current builder + * @see #getAppId + */ + Builder setAppId(String appId); + + /** + * see getter + * + * @param datetime see getter + * @return Current builder + * @see #getDatetime + */ + Builder setDatetime(Instant datetime); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + AuditRecord build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordImpl.java new file mode 100644 index 000000000..3bab79796 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordImpl.java @@ -0,0 +1,230 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents.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.conversation.models.v1.consents.ConsentsListType; +import java.time.Instant; +import java.util.Objects; + +@JsonPropertyOrder({ + AuditRecordImpl.JSON_PROPERTY_ORIGIN, + AuditRecordImpl.JSON_PROPERTY_OPERATION, + AuditRecordImpl.JSON_PROPERTY_LIST_TYPE, + AuditRecordImpl.JSON_PROPERTY_PROJECT_ID, + AuditRecordImpl.JSON_PROPERTY_APP_ID, + AuditRecordImpl.JSON_PROPERTY_DATETIME +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class AuditRecordImpl implements AuditRecord { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_ORIGIN = "origin"; + + private OptionalValue origin; + + public static final String JSON_PROPERTY_OPERATION = "operation"; + + private OptionalValue operation; + + public static final String JSON_PROPERTY_LIST_TYPE = "list_type"; + + private OptionalValue listType; + + public static final String JSON_PROPERTY_PROJECT_ID = "project_id"; + + private OptionalValue projectId; + + public static final String JSON_PROPERTY_APP_ID = "app_id"; + + private OptionalValue appId; + + public static final String JSON_PROPERTY_DATETIME = "datetime"; + + private OptionalValue datetime; + + public AuditRecordImpl() {} + + protected AuditRecordImpl( + OptionalValue origin, + OptionalValue operation, + OptionalValue listType, + OptionalValue projectId, + OptionalValue appId, + OptionalValue datetime) { + this.origin = origin; + this.operation = operation; + this.listType = listType; + this.projectId = projectId; + this.appId = appId; + this.datetime = datetime; + } + + @JsonIgnore + public OriginEnum getOrigin() { + return origin.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_ORIGIN) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue origin() { + return origin; + } + + @JsonIgnore + public OperationEnum getOperation() { + return operation.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_OPERATION) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue operation() { + return operation; + } + + @JsonIgnore + public ConsentsListType getListType() { + return listType.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_LIST_TYPE) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue listType() { + return listType; + } + + @JsonIgnore + public String getProjectId() { + return projectId.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_PROJECT_ID) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue projectId() { + return projectId; + } + + @JsonIgnore + public String getAppId() { + return appId.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_APP_ID) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue appId() { + return appId; + } + + @JsonIgnore + public Instant getDatetime() { + return datetime.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_DATETIME) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public OptionalValue datetime() { + return datetime; + } + + /** Return true if this AuditRecord object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuditRecordImpl auditRecord = (AuditRecordImpl) o; + return Objects.equals(this.origin, auditRecord.origin) + && Objects.equals(this.operation, auditRecord.operation) + && Objects.equals(this.listType, auditRecord.listType) + && Objects.equals(this.projectId, auditRecord.projectId) + && Objects.equals(this.appId, auditRecord.appId) + && Objects.equals(this.datetime, auditRecord.datetime); + } + + @Override + public int hashCode() { + return Objects.hash(origin, operation, listType, projectId, appId, datetime); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AuditRecordImpl {\n"); + sb.append(" origin: ").append(toIndentedString(origin)).append("\n"); + sb.append(" operation: ").append(toIndentedString(operation)).append("\n"); + sb.append(" listType: ").append(toIndentedString(listType)).append("\n"); + sb.append(" projectId: ").append(toIndentedString(projectId)).append("\n"); + sb.append(" appId: ").append(toIndentedString(appId)).append("\n"); + sb.append(" datetime: ").append(toIndentedString(datetime)).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 AuditRecord.Builder { + OptionalValue origin = OptionalValue.empty(); + OptionalValue operation = OptionalValue.empty(); + OptionalValue listType = OptionalValue.empty(); + OptionalValue projectId = OptionalValue.empty(); + OptionalValue appId = OptionalValue.empty(); + OptionalValue datetime = OptionalValue.empty(); + + @JsonProperty(value = JSON_PROPERTY_ORIGIN, required = true) + public Builder setOrigin(OriginEnum origin) { + this.origin = OptionalValue.of(origin); + return this; + } + + @JsonProperty(value = JSON_PROPERTY_OPERATION, required = true) + public Builder setOperation(OperationEnum operation) { + this.operation = OptionalValue.of(operation); + return this; + } + + @JsonProperty(value = JSON_PROPERTY_LIST_TYPE, required = true) + public Builder setListType(ConsentsListType listType) { + this.listType = OptionalValue.of(listType); + return this; + } + + @JsonProperty(value = JSON_PROPERTY_PROJECT_ID, required = true) + public Builder setProjectId(String projectId) { + this.projectId = OptionalValue.of(projectId); + return this; + } + + @JsonProperty(value = JSON_PROPERTY_APP_ID, required = true) + public Builder setAppId(String appId) { + this.appId = OptionalValue.of(appId); + return this; + } + + @JsonProperty(value = JSON_PROPERTY_DATETIME, required = true) + public Builder setDatetime(Instant datetime) { + this.datetime = OptionalValue.of(datetime); + return this; + } + + public AuditRecord build() { + return new AuditRecordImpl(origin, operation, listType, projectId, appId, datetime); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponse.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponse.java new file mode 100644 index 000000000..3ad8a1753 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponse.java @@ -0,0 +1,72 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.models.v1.consents.response; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.conversation.models.v1.consents.Identity; +import java.util.List; + +/** AuditRecordsResponse */ +@JsonDeserialize(builder = AuditRecordsResponseImpl.Builder.class) +public interface AuditRecordsResponse { + + /** + * Get identity + * + * @return identity + */ + Identity getIdentity(); + + /** + * List of audit records associated with the given identity + * + * @return auditRecords + */ + List getAuditRecords(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new AuditRecordsResponseImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param identity see getter + * @return Current builder + * @see #getIdentity + */ + Builder setIdentity(Identity identity); + + /** + * see getter + * + * @param auditRecords see getter + * @return Current builder + * @see #getAuditRecords + */ + Builder setAuditRecords(List auditRecords); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + AuditRecordsResponse build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponseImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponseImpl.java new file mode 100644 index 000000000..fdba1bd1a --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/AuditRecordsResponseImpl.java @@ -0,0 +1,121 @@ +package com.sinch.sdk.domains.conversation.models.v1.consents.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.conversation.models.v1.consents.Identity; +import java.util.List; +import java.util.Objects; + +@JsonPropertyOrder({ + AuditRecordsResponseImpl.JSON_PROPERTY_IDENTITY, + AuditRecordsResponseImpl.JSON_PROPERTY_AUDIT_RECORDS +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class AuditRecordsResponseImpl implements AuditRecordsResponse { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_IDENTITY = "identity"; + + private OptionalValue identity; + + public static final String JSON_PROPERTY_AUDIT_RECORDS = "audit_records"; + + private OptionalValue> auditRecords; + + public AuditRecordsResponseImpl() {} + + protected AuditRecordsResponseImpl( + OptionalValue identity, OptionalValue> auditRecords) { + this.identity = identity; + this.auditRecords = auditRecords; + } + + @JsonIgnore + public Identity getIdentity() { + return identity.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_IDENTITY) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue identity() { + return identity; + } + + @JsonIgnore + public List getAuditRecords() { + return auditRecords.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_AUDIT_RECORDS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue> auditRecords() { + return auditRecords; + } + + /** Return true if this GetAuditRecordsFromConsentResponse object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuditRecordsResponseImpl getAuditRecordsFromConsentResponse = (AuditRecordsResponseImpl) o; + return Objects.equals(this.identity, getAuditRecordsFromConsentResponse.identity) + && Objects.equals(this.auditRecords, getAuditRecordsFromConsentResponse.auditRecords); + } + + @Override + public int hashCode() { + return Objects.hash(identity, auditRecords); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AuditRecordsResponseImpl {\n"); + sb.append(" identity: ").append(toIndentedString(identity)).append("\n"); + sb.append(" auditRecords: ").append(toIndentedString(auditRecords)).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 AuditRecordsResponse.Builder { + OptionalValue identity = OptionalValue.empty(); + OptionalValue> auditRecords = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_IDENTITY) + public Builder setIdentity(Identity identity) { + this.identity = OptionalValue.of(identity); + return this; + } + + @JsonProperty(JSON_PROPERTY_AUDIT_RECORDS) + public Builder setAuditRecords(List auditRecords) { + this.auditRecords = OptionalValue.of(auditRecords); + return this; + } + + public AuditRecordsResponse build() { + return new AuditRecordsResponseImpl(identity, auditRecords); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/ConsentsListResponse.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/ConsentsListResponse.java new file mode 100644 index 000000000..ae32a8ea0 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/consents/response/ConsentsListResponse.java @@ -0,0 +1,59 @@ +/* + * Conversation API | Sinch + * + * OpenAPI document version: 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.conversation.models.v1.consents.response; + +import com.sinch.sdk.core.http.HttpRequest; +import com.sinch.sdk.core.models.pagination.ListResponse; +import com.sinch.sdk.core.models.pagination.Page; +import com.sinch.sdk.domains.conversation.models.v1.consents.Identity; +import java.util.Collection; +import java.util.Collections; +import java.util.NoSuchElementException; +import java.util.function.Supplier; + +/** Auto paginated response for list of Identity */ +public class ConsentsListResponse extends ListResponse { + + private final Page page; + private final Supplier supplier; + + public ConsentsListResponse( + Supplier supplier, Page page) { + this.supplier = supplier; + this.page = page; + } + + @Override + public boolean hasNextPage() { + if (null == page.getNextPageToken() || null == getContent() || getContent().isEmpty()) { + return false; + } + return true; + } + + @Override + public ConsentsListResponse nextPage() { + if (!hasNextPage()) { + throw new NoSuchElementException("Reached the last page of the API response"); + } + return supplier.get(); + } + + @Override + public Collection getContent() { + return page == null ? Collections.emptyList() : page.getEntities(); + } + + @Override + public String toString() { + return "ConsentsListResponse {" + "page=" + page + '}'; + } +}