From ac753dcaac20ffb91b93d6a42ccaf5ce732b53e2 Mon Sep 17 00:00:00 2001
From: Mihai Cosmin Danaila <mihaicosmin.danaila@ethz.ch>
Date: Mon, 27 Nov 2023 10:52:20 +0100
Subject: [PATCH] SSDM-14194: AdminUI improved error message on already
 existing userid creation

---
 .../executor/person/CreatePersonExecutor.java | 13 ++++++++
 .../systemtest/asapi/v3/CreatePersonTest.java | 33 +++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/person/CreatePersonExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/person/CreatePersonExecutor.java
index bb443f97d41..93903e647a5 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/person/CreatePersonExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/person/CreatePersonExecutor.java
@@ -202,6 +202,19 @@ public class CreatePersonExecutor
         {
             try
             {
+                PersonPE systemUser = daoFactory.getPersonDAO().tryFindPersonByUserId(PersonPE.SYSTEM_USER_ID);
+                if (systemUser == null)
+                {
+                    throw new UserFailureException(
+                            "Couldn't find system user with default settings in the DB.");
+                }
+
+                PersonPE existingPerson = daoFactory.getPersonDAO().tryFindPersonByUserId(person.getUserId());
+                if (existingPerson != null){
+                    throw new UserFailureException(
+                            "User with User Id [" + person.getUserId() + "] already exists!"
+                    );
+                }
                 daoFactory.getPersonDAO().createPerson(person);
             } catch (final DataAccessException e)
             {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePersonTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePersonTest.java
index 019811fd2e0..61a3555ffb4 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePersonTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePersonTest.java
@@ -20,6 +20,7 @@ import static org.testng.Assert.assertEquals;
 import java.util.Arrays;
 import java.util.List;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -58,6 +59,38 @@ public class CreatePersonTest extends AbstractTest
         assertEquals(person.getSpace().getCode(), "CISD");
     }
 
+    @Test
+    public void testCreateExistingPerson()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        PersonCreation personCreation = new PersonCreation();
+        personCreation.setUserId("user-existing");
+        // When
+        List<PersonPermId> persons = v3api.createPersons(sessionToken, List.of(personCreation));
+
+        // Then
+        assertEquals(persons.toString(), "[" + personCreation.getUserId() + "]");
+        PersonFetchOptions fetchOptions = new PersonFetchOptions();
+        fetchOptions.withRegistrator();
+        Person person = v3api.getPersons(sessionToken, persons, fetchOptions).get(persons.get(0));
+        assertEquals(person.getUserId(), personCreation.getUserId());
+        assertEquals(person.getRegistrator().getUserId(), TEST_USER);
+
+        // Given
+        PersonCreation existingPersonCreation = new PersonCreation();
+        existingPersonCreation.setUserId("user-existing");
+        // When
+
+        try
+        {
+            List<PersonPermId> existingPersons = v3api.createPersons(sessionToken, List.of(existingPersonCreation));
+        } catch (UserFailureException e)
+        {
+            assertEquals("User with User Id [" + existingPersonCreation.getUserId() + "] already exists! (Context: [])", e.getMessage());
+        }
+    }
+
     @Test(dataProvider = "usersNotAllowedToCreatePersons")
     public void testCreateWithUserCausingAuthorizationFailure(final String user)
     {
-- 
GitLab