Skip to content

Commit

Permalink
feature (DX): Simplify Recipient usage related to IdentifiedBy
Browse files Browse the repository at this point in the history
  • Loading branch information
JPPortier committed Jul 4, 2024
1 parent 12101f0 commit 2184022
Show file tree
Hide file tree
Showing 16 changed files with 219 additions and 107 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.sinch.sdk.core.models.pagination.Page;
import com.sinch.sdk.core.models.pagination.TokenPageNavigator;
import com.sinch.sdk.core.utils.Pair;
import com.sinch.sdk.domains.conversation.adapters.contact.IdentifiedByMapper;
import com.sinch.sdk.domains.conversation.api.v1.ContactApi;
import com.sinch.sdk.domains.conversation.models.v1.ConversationChannel;
import com.sinch.sdk.domains.conversation.models.v1.contact.Contact;
Expand All @@ -28,10 +27,6 @@

public class ContactService implements com.sinch.sdk.domains.conversation.ContactService {

static {
MessagesService.LocalLazyInit.init();
}

private final String uriUUID;
private final ContactApi api;
private final Collection<ConversationChannel> supportedChannelForGetProfile =
Expand Down Expand Up @@ -125,19 +120,4 @@ private void checkGetChannelProfileChannelType(GetChannelProfileRequest client)
client.getChannel(), supportedChannelForGetProfile));
}
}

static final class LocalLazyInit {

private LocalLazyInit() {
IdentifiedByMapper.initMapper();
}

public static LocalLazyInit init() {
return LocalLazyInit.LazyHolder.INSTANCE;
}

private static class LazyHolder {
public static final LocalLazyInit INSTANCE = new LocalLazyInit();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ public class ConversationService implements com.sinch.sdk.domains.conversation.C
private ContactService contact;
private MessagesService messages;

static {
LocalLazyInit.init();
}

public ConversationService(
UnifiedCredentials credentials,
ConversationContext context,
Expand Down Expand Up @@ -79,4 +83,20 @@ public MessagesService messages() {
}
return this.messages;
}

static final class LocalLazyInit {

private LocalLazyInit() {
RecipientMapper.initMapper();
}

public static LocalLazyInit init() {
return LocalLazyInit.LazyHolder.INSTANCE;
}

private static class LazyHolder {

public static final LocalLazyInit INSTANCE = new LocalLazyInit();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
public class MessagesService implements com.sinch.sdk.domains.conversation.MessagesService {

static {
ConversationService.LocalLazyInit.init();
LocalLazyInit.init();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.sinch.sdk.domains.conversation.adapters;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.sinch.sdk.core.utils.databind.Mapper;
import com.sinch.sdk.domains.conversation.models.v1.ChannelRecipientIdentities;
import com.sinch.sdk.domains.conversation.models.v1.ContactId;
import com.sinch.sdk.domains.conversation.models.v1.Recipient;
import java.io.IOException;
import java.util.logging.Logger;

public class RecipientMapper extends StdSerializer<Recipient> {

private static final Logger LOGGER = Logger.getLogger(RecipientMapper.class.getName());

public RecipientMapper() {
this(null);
}

public RecipientMapper(Class<Recipient> t) {
super(t);
}

public static void initMapper() {
SimpleModule module = new SimpleModule();
module.addSerializer(Recipient.class, new RecipientMapper());
Mapper.getInstance().registerModule(module);
}

@Override
public void serialize(Recipient value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {

/* TODO: To avoid recursive calls we should be able to add a rootName at class level (not for global mapper)
* Need to be enhanced in the future: one solution https://github.com/FasterXML/jackson-databind/issues/1022
*/
ObjectMapper mapper = (ObjectMapper) jgen.getCodec();

jgen.writeStartObject();
if (value instanceof ContactId) {
// hardcoded value: regression test have to be used to ensure proper validation
jgen.writeFieldName("contact_id");
String stringValue = mapper.writeValueAsString(((ContactId) value).getContactId());
jgen.writeRawValue(stringValue);
} else if (value instanceof ChannelRecipientIdentities) {
// hardcoded value: regression test have to be used to ensure proper validation
jgen.writeFieldName("identified_by");
jgen.writeStartObject();
jgen.writeFieldName("channel_identities");
String stringValue =
mapper.writeValueAsString(((ChannelRecipientIdentities) value).toArray());
jgen.writeRawValue(stringValue);
jgen.writeEndObject();
} else {
LOGGER.severe("Unexpected class '" + value.getClass() + "'");
}
jgen.writeEndObject();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.sinch.sdk.domains.conversation.models.v1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class ChannelRecipientIdentities extends ArrayList<ChannelRecipientIdentity>
implements com.sinch.sdk.domains.conversation.models.v1.Recipient {

public ChannelRecipientIdentities() {
super();
}

public ChannelRecipientIdentities(Collection<ChannelRecipientIdentity> collection) {
super(collection);
}

public static ChannelRecipientIdentities of(ChannelRecipientIdentity... elements) {
return new ChannelRecipientIdentities(Arrays.asList(elements));
}

public static Builder builder() {
return new Builder();
}

public static class Builder {

Collection<ChannelRecipientIdentity> identities;

public Builder setRecipientIdentities(Collection<ChannelRecipientIdentity> identities) {
this.identities = identities;
return this;
}

public ChannelRecipientIdentities build() {
return new ChannelRecipientIdentities(identities);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
package com.sinch.sdk.domains.conversation.models.v1.contact.request;

import com.sinch.sdk.core.models.OptionalValue;
import com.sinch.sdk.domains.conversation.models.v1.ChannelRecipientIdentities;
import com.sinch.sdk.domains.conversation.models.v1.ChannelRecipientIdentity;
import com.sinch.sdk.domains.conversation.models.v1.IdentifiedBy;
import java.util.List;
import java.util.Collection;

public class ContactGetChannelProfileByChannelIdentityRequest extends GetChannelProfileRequestImpl {

ContactGetChannelProfileByChannelIdentityRequest(
String appId,
GetChannelProfileConversationChannel channel,
List<ChannelRecipientIdentity> identities) {
super(
OptionalValue.of(appId),
OptionalValue.of(IdentifiedBy.builder().setChannelIdentities(identities).build()),
OptionalValue.of(channel));
ChannelRecipientIdentities identities) {
super(OptionalValue.of(appId), OptionalValue.of(identities), OptionalValue.of(channel));
}

public static Builder builder() {
Expand All @@ -30,7 +27,7 @@ public static class Builder {

String appId;
GetChannelProfileConversationChannel channel;
List<ChannelRecipientIdentity> identities;
ChannelRecipientIdentities identities;

public Builder setAppId(String appId) {
this.appId = appId;
Expand All @@ -42,11 +39,16 @@ public Builder setChannel(GetChannelProfileConversationChannel channel) {
return this;
}

public Builder setChannelIdentities(List<ChannelRecipientIdentity> identities) {
public Builder setChannelIdentities(ChannelRecipientIdentities identities) {
this.identities = identities;
return this;
}

public Builder setChannelIdentities(Collection<ChannelRecipientIdentity> identities) {
this.identities = new ChannelRecipientIdentities(identities);
return this;
}

public ContactGetChannelProfileByChannelIdentityRequest build() {
return new ContactGetChannelProfileByChannelIdentityRequest(appId, channel, identities);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
import com.sinch.sdk.core.http.AuthManager;
import com.sinch.sdk.core.http.HttpClient;
import com.sinch.sdk.domains.conversation.api.v1.ContactApi;
import com.sinch.sdk.domains.conversation.models.v1.ChannelRecipientIdentities;
import com.sinch.sdk.domains.conversation.models.v1.ContactDtoTest;
import com.sinch.sdk.domains.conversation.models.v1.ContactId;
import com.sinch.sdk.domains.conversation.models.v1.IdentifiedBy;
import com.sinch.sdk.domains.conversation.models.v1.contact.Contact;
import com.sinch.sdk.domains.conversation.models.v1.contact.request.ContactGetChannelProfileByChannelIdentityRequest;
import com.sinch.sdk.domains.conversation.models.v1.contact.request.ContactGetChannelProfileByContactIdRequest;
Expand Down Expand Up @@ -153,12 +153,13 @@ void channelProfileByChannelIdentity() throws ApiException {
when(api.contactGetChannelProfile(eq(uriPartID), any()))
.thenReturn(ContactDtoTest.expectedChannelProfileResponseDto);

IdentifiedBy identifiedBy =
(IdentifiedBy) ContactDtoTest.contactGetChannelProfileByChannelRequestDto.getRecipient();
ChannelRecipientIdentities channelIdentities =
(ChannelRecipientIdentities)
ContactDtoTest.contactGetChannelProfileByChannelRequestDto.getRecipient();
String response =
service.getChannelProfileByChannelIdentity(
ContactGetChannelProfileByChannelIdentityRequest.builder()
.setChannelIdentities(identifiedBy.getChannelIdentities())
.setChannelIdentities(channelIdentities)
.setChannel(ContactDtoTest.contactGetChannelProfileByChannelRequestDto.getChannel())
.setAppId(ContactDtoTest.contactGetChannelProfileByChannelRequestDto.getAppId())
.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@
package com.sinch.sdk.domains.conversation.models.v1.messages.internal;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.sinch.sdk.domains.conversation.models.v1.IdentifiedBy;
import com.sinch.sdk.domains.conversation.models.v1.ChannelRecipientIdentities;

/** declaration */
@JsonDeserialize(builder = IdentifiedByFieldInternalImpl.Builder.class)
public interface IdentifiedByFieldInternal {

/**
* Get identifiedBy
* The identity as specified by the channel.
*
* @return identifiedBy
*/
IdentifiedBy getIdentifiedBy();
ChannelRecipientIdentities getIdentifiedBy();

/**
* Getting builder
Expand All @@ -45,7 +45,7 @@ interface Builder {
* @return Current builder
* @see #getIdentifiedBy
*/
Builder setIdentifiedBy(IdentifiedBy identifiedBy);
Builder setIdentifiedBy(ChannelRecipientIdentities identifiedBy);

/**
* Create instance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
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.IdentifiedBy;
import com.sinch.sdk.domains.conversation.models.v1.ChannelRecipientIdentities;
import java.util.Objects;

@JsonPropertyOrder({IdentifiedByFieldInternalImpl.JSON_PROPERTY_IDENTIFIED_BY})
Expand All @@ -18,22 +18,22 @@ public class IdentifiedByFieldInternalImpl implements IdentifiedByFieldInternal

public static final String JSON_PROPERTY_IDENTIFIED_BY = "identified_by";

private OptionalValue<IdentifiedBy> identifiedBy;
private OptionalValue<ChannelRecipientIdentities> identifiedBy;

public IdentifiedByFieldInternalImpl() {}

protected IdentifiedByFieldInternalImpl(OptionalValue<IdentifiedBy> identifiedBy) {
protected IdentifiedByFieldInternalImpl(OptionalValue<ChannelRecipientIdentities> identifiedBy) {
this.identifiedBy = identifiedBy;
}

@JsonIgnore
public IdentifiedBy getIdentifiedBy() {
public ChannelRecipientIdentities getIdentifiedBy() {
return identifiedBy.orElse(null);
}

@JsonProperty(JSON_PROPERTY_IDENTIFIED_BY)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
public OptionalValue<IdentifiedBy> identifiedBy() {
public OptionalValue<ChannelRecipientIdentities> identifiedBy() {
return identifiedBy;
}

Expand Down Expand Up @@ -76,10 +76,10 @@ private String toIndentedString(Object o) {

@JsonPOJOBuilder(withPrefix = "set")
static class Builder implements IdentifiedByFieldInternal.Builder {
OptionalValue<IdentifiedBy> identifiedBy = OptionalValue.empty();
OptionalValue<ChannelRecipientIdentities> identifiedBy = OptionalValue.empty();

@JsonProperty(JSON_PROPERTY_IDENTIFIED_BY)
public Builder setIdentifiedBy(IdentifiedBy identifiedBy) {
public Builder setIdentifiedBy(ChannelRecipientIdentities identifiedBy) {
this.identifiedBy = OptionalValue.of(identifiedBy);
return this;
}
Expand Down
Loading

0 comments on commit 2184022

Please sign in to comment.