diff --git a/config/findbugs/excludeFilter.xml b/config/findbugs/excludeFilter.xml
index cfcbf506f..c70cca556 100644
--- a/config/findbugs/excludeFilter.xml
+++ b/config/findbugs/excludeFilter.xml
@@ -25,6 +25,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java
index bce7df75d..79c8b4a89 100644
--- a/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java
+++ b/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java
@@ -6,8 +6,12 @@
import com.pubnub.api.enums.PNLogVerbosity;
import com.pubnub.api.integration.util.ITTestConfig;
import org.aeonbits.owner.ConfigFactory;
+import org.apache.commons.lang3.RandomStringUtils;
import org.junit.Before;
+import java.util.HashMap;
+import java.util.Map;
+
import static org.hamcrest.Matchers.isEmptyOrNullString;
import static org.hamcrest.Matchers.not;
import static org.junit.Assume.assumeThat;
@@ -15,6 +19,8 @@
public abstract class ObjectsApiBaseIT {
//See README.md in integrationTest directory for more info on running integration tests
private ITTestConfig itTestConfig = ConfigFactory.create(ITTestConfig.class, System.getenv());
+ public static final String STATUS_ACTIVE = "Active";
+ public static final String TYPE_HUMAN = "Human";
protected final PubNub pubNubUnderTest = pubNub();
@@ -35,4 +41,39 @@ private PubNub pubNub() {
public void assumeTestsAreConfiguredProperly() {
assumeThat("Subscription key must be set in test.properties", itTestConfig.subscribeKey(), not(isEmptyOrNullString()));
}
+
+ protected String randomName() {
+ return RandomStringUtils.randomAlphabetic(5, 10) + " " + RandomStringUtils.randomAlphabetic(5, 10);
+ }
+
+ protected Map customUserObject() {
+ return getCustomObject();
+ }
+
+ protected Map customSpaceObject() {
+ return getCustomObject();
+ }
+
+ private Map getCustomObject(){
+ final Map customMap = new HashMap<>();
+ customMap.putIfAbsent("param1", "val1");
+ customMap.putIfAbsent("param2", "val2");
+ return customMap;
+ }
+
+ protected Map updatedCustomUserObject() {
+ return updatedCustomObject();
+ }
+
+ protected Map updatedCustomSpaceObject() {
+ return updatedCustomObject();
+ }
+
+ private Map updatedCustomObject() {
+ final Map customMap = new HashMap<>();
+ customMap.putIfAbsent("param1", "val1_updated");
+ customMap.putIfAbsent("param2", "val2_updated");
+ customMap.putIfAbsent("param3", "added");
+ return customMap;
+ }
}
diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java
index 56eb5b4ba..953bf9bc2 100644
--- a/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java
+++ b/src/integrationTest/java/com/pubnub/api/integration/objects/uuid/UUIDMetadataIT.java
@@ -194,10 +194,6 @@ private String randomEmail() {
return RandomStringUtils.randomAlphabetic(6) + "@example.com";
}
- private String randomName() {
- return RandomStringUtils.randomAlphabetic(5, 10) + " " + RandomStringUtils.randomAlphabetic(5, 10);
- }
-
private String randomProfileUrl() {
return "http://" + RandomStringUtils.randomAlphabetic(5, 15) + ".com";
}
diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/space/SpaceIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/space/SpaceIT.java
new file mode 100644
index 000000000..842371757
--- /dev/null
+++ b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/space/SpaceIT.java
@@ -0,0 +1,294 @@
+package com.pubnub.api.integration.objects_vsp.space;
+
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.integration.objects.ObjectsApiBaseIT;
+import com.pubnub.api.models.consumer.objects_vsp.space.RemoveSpaceResult;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.http.HttpStatus;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Map;
+import java.util.Random;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class SpaceIT extends ObjectsApiBaseIT {
+
+ private final String randomSpaceIdValue = getRandomSpaceIdValue();
+ private SpaceId randomSpaceId;
+ private final String randomName = randomName();
+ private final String randomDescription = randomDescription();
+
+ @Before
+ public void setUp() throws Exception {
+ randomSpaceId = new SpaceId(randomSpaceIdValue);
+ }
+
+ @Test
+ public void createUserHappyPath() throws PubNubException {
+ //given
+
+ //when
+ Space space = pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //then
+ assertNotNull(space);
+ assertEquals(randomSpaceId.getValue(), space.getId().getValue());
+ assertEquals(randomName, space.getName());
+ assertEquals(randomDescription, space.getDescription());
+ assertEquals("val1", space.getCustom().get("param1").toString());
+ assertEquals("val2", space.getCustom().get("param2").toString());
+ assertEquals(STATUS_ACTIVE, space.getStatus());
+ assertEquals(TYPE_HUMAN, space.getType());
+// assertNotNull(space.getUpdated()); waiting on https://pubnub.atlassian.net/browse/ENG-4203
+// assertNotNull(space.getETag());
+ }
+
+
+ @Test(expected = PubNubException.class)
+ public void should_throw_exception_when_space_with_the_spaceId_exists() throws PubNubException {
+ //given
+ pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //then
+ }
+
+ @Test
+ public void removeSpaceHappyPath() throws PubNubException {
+ //given
+ pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ RemoveSpaceResult removeSpaceResult = pubNubUnderTest.removeSpace(randomSpaceId).sync();
+
+ //then
+ assertEquals(HttpStatus.SC_OK, removeSpaceResult.getStatus());
+ }
+
+ @Test
+ public void fetchSpaceHappyPath() throws PubNubException {
+ //given
+ pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ Space space = pubNubUnderTest.fetchSpace(randomSpaceId)
+ .sync();
+
+ //then
+ assertNotNull(space);
+ assertEquals(randomSpaceIdValue, space.getId().getValue());
+ assertEquals(randomName, space.getName());
+ assertEquals(randomDescription, space.getDescription());
+ assertNotNull(space.getCustom());
+ assertEquals(STATUS_ACTIVE, space.getStatus());
+ assertEquals(TYPE_HUMAN, space.getType());
+// assertNotNull(space.getUpdated());
+// assertNotNull(space.getETag());
+ }
+
+ @Test
+ public void updateSpace_passing_full_object_happyPath() throws PubNubException {
+ //given
+ String updatedName = "updatedName" + randomName();
+ String updatedDescription = "updatedDescription" + randomName();
+ Map updateCustom = updatedCustomSpaceObject();
+ String updatedStatus = "updatedStatus" + STATUS_ACTIVE;
+ String updatedType = "updatedType" + TYPE_HUMAN;
+
+ pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ Space updatedSpace = pubNubUnderTest.updateSpace(randomSpaceId)
+ .name(updatedName)
+ .description(updatedDescription)
+ .custom(updateCustom)
+ .status(updatedStatus)
+ .type(updatedType)
+ .sync();
+
+ //then
+ assertNotNull(updatedSpace);
+ assertEquals(randomSpaceIdValue, updatedSpace.getId().getValue());
+ assertEquals(updatedName, updatedSpace.getName());
+ assertEquals(updatedDescription, updatedSpace.getDescription());
+ assertEquals(updatedDescription, updatedSpace.getDescription());
+ assertEquals("val1_updated", updatedSpace.getCustom().get("param1").toString());
+ assertEquals("val2_updated", updatedSpace.getCustom().get("param2").toString());
+ assertEquals("added", updatedSpace.getCustom().get("param3").toString());
+ assertEquals(updatedStatus, updatedSpace.getStatus());
+ assertEquals(updatedType, updatedSpace.getType());
+// assertNotNull(updatedSpace.getUpdated());
+// assertNotNull(updatedSpace.getETag());
+
+ Space space = pubNubUnderTest.fetchSpace(randomSpaceId)
+ .sync();
+
+ assertNotNull(space);
+ assertEquals(randomSpaceIdValue, space.getId().getValue());
+ assertEquals(updatedName, space.getName());
+ assertEquals(updatedDescription, space.getDescription());
+ assertNotNull(space.getCustom());
+ assertEquals(updatedStatus, space.getStatus());
+ assertEquals(updatedType, space.getType());
+// assertNotNull(space.getUpdated());
+// assertNotNull(space.getETag());
+ }
+
+ @Test(expected = PubNubException.class)
+ public void updateSpace_should_throw_exception_when_updating_space_that_does_not_exist() throws PubNubException {
+ //given
+ String updatedName = "updatedName" + randomName();
+
+ //when
+ pubNubUnderTest.updateSpace(randomSpaceId)
+ .name(updatedName)
+ .sync();
+
+ //then
+
+ }
+
+ @Test
+ public void upsertSpaceHappyPath_newSpaceCreated() throws PubNubException {
+ //given
+
+ //when
+ Space space = pubNubUnderTest.upsertSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //then
+ assertNotNull(space);
+ assertEquals(randomSpaceIdValue, space.getId().getValue());
+ assertEquals(randomName, space.getName());
+ assertEquals(randomDescription, space.getDescription());
+ assertNotNull(space.getCustom());
+ assertEquals(STATUS_ACTIVE, space.getStatus());
+ assertEquals(TYPE_HUMAN, space.getType());
+// assertNotNull(space.getUpdated());
+// assertNotNull(space.getETag());
+ }
+
+ @Test
+ public void upsertSpaceHappyPath_existingSpaceUpdated() throws PubNubException {
+ //given
+ String updatedName = "updatedName" + randomName();
+ String updatedDescription = "updatedDescription" + randomName();
+ Map updateCustom = updatedCustomSpaceObject();
+ String updatedStatus = "updatedStatus" + STATUS_ACTIVE;
+ String updatedType = "updatedType" + TYPE_HUMAN;
+
+ pubNubUnderTest.createSpace(randomSpaceId)
+ .name(randomName)
+ .description(randomDescription)
+ .custom(customSpaceObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ Space spaceAfterUpsert = pubNubUnderTest.upsertSpace(randomSpaceId)
+ .name(updatedName)
+ .description(updatedDescription)
+ .custom(updateCustom)
+ .status(updatedStatus)
+ .type(updatedType)
+ .sync();
+
+ //then
+ assertNotNull(spaceAfterUpsert);
+ assertEquals(randomSpaceIdValue, spaceAfterUpsert.getId().getValue());
+ assertEquals(updatedName, spaceAfterUpsert.getName());
+ assertEquals(updatedDescription, spaceAfterUpsert.getDescription());
+ assertEquals(updatedDescription, spaceAfterUpsert.getDescription());
+ assertEquals("val1_updated", spaceAfterUpsert.getCustom().get("param1").toString());
+ assertEquals("val2_updated", spaceAfterUpsert.getCustom().get("param2").toString());
+ assertEquals("added", spaceAfterUpsert.getCustom().get("param3").toString());
+ assertEquals(updatedStatus, spaceAfterUpsert.getStatus());
+ assertEquals(updatedType, spaceAfterUpsert.getType());
+// assertNotNull(spaceAfterUpsert.getUpdated());
+// assertNotNull(spaceAfterUpsert.getETag());
+
+ Space space = pubNubUnderTest.fetchSpace(randomSpaceId)
+ .sync();
+
+ assertNotNull(space);
+ assertEquals(randomSpaceIdValue, space.getId().getValue());
+ assertEquals(updatedName, space.getName());
+ assertEquals(updatedDescription, space.getDescription());
+ assertNotNull(space.getCustom());
+ assertEquals(updatedStatus, space.getStatus());
+ assertEquals(updatedType, space.getType());
+// assertNotNull(space.getUpdated());
+// assertNotNull(space.getETag());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ pubNubUnderTest.removeSpace(randomSpaceId).sync();
+ }
+
+ private String getRandomSpaceIdValue() {
+ return "spaceId" + new Random().nextInt(100000);
+ }
+
+ private static String randomDescription() {
+ return RandomStringUtils.randomAlphabetic(50, 160);
+ }
+}
diff --git a/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/user/UserIT.java b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/user/UserIT.java
new file mode 100644
index 000000000..bdc56706b
--- /dev/null
+++ b/src/integrationTest/java/com/pubnub/api/integration/objects_vsp/user/UserIT.java
@@ -0,0 +1,327 @@
+package com.pubnub.api.integration.objects_vsp.user;
+
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.UserId;
+import com.pubnub.api.endpoints.objects_vsp.user.FetchUser;
+import com.pubnub.api.integration.objects.ObjectsApiBaseIT;
+import com.pubnub.api.models.consumer.objects_vsp.user.RemoveUserResult;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.http.HttpStatus;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+public class UserIT extends ObjectsApiBaseIT {
+ private final String randomUserIdValue = getRandomUserIdValue();
+ private UserId randomUserId;
+ private final String randomName = randomName();
+ private final String randomEmail = randomEmail();
+ private final String randomProfileUrl = randomProfileUrl();
+ private final String randomExternalId = randomExternalId();
+
+ @Before
+ public void setUp() throws Exception {
+ randomUserId = new UserId(randomUserIdValue);
+ }
+
+ @Test
+ public void createUserHappyPath() throws PubNubException {
+ //given
+
+ //when
+ final User user = pubNubUnderTest.createUser()
+ .userId(randomUserId)
+ .name(randomName)
+ .email(randomEmail)
+ .profileUrl(randomProfileUrl)
+ .externalId(randomExternalId)
+ .custom(customUserObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //then
+ assertNotNull(user);
+ assertEquals(randomUserIdValue, user.getId().getValue());
+ assertEquals(randomName, user.getName());
+ assertEquals(randomEmail, user.getEmail());
+ assertEquals(randomProfileUrl, user.getProfileUrl());
+ assertEquals(randomExternalId, user.getExternalId());
+ assertNotNull(user.getCustom());
+ assertEquals(STATUS_ACTIVE, user.getStatus());
+ assertEquals(TYPE_HUMAN, user.getType());
+// assertNotNull(user.getUpdated());
+// assertNotNull(user.getETag());
+ }
+
+ @Test
+ public void fetchUserHappyPath() throws PubNubException {
+ //given
+ pubNubUnderTest.createUser()
+ .userId(randomUserId)
+ .name(randomName)
+ .email(randomEmail)
+ .profileUrl(randomProfileUrl)
+ .externalId(randomExternalId)
+ .custom(customUserObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ User user = pubNubUnderTest.fetchUser()
+ .userId(randomUserId)
+ .includeCustom(true)
+ .sync();
+
+ assertNotNull(user);
+ assertEquals(randomUserIdValue, user.getId().getValue());
+ assertEquals(randomName, user.getName());
+ assertEquals(randomEmail, user.getEmail());
+ assertEquals(randomProfileUrl, user.getProfileUrl());
+ assertEquals(randomExternalId, user.getExternalId());
+ assertNotNull(user.getCustom());
+ assertEquals(STATUS_ACTIVE, user.getStatus());
+ assertEquals(TYPE_HUMAN, user.getType());
+// assertNotNull(user.getUpdated());
+// assertNotNull(user.getETag());
+ }
+
+
+ @Test
+ public void removeUserHappyPath() throws PubNubException {
+ // given
+ pubNubUnderTest.createUser()
+ .userId(randomUserId)
+ .name(randomName)
+ .email(randomEmail)
+ .profileUrl(randomProfileUrl)
+ .externalId(randomExternalId)
+ .custom(customUserObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ RemoveUserResult removeUserResult = pubNubUnderTest.removeUser()
+ .userId(randomUserId)
+ .sync();
+
+ //then
+ assertNotNull(removeUserResult);
+ assertEquals(HttpStatus.SC_OK, removeUserResult.getStatus());
+
+ //verify if user not exist
+ FetchUser fetchUser = pubNubUnderTest.fetchUser()
+ .userId(randomUserId)
+ .includeCustom(true);
+
+ PubNubException exception = assertThrows(PubNubException.class, () -> fetchUser.sync());
+
+ assertTrue(exception.getMessage().contains("Requested resource not found"));
+ }
+
+ @Test
+ public void updateUser_passing_full_object_happyPath() throws PubNubException {
+ // given
+ String updatedName = "updatedName" + randomName();
+ String updatedEmail = "updatedEmail" + randomEmail();
+ String updatedProfileUrl = "updatedProfileUrl" + randomProfileUrl();
+ String updatedExternalId = "updatedExternalId" + randomExternalId();
+ Map updatedCustom = updatedCustomUserObject();
+ String updatedStatus = "updatedStatus" + STATUS_ACTIVE;
+ String updatedType = "updatedType" + TYPE_HUMAN;
+
+ pubNubUnderTest.createUser()
+ .userId(randomUserId)
+ .name(randomName)
+ .email(randomEmail)
+ .profileUrl(randomProfileUrl)
+ .externalId(randomExternalId)
+ .custom(customUserObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ // when
+ User userAfterUpdate = pubNubUnderTest.updateUser()
+ .userId(randomUserId)
+ .name(updatedName)
+ .email(updatedEmail)
+ .profileUrl(updatedProfileUrl)
+ .externalId(updatedExternalId)
+ .custom(updatedCustom)
+ .includeCustom(true)
+ .status(updatedStatus)
+ .type(updatedType)
+ .sync();
+
+ // then
+ assertNotNull(userAfterUpdate);
+ assertEquals(randomUserIdValue, userAfterUpdate.getId().getValue());
+ assertEquals(updatedName, userAfterUpdate.getName());
+ assertEquals(updatedEmail, userAfterUpdate.getEmail());
+ assertEquals(updatedProfileUrl, userAfterUpdate.getProfileUrl());
+ assertEquals(updatedExternalId, userAfterUpdate.getExternalId());
+ assertEquals("val1_updated", userAfterUpdate.getCustom().get("param1"));
+ assertEquals("val2_updated", userAfterUpdate.getCustom().get("param2").toString());
+ assertEquals("added", userAfterUpdate.getCustom().get("param3").toString());
+ assertEquals(updatedStatus, userAfterUpdate.getStatus());
+ assertEquals(updatedType, userAfterUpdate.getType());
+// assertNotNull(userAfterUpdate.getUpdated()); //waiting for https://pubnub.atlassian.net/browse/ENG-4203
+// assertNotNull(userAfterUpdate.getETag());
+
+ User user = pubNubUnderTest.fetchUser()
+ .userId(randomUserId)
+ .includeCustom(true)
+ .sync();
+
+ assertNotNull(user);
+ assertEquals(randomUserIdValue, user.getId().getValue());
+ assertEquals(updatedName, user.getName());
+ assertEquals(updatedEmail, user.getEmail());
+ assertEquals(updatedProfileUrl, user.getProfileUrl());
+ assertEquals(updatedExternalId, user.getExternalId());
+ assertNotNull(user.getCustom());
+ assertEquals(updatedStatus, user.getStatus());
+ assertEquals(updatedType, user.getType());
+// assertNotNull(user.getUpdated()); waiting on https://pubnub.atlassian.net/browse/ENG-4203
+// assertNotNull(user.getETag());
+ }
+
+ @Test(expected = PubNubException.class)
+ public void updateUser_should_throw_exception_when_updating_user_that_does_not_exist() throws PubNubException {
+ // given
+ String updatedName = "updatedName" + randomName();
+
+ // when
+ User user = pubNubUnderTest.updateUser()
+ .userId(randomUserId)
+ .name(updatedName)
+ .sync();
+
+ //then
+ assertEquals(randomUserIdValue, user.getId());
+ assertEquals(updatedName, user.getName());
+ }
+
+ @Test
+ public void upsertUserHappyPath_newUserCreated() throws PubNubException {
+ //given
+
+ //when
+ User user = pubNubUnderTest.upsertUser()
+ .userId(randomUserId)
+ .name(randomName)
+ .email(randomEmail)
+ .profileUrl(randomProfileUrl)
+ .externalId(randomExternalId)
+ .custom(customUserObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //then
+ assertNotNull(user);
+ assertEquals(randomUserIdValue, user.getId().getValue());
+ assertEquals(randomName, user.getName());
+ assertEquals(randomEmail, user.getEmail());
+ assertEquals(randomProfileUrl, user.getProfileUrl());
+ assertEquals(randomExternalId, user.getExternalId());
+ assertNotNull(user.getCustom());
+ assertEquals(STATUS_ACTIVE, user.getStatus());
+ assertEquals(TYPE_HUMAN, user.getType());
+// assertNotNull(user.getUpdated());
+// assertNotNull(user.getETag());
+ }
+
+ @Test
+ public void upsertUserHappyPath_existingUserUpdated() throws PubNubException {
+ //given
+ String updatedName = "updatedName" + randomName();
+ String updatedEmail = "updatedEmail" + randomEmail();
+ String updatedProfileUrl = "updatedProfileUrl" + randomProfileUrl();
+ String updatedExternalId = "updatedExternalId" + randomExternalId();
+ Map updateCustom = updatedCustomUserObject();
+ String updatedStatus = "updatedStatus" + STATUS_ACTIVE;
+ String updatedType = "updatedType" + TYPE_HUMAN;
+
+ pubNubUnderTest.createUser()
+ .userId(randomUserId)
+ .name(randomName)
+ .email(randomEmail)
+ .profileUrl(randomProfileUrl)
+ .externalId(randomExternalId)
+ .custom(customUserObject())
+ .includeCustom(true)
+ .status(STATUS_ACTIVE)
+ .type(TYPE_HUMAN)
+ .sync();
+
+ //when
+ User user = pubNubUnderTest.upsertUser()
+ .userId(randomUserId)
+ .name(updatedName)
+ .email(updatedEmail)
+ .profileUrl(updatedProfileUrl)
+ .externalId(updatedExternalId)
+ .custom(updateCustom)
+ .includeCustom(true)
+ .status(updatedStatus)
+ .type(updatedType)
+ .sync();
+
+ //then
+ assertNotNull(user);
+ assertEquals(randomUserIdValue, user.getId().getValue());
+ assertEquals(updatedName, user.getName());
+ assertEquals(updatedEmail, user.getEmail());
+ assertEquals(updatedProfileUrl, user.getProfileUrl());
+ assertEquals(updatedExternalId, user.getExternalId());
+ assertEquals("val1_updated", user.getCustom().get("param1").toString());
+ assertEquals("val2_updated", user.getCustom().get("param2").toString());
+ assertEquals("added", user.getCustom().get("param3").toString());
+ assertEquals(updatedStatus, user.getStatus());
+ assertEquals(updatedType, user.getType());
+// assertNotNull(user.getUpdated());
+// assertNotNull(user.getETag());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ pubNubUnderTest.removeUser()
+ .userId(randomUserId)
+ .sync();
+ }
+
+ private String getRandomUserIdValue() {
+ return "userId" + new Random().nextInt(100000);
+ }
+
+ private String randomExternalId() {
+ return UUID.randomUUID().toString();
+ }
+
+ private String randomEmail() {
+ return RandomStringUtils.randomAlphabetic(6) + "@example.com";
+ }
+
+ private String randomProfileUrl() {
+ return "http://" + RandomStringUtils.randomAlphabetic(5, 15) + ".com";
+ }
+}
diff --git a/src/main/java/com/pubnub/api/PubNub.java b/src/main/java/com/pubnub/api/PubNub.java
index cb23884aa..706efb632 100644
--- a/src/main/java/com/pubnub/api/PubNub.java
+++ b/src/main/java/com/pubnub/api/PubNub.java
@@ -44,6 +44,16 @@
import com.pubnub.api.endpoints.objects_api.uuid.GetUUIDMetadata;
import com.pubnub.api.endpoints.objects_api.uuid.RemoveUUIDMetadata;
import com.pubnub.api.endpoints.objects_api.uuid.SetUUIDMetadata;
+import com.pubnub.api.endpoints.objects_vsp.space.CreateSpace;
+import com.pubnub.api.endpoints.objects_vsp.space.FetchSpace;
+import com.pubnub.api.endpoints.objects_vsp.space.RemoveSpace;
+import com.pubnub.api.endpoints.objects_vsp.space.UpdateSpace;
+import com.pubnub.api.endpoints.objects_vsp.space.UpsertSpace;
+import com.pubnub.api.endpoints.objects_vsp.user.CreateUser;
+import com.pubnub.api.endpoints.objects_vsp.user.FetchUser;
+import com.pubnub.api.endpoints.objects_vsp.user.RemoveUser;
+import com.pubnub.api.endpoints.objects_vsp.user.UpdateUser;
+import com.pubnub.api.endpoints.objects_vsp.user.UpsertUser;
import com.pubnub.api.endpoints.presence.GetState;
import com.pubnub.api.endpoints.presence.HereNow;
import com.pubnub.api.endpoints.presence.SetState;
@@ -303,6 +313,34 @@ public DeleteChannelGroup deleteChannelGroup() {
// Start Objects API
+ @NotNull
+ public CreateUser createUser() {
+ return CreateUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public FetchUser fetchUser() {
+ return FetchUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public UpdateUser updateUser() {
+ return UpdateUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public UpsertUser upsertUser() {
+ return UpsertUser.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public RemoveUser removeUser() {
+ return new RemoveUser(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ /**
+ * @deprecated Use {@link #createUser()} or {@link #updateUser()} or {@link #upsertUser()} instead.
+ */
public SetUUIDMetadata setUUIDMetadata() {
return SetUUIDMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
@@ -312,16 +350,50 @@ public GetAllUUIDMetadata getAllUUIDMetadata() {
return GetAllUUIDMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
+ /**
+ * @deprecated Use {@link #fetchUser()} instead.
+ */
@NotNull
public GetUUIDMetadata getUUIDMetadata() {
return GetUUIDMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
+ /**
+ * @deprecated Use {@link #removeUser()} instead.
+ */
@NotNull
public RemoveUUIDMetadata removeUUIDMetadata() {
return new RemoveUUIDMetadata(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
+ @NotNull
+ public CreateSpace createSpace(@NotNull SpaceId spaceId) {
+ return CreateSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public FetchSpace fetchSpace(@NotNull SpaceId spaceId) {
+ return FetchSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public UpdateSpace updateSpace(@NotNull SpaceId spaceId) {
+ return UpdateSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public UpsertSpace upsertSpace(@NotNull SpaceId spaceId) {
+ return UpsertSpace.create(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ @NotNull
+ public RemoveSpace removeSpace(@NotNull SpaceId spaceId) {
+ return new RemoveSpace(spaceId, this, this.telemetryManager, this.retrofitManager, this.tokenManager);
+ }
+
+ /**
+ * @deprecated Use {@link #createSpace(SpaceId)} or {@link #updateSpace(SpaceId)} or {@link #upsertSpace(SpaceId)} instead.
+ */
public SetChannelMetadata.Builder setChannelMetadata() {
return SetChannelMetadata.builder(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
@@ -331,11 +403,17 @@ public GetAllChannelsMetadata getAllChannelsMetadata() {
return GetAllChannelsMetadata.create(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
+ /**
+ * @deprecated Use {@link #fetchSpace(SpaceId)} instead.
+ */
@NotNull
public GetChannelMetadata.Builder getChannelMetadata() {
return GetChannelMetadata.builder(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
+ /**
+ * @deprecated Use {@link #removeSpace(SpaceId)} instead.
+ */
public RemoveChannelMetadata.Builder removeChannelMetadata() {
return RemoveChannelMetadata.builder(this, this.telemetryManager, this.retrofitManager, this.tokenManager);
}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java b/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java
index 2c7104193..331405523 100644
--- a/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java
+++ b/src/main/java/com/pubnub/api/endpoints/objects_api/utils/Include.java
@@ -1,6 +1,7 @@
package com.pubnub.api.endpoints.objects_api.utils;
import com.pubnub.api.endpoints.Endpoint;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
import java.util.ArrayList;
import java.util.Collection;
@@ -17,11 +18,11 @@ public class Include implements ParameterEnricher {
static final String INCLUDE_UUID_PARAM_VALUE = "uuid";
static final String INCLUDE_UUID_CUSTOM_PARAM_VALUE = "uuid.custom";
- public interface CustomIncludeAware> {
+ public interface CustomIncludeAware> {
T includeCustom(boolean includeCustom);
}
- public interface HavingCustomInclude>
+ public interface HavingCustomInclude>
extends CustomIncludeAware, HavingCompositeParameterEnricher {
@Override
default T includeCustom(boolean includeCustom) {
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpace.java
new file mode 100644
index 000000000..db17d5c01
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpace.java
@@ -0,0 +1,37 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+
+import java.util.Map;
+
+public interface CreateSpace extends RemoteAction, CustomIncludeAware {
+
+ static CreateSpace create(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new CreateSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ CreateSpace name(String name);
+
+ CreateSpace description(String description);
+
+ CreateSpace custom(Map custom);
+
+ CreateSpace status(String status);
+
+ CreateSpace type(String type);
+
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpaceCommand.java
new file mode 100644
index 000000000..52a372a06
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/CreateSpaceCommand.java
@@ -0,0 +1,83 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import com.pubnub.api.models.server.objects_vsp.space.CreateSpacePayload;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+final class CreateSpaceCommand extends ObjectApiEndpoint, Space> implements CreateSpace, HavingCustomInclude {
+ private final SpaceId spaceId;
+ @Setter
+ private String name;
+ @Setter
+ private String description;
+ @Setter
+ private Map custom;
+ @Setter
+ private String status;
+ @Setter
+ private String type;
+
+ CreateSpaceCommand(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ this.spaceId = spaceId;
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson
+ final HashMap customHashMap = new HashMap<>();
+ if (custom != null) {
+ customHashMap.putAll(custom);
+ }
+
+ final CreateSpacePayload createSpacePayload = new CreateSpacePayload(name, description, customHashMap, status, type);
+ String subscribeKey = getPubnub().getConfiguration().getSubscribeKey();
+ return getRetrofit()
+ .getSpaceService()
+ .createSpace(subscribeKey, spaceId.getValue(), createSpacePayload, effectiveParams);
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+
+ @Override
+ protected Space createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNCreateSpaceOperation;
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpace.java
new file mode 100644
index 000000000..497fb9249
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpace.java
@@ -0,0 +1,24 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+
+public interface FetchSpace extends RemoteAction, CustomIncludeAware {
+
+ static FetchSpace create(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new FetchSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceCommand.java
new file mode 100644
index 000000000..528987ea5
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/FetchSpaceCommand.java
@@ -0,0 +1,60 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.Map;
+
+final class FetchSpaceCommand extends ObjectApiEndpoint, Space> implements FetchSpace, HavingCustomInclude {
+ private SpaceId spaceId;
+
+ FetchSpaceCommand(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ this.spaceId = spaceId;
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ return getRetrofit()
+ .getSpaceService()
+ .fetchSpace(getPubnub().getConfiguration().getSubscribeKey(), spaceId.getValue(), effectiveParams);
+ }
+
+ @Override
+ protected Space createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNFetchSpaceOperation;
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpace.java
new file mode 100644
index 000000000..6a9902b17
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/RemoveSpace.java
@@ -0,0 +1,52 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.google.gson.JsonElement;
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.RemoveSpaceResult;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.Collections;
+import java.util.Map;
+
+public class RemoveSpace extends ObjectApiEndpoint, RemoveSpaceResult> {
+ private SpaceId spaceId;
+
+ public RemoveSpace(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetry,
+ final RetrofitManager retrofitInstance,
+ final TokenManager tokenManager) {
+ super(pubNub, telemetry, retrofitInstance, CompositeParameterEnricher.createDefault(), tokenManager);
+ this.spaceId = spaceId;
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ return getRetrofit()
+ .getSpaceService()
+ .removeSpace(getPubnub().getConfiguration().getSubscribeKey(), spaceId.getValue(), Collections.emptyMap());
+ }
+
+ @Override
+ protected RemoveSpaceResult createResponse(Response> input) throws PubNubException {
+ int status = input.body().getStatus();
+ return new RemoveSpaceResult(status);
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNRemoveUserOperation;
+ }
+
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpace.java
new file mode 100644
index 000000000..0d5ab8a13
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpace.java
@@ -0,0 +1,37 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+
+import java.util.Map;
+
+public interface UpdateSpace extends RemoteAction, CustomIncludeAware {
+
+ static UpdateSpace create(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new UpdateSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ UpdateSpace name(String name);
+
+ UpdateSpace description(String description);
+
+ UpdateSpace custom(Map custom);
+
+ UpdateSpace status(String status);
+
+ UpdateSpace type(String type);
+
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceCommand.java
new file mode 100644
index 000000000..d2845ca1e
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpdateSpaceCommand.java
@@ -0,0 +1,84 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import com.pubnub.api.models.server.objects_vsp.space.UpdateSpacePayload;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+final class UpdateSpaceCommand extends ObjectApiEndpoint, Space> implements UpdateSpace, HavingCustomInclude {
+ private final SpaceId spaceId;
+ @Setter
+ private String name;
+ @Setter
+ private String description;
+ @Setter
+ private Map custom;
+ @Setter
+ private String status;
+ @Setter
+ private String type;
+
+ UpdateSpaceCommand(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ this.spaceId = spaceId;
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson
+ final HashMap customHashMap = new HashMap<>();
+ if (custom != null) {
+ customHashMap.putAll(custom);
+ }
+
+ final UpdateSpacePayload updateSpacePayload = new UpdateSpacePayload(name, description, customHashMap, status, type);
+
+ String subscribeKey = getPubnub().getConfiguration().getSubscribeKey();
+ return getRetrofit()
+ .getSpaceService()
+ .updateSpace(subscribeKey, spaceId.getValue(), updateSpacePayload, effectiveParams);
+ }
+
+ @Override
+ protected Space createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNUpdateSpaceOperation;
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpace.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpace.java
new file mode 100644
index 000000000..998d39597
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpace.java
@@ -0,0 +1,36 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+
+import java.util.Map;
+
+public interface UpsertSpace extends RemoteAction, CustomIncludeAware {
+
+ static UpsertSpace create(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new UpsertSpaceCommand(spaceId, pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ UpsertSpace name(String name);
+
+ UpsertSpace description(String description);
+
+ UpsertSpace custom(Map custom);
+
+ UpsertSpace status(String status);
+
+ UpsertSpace type(String type);
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceCommand.java
new file mode 100644
index 000000000..330cfb2dc
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/space/UpsertSpaceCommand.java
@@ -0,0 +1,81 @@
+package com.pubnub.api.endpoints.objects_vsp.space;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.SpaceId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.space.Space;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import com.pubnub.api.models.server.objects_vsp.space.UpsertSpacePayload;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+final class UpsertSpaceCommand extends ObjectApiEndpoint, Space> implements UpsertSpace, HavingCustomInclude {
+ private final SpaceId spaceId;
+ @Setter
+ private String name;
+ @Setter
+ private String description;
+ @Setter
+ private Map custom;
+ @Setter
+ private String status;
+ @Setter
+ private String type;
+
+ UpsertSpaceCommand(
+ final SpaceId spaceId,
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ this.spaceId = spaceId;
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ final HashMap customHashMap = new HashMap<>();
+ if (custom != null) {
+ customHashMap.putAll(custom);
+ }
+
+ final UpsertSpacePayload upsertUserPayload = new UpsertSpacePayload(name, description, customHashMap, status, type);
+
+ String subscribeKey = getPubnub().getConfiguration().getSubscribeKey();
+ return getRetrofit().getSpaceService().upsertSpace(subscribeKey, spaceId.getValue(), upsertUserPayload, effectiveParams);
+ }
+
+ @Override
+ protected Space createResponse(Response> input) throws PubNubException {
+ if (input != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNUpsertSpaceOperation;
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUser.java
new file mode 100644
index 000000000..e4e7675c1
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUser.java
@@ -0,0 +1,41 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.UserId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+
+import java.util.Map;
+
+public interface CreateUser extends RemoteAction, CustomIncludeAware {
+
+ static CreateUser create(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new CreateUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ CreateUser userId(UserId userId);
+
+ CreateUser name(String name);
+
+ CreateUser email(String email);
+
+ CreateUser profileUrl(String profileUrl);
+
+ CreateUser externalId(String externalId);
+
+ CreateUser custom(Map custom);
+
+ CreateUser status(String status);
+
+ CreateUser type(String type);
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserCommand.java
new file mode 100644
index 000000000..30be74c7e
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/CreateUserCommand.java
@@ -0,0 +1,95 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.UserId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import com.pubnub.api.models.server.objects_vsp.user.CreateUserPayload;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+final class CreateUserCommand extends ObjectApiEndpoint, User> implements CreateUser, HavingCustomInclude {
+ @Setter
+ private UserId userId;
+ @Setter
+ private String name;
+ @Setter
+ private String email;
+ @Setter
+ private String profileUrl;
+ @Setter
+ private String externalId;
+ @Setter
+ private Map custom;
+ @Setter
+ private String status;
+ @Setter
+ private String type;
+
+ CreateUserCommand(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson
+ final HashMap customHashMap = new HashMap<>();
+ if (custom != null) {
+ customHashMap.putAll(custom);
+ }
+
+ final CreateUserPayload createUserPayload = new CreateUserPayload(name, email, externalId, profileUrl, customHashMap, status, type);
+ String subscribeKey = getPubnub().getConfiguration().getSubscribeKey();
+ return getRetrofit()
+ .getUserService()
+ .createUser(subscribeKey, effectiveUserId().getValue(), createUserPayload, effectiveParams);
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+
+ @Override
+ protected User createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNCreateUserOperation;
+ }
+
+ private UserId effectiveUserId() {
+ try {
+ return (userId != null) ? userId : getPubnub().getConfiguration().getUserId();
+ } catch (PubNubException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUser.java
new file mode 100644
index 000000000..34a11dda9
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUser.java
@@ -0,0 +1,28 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.UserId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+import lombok.experimental.Accessors;
+
+@Accessors(chain = true, fluent = true)
+public interface FetchUser extends RemoteAction, CustomIncludeAware {
+
+ static FetchUser create(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new FetchUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ FetchUser userId(UserId userId);
+
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserCommand.java
new file mode 100644
index 000000000..d023daf21
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/FetchUserCommand.java
@@ -0,0 +1,70 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.UserId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+final class FetchUserCommand extends ObjectApiEndpoint, User> implements FetchUser, HavingCustomInclude {
+ @Setter
+ private UserId userId;
+
+ FetchUserCommand(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ return getRetrofit()
+ .getUserService()
+ .fetchUser(getPubnub().getConfiguration().getSubscribeKey(), effectiveUserId().getValue(), effectiveParams);
+ }
+
+ @Override
+ protected User createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNFetchUserOperation;
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+
+ protected UserId effectiveUserId() {
+ try {
+ return (userId != null) ? userId : getPubnub().getConfiguration().getUserId();
+ } catch (PubNubException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUser.java
new file mode 100644
index 000000000..51601d9eb
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/RemoveUser.java
@@ -0,0 +1,60 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.google.gson.JsonElement;
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.UserId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.RemoveUserResult;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.Collections;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+public class RemoveUser extends ObjectApiEndpoint, RemoveUserResult> {
+ @Setter
+ private UserId userId;
+
+ public RemoveUser(
+ final PubNub pubnubInstance,
+ final TelemetryManager telemetry,
+ final RetrofitManager retrofitInstance,
+ final TokenManager tokenManager) {
+ super(pubnubInstance, telemetry, retrofitInstance, CompositeParameterEnricher.createDefault(), tokenManager);
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ return getRetrofit()
+ .getUserService()
+ .removeUser(getPubnub().getConfiguration().getSubscribeKey(), effectiveUserId().getValue(), Collections.emptyMap());
+ }
+
+ @Override
+ protected RemoveUserResult createResponse(Response> input) throws PubNubException {
+ return new RemoveUserResult(input.body());
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNRemoveUserOperation;
+ }
+
+ private UserId effectiveUserId() {
+ try {
+ return (userId != null) ? userId : getPubnub().getConfiguration().getUserId();
+ } catch (PubNubException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUser.java
new file mode 100644
index 000000000..1dab54d3c
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUser.java
@@ -0,0 +1,41 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.UserId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+
+import java.util.Map;
+
+public interface UpdateUser extends RemoteAction, CustomIncludeAware {
+
+ static UpdateUser create(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new UpdateUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ UpdateUser userId(UserId userId);
+
+ UpdateUser name(String name);
+
+ UpdateUser email(String email);
+
+ UpdateUser profileUrl(String profileUrl);
+
+ UpdateUser externalId(String externalId);
+
+ UpdateUser custom(Map custom);
+
+ UpdateUser status(String status);
+
+ UpdateUser type(String type);
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserCommand.java
new file mode 100644
index 000000000..e71e576e3
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpdateUserCommand.java
@@ -0,0 +1,95 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.UserId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import com.pubnub.api.models.server.objects_vsp.user.UpdateUserPayload;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+class UpdateUserCommand extends ObjectApiEndpoint, User> implements UpdateUser, HavingCustomInclude {
+ @Setter
+ private UserId userId;
+ @Setter
+ private String name;
+ @Setter
+ private String email;
+ @Setter
+ private String profileUrl;
+ @Setter
+ private String externalId;
+ @Setter
+ private Map custom;
+ @Setter
+ private String status;
+ @Setter
+ private String type;
+
+ UpdateUserCommand(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ //This is workaround to accept custom maps that are instances of anonymous classes not handled by gson
+ final HashMap customHashMap = new HashMap<>();
+ if (custom != null) {
+ customHashMap.putAll(custom);
+ }
+
+ final UpdateUserPayload updateUserPayload = new UpdateUserPayload(name, email, externalId, profileUrl, customHashMap, status, type);
+
+ String subscribeKey = getPubnub().getConfiguration().getSubscribeKey();
+ return getRetrofit()
+ .getUserService()
+ .updateUser(subscribeKey, effectiveUserId().getValue(), updateUserPayload, effectiveParams);
+ }
+
+ @Override
+ protected User createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNUpdateUserOperation;
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+
+ private UserId effectiveUserId() {
+ try {
+ return (userId != null) ? userId : getPubnub().getConfiguration().getUserId();
+ } catch (PubNubException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUser.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUser.java
new file mode 100644
index 000000000..ed0ffcafb
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUser.java
@@ -0,0 +1,41 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.UserId;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.utils.Include.CustomIncludeAware;
+import com.pubnub.api.endpoints.remoteaction.RemoteAction;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+
+import java.util.Map;
+
+public interface UpsertUser extends RemoteAction, CustomIncludeAware {
+
+ static UpsertUser create(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager) {
+ final CompositeParameterEnricher compositeParameterEnricher = CompositeParameterEnricher.createDefault();
+ return new UpsertUserCommand(pubNub, telemetryManager, retrofitManager, tokenManager, compositeParameterEnricher);
+ }
+
+ UpsertUser userId(UserId userId);
+
+ UpsertUser name(String name);
+
+ UpsertUser email(String email);
+
+ UpsertUser profileUrl(String profileUrl);
+
+ UpsertUser externalId(String externalId);
+
+ UpsertUser custom(Map custom);
+
+ UpsertUser status(String status);
+
+ UpsertUser type(String type);
+}
diff --git a/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserCommand.java b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserCommand.java
new file mode 100644
index 000000000..45c7ce23c
--- /dev/null
+++ b/src/main/java/com/pubnub/api/endpoints/objects_vsp/user/UpsertUserCommand.java
@@ -0,0 +1,92 @@
+package com.pubnub.api.endpoints.objects_vsp.user;
+
+import com.pubnub.api.PubNub;
+import com.pubnub.api.PubNubException;
+import com.pubnub.api.UserId;
+import com.pubnub.api.builder.PubNubErrorBuilder;
+import com.pubnub.api.endpoints.objects_api.CompositeParameterEnricher;
+import com.pubnub.api.endpoints.objects_api.ObjectApiEndpoint;
+import com.pubnub.api.endpoints.objects_api.utils.Include.HavingCustomInclude;
+import com.pubnub.api.enums.PNOperationType;
+import com.pubnub.api.managers.RetrofitManager;
+import com.pubnub.api.managers.TelemetryManager;
+import com.pubnub.api.managers.token_manager.TokenManager;
+import com.pubnub.api.models.consumer.objects_vsp.user.User;
+import com.pubnub.api.models.server.objects_api.EntityEnvelope;
+import com.pubnub.api.models.server.objects_vsp.user.UpsertUserPayload;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import retrofit2.Call;
+import retrofit2.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Accessors(chain = true, fluent = true)
+class UpsertUserCommand extends ObjectApiEndpoint, User> implements UpsertUser, HavingCustomInclude {
+ @Setter
+ private UserId userId;
+ @Setter
+ private String name;
+ @Setter
+ private String email;
+ @Setter
+ private String profileUrl;
+ @Setter
+ private String externalId;
+ @Setter
+ private Map custom;
+ @Setter
+ private String status;
+ @Setter
+ private String type;
+
+ UpsertUserCommand(
+ final PubNub pubNub,
+ final TelemetryManager telemetryManager,
+ final RetrofitManager retrofitManager,
+ final TokenManager tokenManager,
+ final CompositeParameterEnricher compositeParameterEnricher) {
+ super(pubNub, telemetryManager, retrofitManager, compositeParameterEnricher, tokenManager);
+ }
+
+ @Override
+ protected Call> executeCommand(Map effectiveParams) throws PubNubException {
+ final HashMap customHashMap = new HashMap<>();
+ if (custom != null) {
+ customHashMap.putAll(custom);
+ }
+
+ final UpsertUserPayload upsertUserPayload = new UpsertUserPayload(name, email, externalId, profileUrl, customHashMap, status, type);
+
+ String subscribeKey = getPubnub().getConfiguration().getSubscribeKey();
+ return getRetrofit().getUserService().upsertUser(subscribeKey, effectiveUserId().getValue(), upsertUserPayload, effectiveParams);
+ }
+
+ @Override
+ protected User createResponse(Response> input) throws PubNubException {
+ if (input.body() != null) {
+ return input.body().getData();
+ } else {
+ throw PubNubException.builder().pubnubError(PubNubErrorBuilder.PNERROBJ_INTERNAL_ERROR).build();
+ }
+ }
+
+ @Override
+ protected PNOperationType getOperationType() {
+ return PNOperationType.PNUpsertUserOperation;
+ }
+
+ @Override
+ public CompositeParameterEnricher getCompositeParameterEnricher() {
+ return super.getCompositeParameterEnricher();
+ }
+
+ private UserId effectiveUserId() {
+ try {
+ return (userId != null) ? userId : getPubnub().getConfiguration().getUserId();
+ } catch (PubNubException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/pubnub/api/enums/PNOperationType.java b/src/main/java/com/pubnub/api/enums/PNOperationType.java
index 11ed56e76..961a06ef7 100644
--- a/src/main/java/com/pubnub/api/enums/PNOperationType.java
+++ b/src/main/java/com/pubnub/api/enums/PNOperationType.java
@@ -42,6 +42,20 @@ public enum PNOperationType {
PNGetAllUuidMetadataOperation,
PNRemoveUuidMetadataOperation,
+ // User - VSP
+ PNCreateUserOperation,
+ PNFetchUserOperation,
+ PNRemoveUserOperation,
+ PNUpdateUserOperation,
+ PNUpsertUserOperation,
+
+ // Space - VSP
+ PNCreateSpaceOperation,
+ PNFetchSpaceOperation,
+ PNRemoveSpaceOperation,
+ PNUpdateSpaceOperation,
+ PNUpsertSpaceOperation,
+
// Channel Metadata
PNSetChannelMetadataOperation,
PNGetChannelMetadataOperation,
diff --git a/src/main/java/com/pubnub/api/managers/RetrofitManager.java b/src/main/java/com/pubnub/api/managers/RetrofitManager.java
index ed9dd1a43..050b639ca 100644
--- a/src/main/java/com/pubnub/api/managers/RetrofitManager.java
+++ b/src/main/java/com/pubnub/api/managers/RetrofitManager.java
@@ -9,6 +9,8 @@
import com.pubnub.api.interceptors.SignatureInterceptor;
import com.pubnub.api.models.consumer.PNStatus;
import com.pubnub.api.services.*;
+import com.pubnub.api.services.vsp.SpaceService;
+import com.pubnub.api.services.vsp.UserService;
import lombok.Getter;
import okhttp3.Dispatcher;
import okhttp3.OkHttpClient;
@@ -56,6 +58,10 @@ public class RetrofitManager {
@Getter
private UUIDMetadataService uuidMetadataService;
@Getter
+ private UserService userService;
+ @Getter
+ private SpaceService spaceService;
+ @Getter
private ChannelMetadataService channelMetadataService;
@Getter
private MessageActionService messageActionService;
@@ -154,6 +160,8 @@ public void run() {
this.s3Service = noSignatureInstance.create(S3Service.class);
this.extendedPresenceService = transactionInstance.create(ExtendedPresenceService.class);
+ this.userService = transactionInstance.create(UserService.class);
+ this.spaceService = transactionInstance.create(SpaceService.class);
}
private OkHttpClient.Builder prepareOkHttpClient(int requestTimeout, int connectTimeOut) {
diff --git a/src/main/java/com/pubnub/api/managers/TelemetryManager.java b/src/main/java/com/pubnub/api/managers/TelemetryManager.java
index cfeb50964..6d75a9f85 100644
--- a/src/main/java/com/pubnub/api/managers/TelemetryManager.java
+++ b/src/main/java/com/pubnub/api/managers/TelemetryManager.java
@@ -181,6 +181,16 @@ private static String endpointNameForOperation(PNOperationType type) {
case PNGetChannelMembersOperation:
case PNRemoveChannelMembersOperation:
case PNManageChannelMembersOperation:
+ case PNCreateUserOperation:
+ case PNRemoveUserOperation:
+ case PNFetchUserOperation:
+ case PNUpdateUserOperation:
+ case PNUpsertUserOperation:
+ case PNCreateSpaceOperation:
+ case PNRemoveSpaceOperation:
+ case PNFetchSpaceOperation:
+ case PNUpdateSpaceOperation:
+ case PNUpsertSpaceOperation:
endpoint = "obj";
break;
case PNAccessManagerGrantToken:
diff --git a/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java b/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java
index d6d57593e..2a35db30c 100644
--- a/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java
+++ b/src/main/java/com/pubnub/api/models/consumer/objects_api/util/CustomPayloadJsonInterceptor.java
@@ -10,12 +10,14 @@
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
+import java.util.Map;
public class CustomPayloadJsonInterceptor implements JsonDeserializer