diff --git a/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java b/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java index ffbca27b868807ce98d7fc2ef74ebb7ab41c2904..2cbdb7628c4b3e32fb247214b029706ca572aecf 100644 --- a/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java +++ b/datastore/src/main/java/net/jami/datastore/dao/AbstractDao.java @@ -26,6 +26,7 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.jami.datastore.main.DataStore; +import net.jami.jams.common.dao.DeleteStatementBuilder; import net.jami.jams.common.dao.SelectStatementBuilder; import net.jami.jams.common.dao.StatementList; import net.jami.jams.common.dao.UpdateStatementBuilder; @@ -46,7 +47,6 @@ public abstract class AbstractDao<T> { private Class<T> tClass; public abstract boolean storeObject(T object); - public abstract boolean deleteObject(LinkedHashMap<String,String> constraints); public List<T> getObjects(StatementList constraints){ List<T> result = new ArrayList<>(); @@ -82,4 +82,20 @@ public abstract class AbstractDao<T> { DataStore.connectionPool.returnConnection(connection); } } + + public boolean deleteObject(StatementList delete){ + SQLConnection connection = DataStore.connectionPool.getConnection(); + try{ + PreparedStatement ps = DeleteStatementBuilder.buildStatement(tableName,delete,connection); + return ps.execute(); + } + catch (Exception e){ + log.error("An error has occurred while trying to fetch a device: " + e.toString()); + return false; + } + finally { + DataStore.connectionPool.returnConnection(connection); + } + } + } 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 1e33d86b870963fd13319a7f4ef1047d97fceb23..db920678d72eaf722ebcd9361684fe906c5aabe6 100644 --- a/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java +++ b/datastore/src/main/java/net/jami/datastore/dao/ContactDao.java @@ -22,25 +22,43 @@ */ package net.jami.datastore.dao; +import lombok.extern.slf4j.Slf4j; +import net.jami.datastore.main.DataStore; import net.jami.jams.common.dao.StatementList; +import net.jami.jams.common.dao.connectivity.SQLConnection; import net.jami.jams.common.objects.contacts.Contact; +import net.jami.jams.common.objects.devices.Device; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.LinkedHashMap; +@Slf4j public class ContactDao extends AbstractDao<Contact> { - @Override - public boolean storeObject(Contact object) { - return false; - } - - @Override - public boolean deleteObject(LinkedHashMap<String, String> constraints) { - return false; + public ContactDao() { + SQLConnection connection = DataStore.connectionPool.getConnection(); + try { + this.setTableName("contacts"); + this.setTClass(Contact.class); + String createTable = "CREATE TABLE contacts (" + + "owner varchar(255), " + + "contact varchar(255)," + + "displayName varchar(255),"+ + "PRIMARY KEY (owner,contact))"; + PreparedStatement ps = connection.getConnection().prepareStatement(createTable); + ps.execute(); + } + catch (SQLException e){ + log.error("Could not create the contacts table with error " + e.getMessage()); + } + finally { + DataStore.connectionPool.returnConnection(connection); + } } @Override - public boolean updateObject(StatementList update, StatementList constraints) { + public boolean storeObject(Contact object) { return false; } } diff --git a/datastore/src/main/java/net/jami/datastore/dao/UserProfileDAO.java b/datastore/src/main/java/net/jami/datastore/dao/UserProfileDao.java similarity index 96% rename from datastore/src/main/java/net/jami/datastore/dao/UserProfileDAO.java rename to datastore/src/main/java/net/jami/datastore/dao/UserProfileDao.java index 1f1d4096fde5916969f9a52fb243c8ca9231d854..f049b9975686f401db2897865049708eb9aa5c02 100644 --- a/datastore/src/main/java/net/jami/datastore/dao/UserProfileDAO.java +++ b/datastore/src/main/java/net/jami/datastore/dao/UserProfileDao.java @@ -32,10 +32,10 @@ import java.sql.SQLException; import java.util.LinkedHashMap; @Slf4j -public class UserProfileDAO extends AbstractDao<UserProfile> { +public class UserProfileDao extends AbstractDao<UserProfile> { //Fis this to include the fields from AD/LDAP. - public UserProfileDAO() { + public UserProfileDao() { SQLConnection connection = DataStore.connectionPool.getConnection(); try { this.setTableName("local_directory"); diff --git a/datastore/src/main/java/net/jami/datastore/main/DataStore.java b/datastore/src/main/java/net/jami/datastore/main/DataStore.java index 41ed66eefbed2b3d301b0ed153d381eab663ba7f..852cdaeafea5f50450e8183b5342a1c0decf2418 100644 --- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java +++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java @@ -24,6 +24,7 @@ package net.jami.datastore.main; import lombok.Getter; import lombok.Setter; +import net.jami.datastore.dao.ContactDao; import net.jami.datastore.dao.DeviceDao; import net.jami.datastore.dao.SystemDao; import net.jami.datastore.dao.UserDao; @@ -46,6 +47,7 @@ public class DataStore implements AuthenticationSource { private UserDao userDao; private DeviceDao deviceDao; private SystemDao systemDao; + private ContactDao contactDao; //Implicitly connect to debry. public DataStore(String connectionString) { @@ -53,6 +55,7 @@ public class DataStore implements AuthenticationSource { userDao = new UserDao(); deviceDao = new DeviceDao(); systemDao = new SystemDao(); + contactDao = new ContactDao(); } public boolean userExists(String username){ diff --git a/jams-common/src/main/java/net/jami/jams/common/dao/DeleteStatementBuilder.java b/jams-common/src/main/java/net/jami/jams/common/dao/DeleteStatementBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..26e495e69e710f440e76b1514510821caab1c018 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/dao/DeleteStatementBuilder.java @@ -0,0 +1,38 @@ +package net.jami.jams.common.dao; + +import net.jami.jams.common.dao.connectivity.SQLConnection; + +import java.sql.PreparedStatement; + +public class DeleteStatementBuilder { + + public static PreparedStatement buildStatement(String table, StatementList statementElements, + SQLConnection connection) throws Exception { + PreparedStatement ps = null; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("DELETE FROM ").append(table); + if(statementElements != null) { + stringBuilder.append(" WHERE "); + for (StatementElement statementElement : statementElements.getStatements()) { + stringBuilder + .append(statementElement.getColumn()) + .append(" ") + .append(statementElement.getOperator()) + .append(" ") + .append("?") + .append(" ") + .append(statementElement.getNextStatementRelation()); + } + ps = connection.getConnection().prepareStatement(stringBuilder.toString()); + int i = 1; + for (StatementElement statementElement : statementElements.getStatements()) { + ps.setString(i, statementElement.getValue()); + i++; + } + } + else{ + ps = connection.getConnection().prepareStatement(stringBuilder.toString()); + } + return ps; + } +} 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 2804fd9605299b4dbd70e598aaf4c8e4388388a2..dfcf11b391b0b0dcc43ead99a63f88183f40affa 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 @@ -22,10 +22,46 @@ */ package net.jami.jams.common.objects.contacts; +import com.jsoniter.annotation.JsonIgnore; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +import net.jami.jams.common.serialization.database.DatabaseObject; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; @Getter @Setter -public class Contact { +@NoArgsConstructor +public class Contact implements DatabaseObject { + + @JsonIgnore //Ignore the owner because he is irrelevant. + private String owner; + private String uri; + private String displayName; + + public Contact(ResultSet rs) throws Exception { + this.owner = rs.getString("owner"); + this.uri = rs.getString("uri"); + this.displayName = rs.getString("displayName"); + } + + @Override + public PreparedStatement getInsert(PreparedStatement ps) throws Exception { + ps.setString(1,owner); + ps.setString(2,uri); + ps.setString(3,displayName); + return ps; + } + + @Override + public PreparedStatement getDelete(PreparedStatement ps) throws Exception { + return null; + } + + @Override + public PreparedStatement getUpdate(PreparedStatement ps) throws Exception { + return null; + } } diff --git a/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java b/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java index 2198d8cac27346ea957e9460e74004d02eedf541..eeb2e87b0ffc67bc156307112a313c01f7a7881b 100644 --- a/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java +++ b/jams-common/src/main/java/net/jami/jams/common/serialization/database/DatabaseObject.java @@ -23,9 +23,9 @@ package net.jami.jams.common.serialization.database; import java.sql.PreparedStatement; +import java.sql.ResultSet; public interface DatabaseObject { - PreparedStatement getInsert(PreparedStatement ps) throws Exception; PreparedStatement getDelete(PreparedStatement ps) throws Exception; PreparedStatement getUpdate(PreparedStatement ps) throws Exception; diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java index 9b0626fde9b5bb026e0ac1caa672ac7128dfb703..c5d1130d888ea8a753ca19b266cda517358d2f4b 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/contacts/ContactServlet.java @@ -22,28 +22,48 @@ */ package net.jami.jams.server.servlets.api.auth.contacts; +import com.jsoniter.JsonIterator; +import com.jsoniter.output.JsonStream; +import net.jami.datastore.dao.ContactDao; +import net.jami.jams.common.dao.StatementElement; +import net.jami.jams.common.dao.StatementList; +import net.jami.jams.common.objects.contacts.Contact; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.List; + +import static net.jami.jams.server.Server.dataStore; @WebServlet("/api/auth/contacts") public class ContactServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + StatementList statementList = new StatementList(); + statementList.addStatement(new StatementElement("owner","=",req.getAttribute("username").toString(),"")); + List<Contact> contactList = dataStore.getContactDao().getObjects(statementList); + resp.getOutputStream().write(JsonStream.serialize(contactList).getBytes()); } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doPut(req, resp); + Contact contact = JsonIterator.deserialize(req.getInputStream().readAllBytes(),Contact.class); + contact.setOwner(req.getAttribute("username").toString()); + if(dataStore.getContactDao().storeObject(contact)) resp.setStatus(200); + else resp.sendError(500,"Could not store device!"); } + //TODO: Because deleting requires sending the URI in the body, didn't want to do this now. @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doDelete(req, resp); + StatementList statementList = new StatementList(); + statementList.addStatement(new StatementElement("owner","=",req.getAttribute("username").toString(),"AND")); + //if(dataStore.getContactDao().deleteObject()) resp.setStatus(200); + //else resp.sendError(500,"Could not delete a contact!"); } }