From e7a057283e3ca1e568c5c5f13ce4c60e6ba92906 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Fri, 17 Apr 2026 12:37:42 +0200 Subject: [PATCH 1/4] feat (pagination): Support requets builder for pagination based onto Function to consume a requested path parameters list --- .../api/v1/adapters/ContactsServiceImpl.java | 28 ++++++++++------- .../v1/adapters/ConversationsServiceImpl.java | 25 +++++++++++----- .../api/v1/adapters/EventsServiceImpl.java | 13 +++++--- .../api/v1/adapters/MessagesServiceImpl.java | 30 ++++++++++++------- .../v2/adapters/TemplatesV2ServiceImpl.java | 11 +++++-- .../v1/adapters/ActiveNumberServiceImpl.java | 12 +++++--- .../adapters/AvailableNumberServiceImpl.java | 10 +++++-- .../adapters/AvailableRegionsServiceImpl.java | 8 +++-- .../api/v1/adapters/BatchesServiceImpl.java | 14 ++++++--- .../adapters/DeliveryReportsServiceImpl.java | 12 +++++--- .../api/v1/adapters/GroupsServiceImpl.java | 14 ++++++--- .../api/v1/adapters/InboundsServiceImpl.java | 13 +++++--- 12 files changed, 132 insertions(+), 58 deletions(-) diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ContactsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ContactsServiceImpl.java index 713266dff..9850bd462 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ContactsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ContactsServiceImpl.java @@ -46,6 +46,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class ContactsServiceImpl @@ -84,11 +85,15 @@ public ContactsListResponse list(ContactsListQueryParameters queryParameter) thr LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ContactsListResponse _fetchListPage( - ContactsListQueryParameters queryParameter, HttpRequest httpRequest) throws ApiException { + Function requestBuilder, + ContactsListQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { HttpResponse response = httpClient.invokeAPI( this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); @@ -104,10 +109,10 @@ private ContactsListResponse _fetchListPage( ContactsListQueryParameters.builder(queryParameter).setPageToken(nextToken).build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) ? listRequestBuilder(nextParameters) : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new ContactsListResponse( - () -> _fetchListPage(nextParameters, nextHttpRequest), + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getContacts(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: @@ -480,11 +485,16 @@ public IdentityConflictsListResponse listIdentityConflicts( LOGGER.finest("[listIdentityConflicts]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listIdentityConflictsRequestBuilder(queryParameter); - return _fetchListIdentityConflictsPage(queryParameter, httpRequest); + return _fetchListIdentityConflictsPage( + (queryParameters) -> listIdentityConflictsRequestBuilder(queryParameters), + queryParameter, + httpRequest); } private IdentityConflictsListResponse _fetchListIdentityConflictsPage( - IdentityConflictsListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + IdentityConflictsListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -504,12 +514,10 @@ private IdentityConflictsListResponse _fetchListIdentityConflictsPage( .build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) - ? listIdentityConflictsRequestBuilder(nextParameters) - : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new IdentityConflictsListResponse( - () -> _fetchListIdentityConflictsPage(nextParameters, nextHttpRequest), + () -> _fetchListIdentityConflictsPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getConflicts(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationsServiceImpl.java index dae6bdfb0..1387c112a 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/ConversationsServiceImpl.java @@ -45,6 +45,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class ConversationsServiceImpl @@ -84,11 +85,14 @@ public ConversationsListResponse list(ConversationsListQueryParameters queryPara LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ConversationsListResponse _fetchListPage( - ConversationsListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + ConversationsListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -105,10 +109,10 @@ private ConversationsListResponse _fetchListPage( ConversationsListQueryParameters.builder(queryParameter).setPageToken(nextToken).build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) ? listRequestBuilder(nextParameters) : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new ConversationsListResponse( - () -> _fetchListPage(nextParameters, nextHttpRequest), + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getConversations(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: @@ -563,11 +567,16 @@ public RecentConversationsListResponse listRecent( LOGGER.finest("[listRecent]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRecentRequestBuilder(queryParameter); - return _fetchListRecentPage(queryParameter, httpRequest); + return _fetchListRecentPage( + (queryParameters) -> listRecentRequestBuilder(queryParameters), + queryParameter, + httpRequest); } private RecentConversationsListResponse _fetchListRecentPage( - RecentConversationsListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + RecentConversationsListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -587,10 +596,10 @@ private RecentConversationsListResponse _fetchListRecentPage( .build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) ? listRecentRequestBuilder(nextParameters) : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new RecentConversationsListResponse( - () -> _fetchListRecentPage(nextParameters, nextHttpRequest), + () -> _fetchListRecentPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getConversations(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/EventsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/EventsServiceImpl.java index e797c5dbc..a929ece67 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/EventsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/EventsServiceImpl.java @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class EventsServiceImpl implements com.sinch.sdk.domains.conversation.api.v1.EventsService { @@ -76,11 +77,15 @@ public EventsListResponse list(EventsListQueryParameters queryParameter) throws LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private EventsListResponse _fetchListPage( - EventsListQueryParameters queryParameter, HttpRequest httpRequest) throws ApiException { + Function requestBuilder, + EventsListQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { HttpResponse response = httpClient.invokeAPI( this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); @@ -96,10 +101,10 @@ private EventsListResponse _fetchListPage( EventsListQueryParameters.builder(queryParameter).setPageToken(nextToken).build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) ? listRequestBuilder(nextParameters) : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new EventsListResponse( - () -> _fetchListPage(nextParameters, nextHttpRequest), + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getEvents(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/MessagesServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/MessagesServiceImpl.java index 390b2cf0c..b152a134a 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/MessagesServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/adapters/MessagesServiceImpl.java @@ -54,6 +54,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class MessagesServiceImpl @@ -92,11 +93,15 @@ public MessagesListResponse list(MessagesListQueryParameters queryParameter) thr LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private MessagesListResponse _fetchListPage( - MessagesListQueryParameters queryParameter, HttpRequest httpRequest) throws ApiException { + Function requestBuilder, + MessagesListQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { HttpResponse response = httpClient.invokeAPI( this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); @@ -112,10 +117,10 @@ private MessagesListResponse _fetchListPage( MessagesListQueryParameters.builder(queryParameter).setPageToken(nextToken).build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) ? listRequestBuilder(nextParameters) : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new MessagesListResponse( - () -> _fetchListPage(nextParameters, nextHttpRequest), + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getMessages(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: @@ -438,11 +443,16 @@ public MessagesListResponse listLastMessagesByChannelIdentity( "[listLastMessagesByChannelIdentity]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listLastMessagesByChannelIdentityRequestBuilder(queryParameter); - return _fetchListLastMessagesByChannelIdentityPage(queryParameter, httpRequest); + return _fetchListLastMessagesByChannelIdentityPage( + (queryParameters) -> listLastMessagesByChannelIdentityRequestBuilder(queryParameters), + queryParameter, + httpRequest); } private MessagesListResponse _fetchListLastMessagesByChannelIdentityPage( - LastMessagesByChannelIdentityListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + LastMessagesByChannelIdentityListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -461,12 +471,12 @@ private MessagesListResponse _fetchListLastMessagesByChannelIdentityPage( .build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) - ? listLastMessagesByChannelIdentityRequestBuilder(nextParameters) - : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new MessagesListResponse( - () -> _fetchListLastMessagesByChannelIdentityPage(nextParameters, nextHttpRequest), + () -> + _fetchListLastMessagesByChannelIdentityPage( + requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getMessages(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/templates/api/v2/adapters/TemplatesV2ServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/templates/api/v2/adapters/TemplatesV2ServiceImpl.java index 024c95949..ca1abf239 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/templates/api/v2/adapters/TemplatesV2ServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/templates/api/v2/adapters/TemplatesV2ServiceImpl.java @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class TemplatesV2ServiceImpl @@ -339,11 +340,17 @@ public TranslationsV2ListResponse listTranslations( + queryParameter); HttpRequest httpRequest = listTranslationsRequestBuilder(templateId, queryParameter); - return _fetchListTranslationsPage(queryParameter, httpRequest); + return _fetchListTranslationsPage( + (queryParameters) -> listTranslationsRequestBuilder(templateId, queryParameters), + queryParameter, + httpRequest); } private TranslationsV2ListResponse _fetchListTranslationsPage( - ListTranslationsQueryParameters queryParameter, HttpRequest httpRequest) throws ApiException { + Function requestBuilder, + ListTranslationsQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { HttpResponse response = httpClient.invokeAPI( this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/ActiveNumberServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/ActiveNumberServiceImpl.java index 21d74b1d4..e8a54731a 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/ActiveNumberServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/ActiveNumberServiceImpl.java @@ -41,6 +41,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class ActiveNumberServiceImpl @@ -84,11 +85,14 @@ public ActiveNumbersListResponse list(ActiveNumbersListQueryParameters queryPara LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ActiveNumbersListResponse _fetchListPage( - ActiveNumbersListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + ActiveNumbersListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -105,10 +109,10 @@ private ActiveNumbersListResponse _fetchListPage( ActiveNumbersListQueryParameters.builder(queryParameter).setPageToken(nextToken).build(); final HttpRequest nextHttpRequest = - !StringUtil.isEmpty(nextToken) ? listRequestBuilder(nextParameters) : null; + !StringUtil.isEmpty(nextToken) ? requestBuilder.apply(nextParameters) : null; return new ActiveNumbersListResponse( - () -> _fetchListPage(nextParameters, nextHttpRequest), + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), new Page<>(deserialized.getActiveNumbers(), new PageNavigator<>(nextHttpRequest))); } // fallback to default errors handling: diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableNumberServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableNumberServiceImpl.java index d12668042..8e8d48791 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableNumberServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableNumberServiceImpl.java @@ -38,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class AvailableNumberServiceImpl @@ -284,11 +285,16 @@ public AvailableNumbersListResponse searchForAvailableNumbers( LOGGER.finest("[searchForAvailableNumbers]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = searchForAvailableNumbersRequestBuilder(queryParameter); - return _fetchSearchForAvailableNumbersPage(queryParameter, httpRequest); + return _fetchSearchForAvailableNumbersPage( + (queryParameters) -> searchForAvailableNumbersRequestBuilder(queryParameters), + queryParameter, + httpRequest); } private AvailableNumbersListResponse _fetchSearchForAvailableNumbersPage( - AvailableNumbersListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + AvailableNumbersListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableRegionsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableRegionsServiceImpl.java index 8e2ce0c64..2d94e25a3 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableRegionsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numbers/api/v1/adapters/AvailableRegionsServiceImpl.java @@ -34,6 +34,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class AvailableRegionsServiceImpl @@ -74,11 +75,14 @@ public AvailableRegionsListResponse list(AvailableRegionsListQueryParameters que LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private AvailableRegionsListResponse _fetchListPage( - AvailableRegionsListQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + AvailableRegionsListQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/BatchesServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/BatchesServiceImpl.java index 660f9866a..427fe7d8c 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/BatchesServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/BatchesServiceImpl.java @@ -42,6 +42,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class BatchesServiceImpl implements com.sinch.sdk.domains.sms.api.v1.BatchesService { @@ -79,11 +80,15 @@ public ListBatchesResponse list(ListBatchesQueryParameters queryParameter) throw LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ListBatchesResponse _fetchListPage( - ListBatchesQueryParameters queryParameter, HttpRequest httpRequest) throws ApiException { + Function requestBuilder, + ListBatchesQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { HttpResponse response = httpClient.invokeAPI( this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); @@ -113,9 +118,10 @@ private ListBatchesResponse _fetchListPage( ListBatchesQueryParameters.builder(queryParameter).setPage(nextPage).build(); final HttpRequest nextHttpRequest = - nextPage != null ? listRequestBuilder(nextParameters) : null; + nextPage != null ? requestBuilder.apply(nextParameters) : null; - return new ListBatchesResponse(() -> _fetchListPage(nextParameters, nextHttpRequest), page); + return new ListBatchesResponse( + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), page); } // fallback to default errors handling: // all error cases definition are not required from specs: will try some "hardcoded" content diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/DeliveryReportsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/DeliveryReportsServiceImpl.java index 1624a0fd3..4887acfcb 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/DeliveryReportsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/DeliveryReportsServiceImpl.java @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class DeliveryReportsServiceImpl @@ -78,11 +79,14 @@ public ListDeliveryReportsResponse list(ListDeliveryReportsQueryParameters query LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ListDeliveryReportsResponse _fetchListPage( - ListDeliveryReportsQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + ListDeliveryReportsQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -113,10 +117,10 @@ private ListDeliveryReportsResponse _fetchListPage( ListDeliveryReportsQueryParameters.builder(queryParameter).setPage(nextPage).build(); final HttpRequest nextHttpRequest = - nextPage != null ? listRequestBuilder(nextParameters) : null; + nextPage != null ? requestBuilder.apply(nextParameters) : null; return new ListDeliveryReportsResponse( - () -> _fetchListPage(nextParameters, nextHttpRequest), page); + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), page); } // fallback to default errors handling: // all error cases definition are not required from specs: will try some "hardcoded" content diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/GroupsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/GroupsServiceImpl.java index 790fd9a69..f2e103992 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/GroupsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/GroupsServiceImpl.java @@ -38,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class GroupsServiceImpl implements com.sinch.sdk.domains.sms.api.v1.GroupsService { @@ -75,11 +76,15 @@ public ListGroupsResponse list(ListGroupsQueryParameters queryParameter) throws LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ListGroupsResponse _fetchListPage( - ListGroupsQueryParameters queryParameter, HttpRequest httpRequest) throws ApiException { + Function requestBuilder, + ListGroupsQueryParameters queryParameter, + HttpRequest httpRequest) + throws ApiException { HttpResponse response = httpClient.invokeAPI( this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); @@ -109,9 +114,10 @@ private ListGroupsResponse _fetchListPage( ListGroupsQueryParameters.builder(queryParameter).setPage(nextPage).build(); final HttpRequest nextHttpRequest = - nextPage != null ? listRequestBuilder(nextParameters) : null; + nextPage != null ? requestBuilder.apply(nextParameters) : null; - return new ListGroupsResponse(() -> _fetchListPage(nextParameters, nextHttpRequest), page); + return new ListGroupsResponse( + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), page); } // fallback to default errors handling: // all error cases definition are not required from specs: will try some "hardcoded" content diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/InboundsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/InboundsServiceImpl.java index 6a24d5b3b..7d2193d1a 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/InboundsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/sms/api/v1/adapters/InboundsServiceImpl.java @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.logging.Logger; public class InboundsServiceImpl implements com.sinch.sdk.domains.sms.api.v1.InboundsService { @@ -75,11 +76,14 @@ public ListInboundsResponse list(ListInboundMessagesQueryParameters queryParamet LOGGER.finest("[list]" + " " + "queryParameter: " + queryParameter); HttpRequest httpRequest = listRequestBuilder(queryParameter); - return _fetchListPage(queryParameter, httpRequest); + return _fetchListPage( + (queryParameters) -> listRequestBuilder(queryParameters), queryParameter, httpRequest); } private ListInboundsResponse _fetchListPage( - ListInboundMessagesQueryParameters queryParameter, HttpRequest httpRequest) + Function requestBuilder, + ListInboundMessagesQueryParameters queryParameter, + HttpRequest httpRequest) throws ApiException { HttpResponse response = httpClient.invokeAPI( @@ -110,9 +114,10 @@ private ListInboundsResponse _fetchListPage( ListInboundMessagesQueryParameters.builder(queryParameter).setPage(nextPage).build(); final HttpRequest nextHttpRequest = - nextPage != null ? listRequestBuilder(nextParameters) : null; + nextPage != null ? requestBuilder.apply(nextParameters) : null; - return new ListInboundsResponse(() -> _fetchListPage(nextParameters, nextHttpRequest), page); + return new ListInboundsResponse( + () -> _fetchListPage(requestBuilder, nextParameters, nextHttpRequest), page); } // fallback to default errors handling: // all error cases definition are not required from specs: will try some "hardcoded" content From d45c01be627ee49649d6e3f64d08701cb682ad35 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Fri, 17 Apr 2026 15:29:29 +0200 Subject: [PATCH 2/4] 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 3/4] 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 + '}'; + } +} From 820256069942e41380a27e98c0494a8f613bb2fe Mon Sep 17 00:00:00 2001 From: Eduardo San Segundo Date: Thu, 14 May 2026 11:06:03 +0200 Subject: [PATCH 4/4] DEVEXP-1386: Conversation sources generated --- .../sdk/domains/conversation/api/v1/ContactsService.java | 2 +- .../sdk/domains/conversation/api/v1/ConversationsService.java | 2 +- .../sinch/sdk/domains/conversation/models/v1/ReasonCode.java | 2 +- .../v1/capability/response/QueryCapabilityResponse.java | 4 ++-- .../models/v1/sinchevents/contact/ContactDeleteEvent.java | 2 +- .../models/v1/sinchevents/contact/ContactUpdateEvent.java | 2 +- .../models/v1/sinchevents/delivery/DeliveryStatus.java | 2 +- .../v1/transcoding/request/TranscodeMessageRequest.java | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ContactsService.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ContactsService.java index 6f2101292..5b423eff9 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ContactsService.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ContactsService.java @@ -168,7 +168,7 @@ IdentityConflictsListResponse listIdentityConflicts( * will be moved from the source contact to the destination contact only for channels that * weren't present there before. Moved channel identities will be placed at the bottom of the * channel priority list. Optional fields from the source contact will be copied only if - * corresponding fields in the destination contact are empty The contact being removed cannot be + * corresponding fields in the destination contact are empty. The contact being removed cannot be * referenced after this call. * * @param destinationId The unique ID of the contact that should be kept when merging two diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationsService.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationsService.java index f4751ae3e..9d39a8a92 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationsService.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/api/v1/ConversationsService.java @@ -136,7 +136,7 @@ RecentConversationsListResponse listRecent(RecentConversationsListQueryParameter * Stop conversation * *

This operation stops the referenced conversation, if the conversation is still active. In - * Conversation mode, A new conversation will be created if a new message is exchanged between the + * Conversation mode, a new conversation will be created if a new message is exchanged between the * app or contact that was part of the stopped conversation. * * @param conversationId The unique ID of the conversation. This is generated by the system. diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/ReasonCode.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/ReasonCode.java index 4955f0dbd..6e9ab0086 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/ReasonCode.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/ReasonCode.java @@ -59,7 +59,7 @@ public class ReasonCode extends EnumDynamic { new ReasonCode("CHANNEL_CONFIGURATION_MISSING"); /** - * Some of the referenced media files is of a unsupported media type. Please read the channel support * documentation page to find out the limitations on media that the different channels impose. */ diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/capability/response/QueryCapabilityResponse.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/capability/response/QueryCapabilityResponse.java index b8934c16c..e06991ff5 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/capability/response/QueryCapabilityResponse.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/capability/response/QueryCapabilityResponse.java @@ -14,8 +14,8 @@ import com.sinch.sdk.domains.conversation.models.v1.Recipient; /** - * An CapabilityResponse contains the identity of the recipient for which will be perform a - * capability lookup. + * A CapabilityResponse contains the identity of the recipient for which a capability lookup will be + * performed. */ @JsonDeserialize(builder = QueryCapabilityResponseImpl.Builder.class) public interface QueryCapabilityResponse { diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactDeleteEvent.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactDeleteEvent.java index 96b509c99..83264ea89 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactDeleteEvent.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactDeleteEvent.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.time.Instant; -/** This callback is sent when a new contact is deleted. */ +/** This callback is sent when a contact is deleted. */ @JsonDeserialize(builder = ContactDeleteEventImpl.Builder.class) public interface ContactDeleteEvent extends com.sinch.sdk.domains.conversation.models.v1.sinchevents.ConversationSinchEvent { diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactUpdateEvent.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactUpdateEvent.java index 924e111c8..6b08cf3d7 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactUpdateEvent.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/contact/ContactUpdateEvent.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.time.Instant; -/** This callback is sent when a new contact is updated. */ +/** This callback is sent when a contact is updated. */ @JsonDeserialize(builder = ContactUpdateEventImpl.Builder.class) public interface ContactUpdateEvent extends com.sinch.sdk.domains.conversation.models.v1.sinchevents.ConversationSinchEvent { diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/delivery/DeliveryStatus.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/delivery/DeliveryStatus.java index 3e1ff8740..09564f4f7 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/delivery/DeliveryStatus.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/sinchevents/delivery/DeliveryStatus.java @@ -20,7 +20,7 @@ public class DeliveryStatus extends EnumDynamic { /** Message delivery failed. */ public static final DeliveryStatus FAILED = new DeliveryStatus("FAILED"); - /** The Conversation API app is switch to a different channel to deliver the message. */ + /** The Conversation API app is switching to a different channel to deliver the message. */ public static final DeliveryStatus SWITCHING_CHANNEL = new DeliveryStatus("SWITCHING_CHANNEL"); private static final EnumSupportDynamic ENUM_SUPPORT = diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/transcoding/request/TranscodeMessageRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/transcoding/request/TranscodeMessageRequest.java index 1948e234e..4ac3f3ec6 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/transcoding/request/TranscodeMessageRequest.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/conversation/models/v1/transcoding/request/TranscodeMessageRequest.java @@ -38,7 +38,7 @@ public interface TranscodeMessageRequest { AppMessage getAppMessage(); /** - * The list of channels for which the message shall be transcoded to. + * The list of channels for which the message shall be transcoded. * *

Field is required *