From 9506936504630fc24ce8843151b861ee55edfbe5 Mon Sep 17 00:00:00 2001
From: Larbi Gharib <larbi.gharib@savoirfairelinux.com>
Date: Thu, 22 Sep 2022 14:27:24 +0200
Subject: [PATCH] Added conversationId to contact

Change-Id: I615f8d4865c362b6aa96af3398193abac28ef631
---
 .../java/net/jami/datastore/dao/ContactDao.java     |  4 ++--
 .../main/resources/db/migration/V31__Contacts.sql   |  1 +
 .../jami/jams/common/objects/contacts/Contact.java  |  3 +++
 .../serialization/serializers/ContactCodec.java     |  5 ++++-
 .../jams/common/objects/contacts/ContactTest.java   |  8 ++++++--
 jams-react-client/src/views/Contacts/Contacts.js    | 13 +++++++++++++
 6 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java b/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java
index df1a2cbf..c429f5e1 100644
--- a/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java
+++ b/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java
@@ -67,8 +67,8 @@ public class ContactDao extends AbstractDao<Contact> {
             PreparedStatement ps = connection.getConnection().prepareStatement(delete);
             ps.setString(1, contactList.get(0).getOwner());
             ps.executeUpdate();
-            String insert = "INSERT INTO contacts (owner, uri, displayName, timestamp, status,banned,confirmed) VALUES " +
-                "(?, ?, ?, ?, ?,?,?)";
+            String insert = "INSERT INTO contacts (owner, uri, displayName, timestamp, status, banned, confirmed, conversationId) VALUES " +
+                "(?, ?, ?, ?, ?, ?, ?, ?)";
             for (Contact contact : contactList) {
                 ps = connection.getConnection().prepareStatement(insert);
                 contact.getInsert(ps);
diff --git a/datastore/src/main/resources/db/migration/V31__Contacts.sql b/datastore/src/main/resources/db/migration/V31__Contacts.sql
index e69de29b..fdc6655b 100644
--- a/datastore/src/main/resources/db/migration/V31__Contacts.sql
+++ b/datastore/src/main/resources/db/migration/V31__Contacts.sql
@@ -0,0 +1 @@
+ALTER TABLE contacts ADD COLUMN conversationId varchar(255);
\ No newline at end of file
diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java b/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java
index b25d2e1b..b7d71c16 100644
--- a/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java
+++ b/jams-common/src/main/java/net/jami/jams/common/objects/contacts/Contact.java
@@ -47,6 +47,7 @@ public class Contact implements DatabaseObject {
     private Character status; //A = added, D = deleted.
     private Boolean banned = false;
     private Boolean confirmed = false;
+    private String conversationId;
 
     public Contact(ResultSet rs) throws Exception {
         this.owner = rs.getString("owner");
@@ -56,6 +57,7 @@ public class Contact implements DatabaseObject {
         this.status = (char) rs.getInt("status");
         this.banned = rs.getBoolean("banned");
         this.confirmed = rs.getBoolean("confirmed");
+        this.conversationId = rs.getString("conversationId");
     }
 
     @Override
@@ -68,6 +70,7 @@ public class Contact implements DatabaseObject {
         ps.setInt(5,status);
         ps.setBoolean(6,banned);
         ps.setBoolean(7,confirmed);
+        ps.setString(8, conversationId);
         return ps;
     }
 
diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java b/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java
index 2797af5f..55bdcf40 100644
--- a/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java
+++ b/jams-common/src/main/java/net/jami/jams/common/serialization/serializers/ContactCodec.java
@@ -16,7 +16,8 @@ public class ContactCodec implements Encoder, Decoder {
      *         "added" : 1595523510,
      *         "banned" : false,
      *         "uri" : "520290d7f45e5811fe5af637d328e7fbf5e8cab9",
-     *         "removed" : 0
+     *         "removed" : 0,
+     *         "conversationId": 6a61013979964f70c8fb9183a8b238d58a1846ed
      *     }
      */
     @Override
@@ -24,6 +25,7 @@ public class ContactCodec implements Encoder, Decoder {
         Any input = jsonIterator.readAny();
         Contact contact = new Contact();
         contact.setUri(input.get("uri").toString());
+        contact.setConversationId(input.get("conversationId").toString());
         long timeAdded = 0L;
         long timeRemoved = 0L;
         if(!input.get("added").toString().isBlank())
@@ -49,6 +51,7 @@ public class ContactCodec implements Encoder, Decoder {
         Contact ct = (Contact) o;
         StringBuilder sb = new StringBuilder();
         sb.append("{\"uri\":\"").append(ct.getUri()).append("\",");
+        sb.append("\"conversationId\":").append(ct.getConversationId()).append(",");
         switch (ct.getStatus()){
             case 'A':
                 sb.append("\"added\":").append(ct.getTimestamp());
diff --git a/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java b/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java
index a2a84931..3eca7619 100644
--- a/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java
+++ b/jams-common/src/test/java/net/jami/jams/common/objects/contacts/ContactTest.java
@@ -22,8 +22,8 @@ class ContactTest {
 
     @Test
     public void deserialize(){
-        String str = "[{\"uri\":\"tcp://def@local\",\"added\":1594742298377,\"banned\":false,\"confirmed\":true}," +
-            "{\"uri\":\"tcp://abc@19293.com\",\"removed\":1594742298377,\"banned\":true,\"confirmed\":true}]";
+        String str = "[{\"uri\":\"tcp://def@local\",\"added\":1594742298377,\"banned\":false,\"confirmed\":true,\"confirmed\":6a61013979964f70c8fb9183a8b238d58a1846ed}," +
+            "{\"uri\":\"tcp://abc@19293.com\",\"removed\":1594742298377,\"banned\":true,\"confirmed\":true,\"confirmed\":2b61024119964f70c8fb9183a8b238d58a1846ed}]";
         Contact[] contacts = JsonIterator.deserialize(str,Contact[].class);
         Assertions.assertEquals(2,contacts.length);
     }
@@ -35,6 +35,7 @@ class ContactTest {
         contact1.setStatus('A');
         contact1.setTimestamp(System.currentTimeMillis());
         contact1.setUri("tcp://def@local");
+        contact1.setConversationId("6a61013979964f70c8fb9183a8b238d58a1846ed");
         contact1.setBanned(false);
         contact1.setConfirmed(false);
         Contact contact2 = new Contact();
@@ -42,6 +43,7 @@ class ContactTest {
         contact2.setStatus('D');
         contact2.setTimestamp(System.currentTimeMillis());
         contact2.setUri("tcp://abc@19293.com");
+        contact2.setConversationId("2b61024119964f70c8fb9183a8b238d58a1846ed");
         contact2.setBanned(true);
         contact2.setConfirmed(true);
         ArrayList<Contact> lst = new ArrayList<>();
@@ -58,6 +60,7 @@ class ContactTest {
         contact1.setStatus('A');
         contact1.setTimestamp(System.currentTimeMillis());
         contact1.setUri("tcp://def@local");
+        contact1.setConversationId("6a61013979964f70c8fb9183a8b238d58a1846ed");
         Contact contact2 = new Contact();
         contact2.setOwner("fsidokhine");
         contact2.setStatus('D');
@@ -71,6 +74,7 @@ class ContactTest {
         contact3.setStatus('A');
         contact3.setTimestamp(System.currentTimeMillis() + 10000);
         contact3.setUri("tcp://abc@19293.com");
+        contact3.setConversationId("2b61024119964f70c8fb9183a8b238d58a1846ed");
         ArrayList<Contact> lst2 = new ArrayList<>();
         lst2.add(contact3);
         List<Contact> out = ContactMerger.mergeContacts(lst,lst2);
diff --git a/jams-react-client/src/views/Contacts/Contacts.js b/jams-react-client/src/views/Contacts/Contacts.js
index bf2ee4e8..c85e1af8 100644
--- a/jams-react-client/src/views/Contacts/Contacts.js
+++ b/jams-react-client/src/views/Contacts/Contacts.js
@@ -13,6 +13,9 @@ import CardBody from "components/Card/CardBody.js";
 import CardFooter from "components/Card/CardFooter.js";
 
 import BusinessOutlinedIcon from "@material-ui/icons/BusinessOutlined";
+import QuestionAnswerIcon from "@material-ui/icons/QuestionAnswer";
+import SmsFailedIcon from "@material-ui/icons/SmsFailed";
+
 import Search from "@material-ui/icons/Search";
 import IconButton from "@material-ui/core/IconButton";
 
@@ -457,6 +460,16 @@ export default function Users(props) {
                         />}
                         {contact.organization && ` ${contact.organization}`}
                       </li>
+                      <li>
+                        { contact.conversationId === null ?  <SmsFailedIcon
+                        fontSize="small"
+                        style={{ marginRight: "10px" }}
+                        ></SmsFailedIcon> : <QuestionAnswerIcon
+                          fontSize="small"
+                          style={{ marginRight: "10px" }}
+                        />}
+                        {contact.conversationId === null ? "No conversation id" :  ` ${contact.conversationId}`}
+                      </li>
                     </ul>
                   </CardBody>
                   </a>
-- 
GitLab