1
0
mirror of https://github.com/sismics/docs.git synced 2025-12-13 17:56:20 +00:00

#32: Comments system (server side)

This commit is contained in:
jendib
2015-11-16 02:22:51 +01:00
parent b3e44b84d2
commit 97252bb5da
30 changed files with 743 additions and 124 deletions

View File

@@ -67,6 +67,7 @@ public class AuditLogDao {
// ACL on document is not checked here, it's assumed
queries.add(baseQuery + " where l.LOG_IDENTITY_C = :documentId ");
queries.add(baseQuery + " where l.LOG_IDENTITY_C in (select f.FIL_ID_C from T_FILE f where f.FIL_IDDOC_C = :documentId) ");
queries.add(baseQuery + " where l.LOG_IDENTITY_C in (select c.COM_ID_C from T_COMMENT c where c.COM_IDDOC_C = :documentId) ");
queries.add(baseQuery + " where l.LOG_IDENTITY_C in (select a.ACL_ID_C from T_ACL a where a.ACL_SOURCEID_C = :documentId) ");
parameterMap.put("documentId", criteria.getDocumentId());
}
@@ -76,6 +77,7 @@ public class AuditLogDao {
queries.add(baseQuery + " where l.LOG_IDENTITY_C in (select t.TAG_ID_C from T_TAG t where t.TAG_IDUSER_C = :userId) ");
// Show only logs from owned documents, ACL are lost on delete
queries.add(baseQuery + " where l.LOG_IDENTITY_C in (select d.DOC_ID_C from T_DOCUMENT d where d.DOC_IDUSER_C = :userId) ");
queries.add(baseQuery + " where l.LOG_IDENTITY_C in (select c.COM_ID_C from T_COMMENT c where c.COM_IDUSER_C = :userId) ");
parameterMap.put("userId", criteria.getUserId());
}

View File

@@ -0,0 +1,113 @@
package com.sismics.docs.core.dao.jpa;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import com.sismics.docs.core.constant.AuditLogType;
import com.sismics.docs.core.dao.jpa.dto.CommentDto;
import com.sismics.docs.core.model.jpa.Comment;
import com.sismics.docs.core.util.AuditLogUtil;
import com.sismics.util.context.ThreadLocalContext;
/**
* Comment DAO.
*
* @author bgamard
*/
public class CommentDao {
/**
* Creates a new comment.
*
* @param comment Comment
* @return New ID
* @throws Exception
*/
public String create(Comment comment) {
// Create the UUID
comment.setId(UUID.randomUUID().toString());
// Create the comment
EntityManager em = ThreadLocalContext.get().getEntityManager();
comment.setCreateDate(new Date());
em.persist(comment);
// Create audit log
AuditLogUtil.create(comment, AuditLogType.CREATE);
return comment.getId();
}
/**
* Deletes a comment.
*
* @param id Comment ID
*/
public void delete(String id) {
EntityManager em = ThreadLocalContext.get().getEntityManager();
// Get the document
Query q = em.createQuery("select c from Comment c where c.id = :id and c.deleteDate is null");
q.setParameter("id", id);
Comment commentDb = (Comment) q.getSingleResult();
// Delete the document
Date dateNow = new Date();
commentDb.setDeleteDate(dateNow);
// Create audit log
AuditLogUtil.create(commentDb, AuditLogType.DELETE);
}
/**
* Gets an active comment by its ID.
*
* @param id Comment ID
* @return Comment
*/
public Comment getActiveById(String id) {
EntityManager em = ThreadLocalContext.get().getEntityManager();
try {
Query q = em.createQuery("select c from Comment c where c.id = :id and c.deleteDate is null");
q.setParameter("id", id);
return (Comment) q.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
/**
* Get all comments on a document.
*
* @param documentId Document ID
* @return List of comments
*/
public List<CommentDto> getByDocumentId(String documentId) {
EntityManager em = ThreadLocalContext.get().getEntityManager();
StringBuilder sb = new StringBuilder("select c.COM_ID_C, c.COM_CONTENT_C, c.COM_CREATEDATE_D, u.USE_USERNAME_C from T_COMMENT c, T_USER u");
sb.append(" where c.COM_IDDOC_C = :documentId and c.COM_IDUSER_C = u.USE_ID_C and c.COM_DELETEDATE_D is null ");
sb.append(" order by c.COM_CREATEDATE_D asc ");
Query q = em.createNativeQuery(sb.toString());
q.setParameter("documentId", documentId);
@SuppressWarnings("unchecked")
List<Object[]> l = q.getResultList();
List<CommentDto> commentDtoList = new ArrayList<CommentDto>();
for (Object[] o : l) {
int i = 0;
CommentDto commentDto = new CommentDto();
commentDto.setId((String) o[i++]);
commentDto.setContent((String) o[i++]);
commentDto.setCreateTimestamp(((Timestamp) o[i++]).getTime());
commentDto.setCreatorName((String) o[i++]);
commentDtoList.add(commentDto);
}
return commentDtoList;
}
}

View File

@@ -83,7 +83,12 @@ public class DocumentDao {
sb.append(" where d.DOC_IDUSER_C = u.USE_ID_C and d.DOC_ID_C = :id and d.DOC_DELETEDATE_D is null ");
Query q = em.createNativeQuery(sb.toString());
q.setParameter("id", id);
Object[] o = (Object[]) q.getSingleResult();
Object[] o = null;
try {
o = (Object[]) q.getSingleResult();
} catch (NoResultException e) {
return null;
}
DocumentDto documentDto = new DocumentDto();
int i = 0;
@@ -114,7 +119,11 @@ public class DocumentDao {
q.setParameter("id", id);
q.setParameter("perm", perm.name());
q.setParameter("userId", userId);
return (Document) q.getSingleResult();
try {
return (Document) q.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
/**

View File

@@ -63,7 +63,11 @@ public class FileDao {
EntityManager em = ThreadLocalContext.get().getEntityManager();
Query q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null");
q.setParameter("id", id);
return (File) q.getSingleResult();
try {
return (File) q.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
/**
@@ -78,7 +82,11 @@ public class FileDao {
Query q = em.createQuery("select f from File f where f.id = :id and f.userId = :userId and f.deleteDate is null");
q.setParameter("id", id);
q.setParameter("userId", userId);
return (File) q.getSingleResult();
try {
return (File) q.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
/**

View File

@@ -0,0 +1,63 @@
package com.sismics.docs.core.dao.jpa.dto;
import javax.persistence.Id;
/**
* Comment DTO.
*
* @author bgamard
*/
public class CommentDto {
/**
* Comment ID.
*/
@Id
private String id;
/**
* Creator name.
*/
private String creatorName;
/**
* Content.
*/
private String content;
/**
* Creation date of this comment.
*/
private Long createTimestamp;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCreatorName() {
return creatorName;
}
public void setCreatorName(String creatorName) {
this.creatorName = creatorName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Long getCreateTimestamp() {
return createTimestamp;
}
public void setCreateTimestamp(Long createTimestamp) {
this.createTimestamp = createTimestamp;
}
}

View File

@@ -4,7 +4,6 @@ import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
@@ -12,7 +11,6 @@ import javax.persistence.Table;
import com.google.common.base.MoreObjects;
import com.sismics.docs.core.constant.PermType;
import com.sismics.docs.core.util.AuditLogUtil;
/**
* ACL entity.
@@ -20,7 +18,6 @@ import com.sismics.docs.core.util.AuditLogUtil;
* @author bgamard
*/
@Entity
@EntityListeners(AuditLogUtil.class)
@Table(name = "T_ACL")
public class Acl implements Loggable {
/**

View File

@@ -0,0 +1,179 @@
package com.sismics.docs.core.model.jpa;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import com.google.common.base.MoreObjects;
/**
* Comment entity.
*
* @author bgamard
*/
@Entity
@Table(name = "T_COMMENT")
public class Comment implements Loggable {
/**
* Comment ID.
*/
@Id
@Column(name = "COM_ID_C", length = 36)
private String id;
/**
* Document ID.
*/
@Column(name = "COM_IDDOC_C", length = 36, nullable = false)
private String documentId;
/**
* User ID.
*/
@Column(name = "COM_IDUSER_C", length = 36, nullable = false)
private String userId;
/**
* Content.
*/
@Column(name = "COM_CONTENT_C", nullable = false)
private String content;
/**
* Creation date.
*/
@Column(name = "COM_CREATEDATE_D", nullable = false)
private Date createDate;
/**
* Deletion date.
*/
@Column(name = "COM_DELETEDATE_D")
private Date deleteDate;
/**
* Getter of id.
*
* @return the id
*/
public String getId() {
return id;
}
/**
* Setter of id.
*
* @param id id
*/
public void setId(String id) {
this.id = id;
}
/**
* Getter of documentId.
*
* @return the documentId
*/
public String getDocumentId() {
return documentId;
}
/**
* Setter of documentId.
*
* @param documentId documentId
*/
public void setDocumentId(String documentId) {
this.documentId = documentId;
}
/**
* Getter of createDate.
*
* @return the createDate
*/
public Date getCreateDate() {
return createDate;
}
/**
* Setter of createDate.
*
* @param createDate createDate
*/
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
/**
* Getter of deleteDate.
*
* @return the deleteDate
*/
@Override
public Date getDeleteDate() {
return deleteDate;
}
/**
* Setter of deleteDate.
*
* @param deleteDate deleteDate
*/
public void setDeleteDate(Date deleteDate) {
this.deleteDate = deleteDate;
}
/**
* Getter of content.
*
* @return the content
*/
public String getContent() {
return content;
}
/**
* Setter of content.
*
* @param content content
*/
public void setContent(String content) {
this.content = content;
}
/**
* Getter of userId.
*
* @return the userId
*/
public String getUserId() {
return userId;
}
/**
* Setter of userId.
*
* @param userId userId
*/
public void setUserId(String userId) {
this.userId = userId;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("id", id)
.add("documentId", documentId)
.add("userId", userId)
.toString();
}
@Override
public String toMessage() {
return documentId;
}
}

View File

@@ -4,12 +4,10 @@ import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import javax.persistence.Table;
import com.google.common.base.MoreObjects;
import com.sismics.docs.core.util.AuditLogUtil;
/**
* Document entity.
@@ -17,7 +15,6 @@ import com.sismics.docs.core.util.AuditLogUtil;
* @author bgamard
*/
@Entity
@EntityListeners(AuditLogUtil.class)
@Table(name = "T_DOCUMENT")
public class Document implements Loggable {
/**

View File

@@ -4,13 +4,11 @@ import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import com.google.common.base.MoreObjects;
import com.sismics.docs.core.util.AuditLogUtil;
/**
* File entity.
@@ -18,7 +16,6 @@ import com.sismics.docs.core.util.AuditLogUtil;
* @author bgamard
*/
@Entity
@EntityListeners(AuditLogUtil.class)
@Table(name = "T_FILE")
public class File implements Loggable {
/**

View File

@@ -4,12 +4,10 @@ import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import javax.persistence.Table;
import com.google.common.base.MoreObjects;
import com.sismics.docs.core.util.AuditLogUtil;
/**
* Tag.
@@ -17,7 +15,6 @@ import com.sismics.docs.core.util.AuditLogUtil;
* @author bgamard
*/
@Entity
@EntityListeners(AuditLogUtil.class)
@Table(name = "T_TAG")
public class Tag implements Loggable {
/**

View File

@@ -4,12 +4,10 @@ import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import javax.persistence.Table;
import com.google.common.base.MoreObjects;
import com.sismics.docs.core.util.AuditLogUtil;
/**
* User entity.
@@ -17,7 +15,6 @@ import com.sismics.docs.core.util.AuditLogUtil;
* @author jtremeaux
*/
@Entity
@EntityListeners(AuditLogUtil.class)
@Table(name = "T_USER")
public class User implements Loggable {
/**

View File

@@ -5,17 +5,5 @@
version="2.0">
<persistence-unit name="transactions-optional" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.sismics.docs.core.model.jpa.AuthenticationToken</class>
<class>com.sismics.docs.core.model.jpa.BaseFunction</class>
<class>com.sismics.docs.core.model.jpa.Config</class>
<class>com.sismics.docs.core.model.jpa.User</class>
<class>com.sismics.docs.core.model.jpa.RoleBaseFunction</class>
<class>com.sismics.docs.core.model.jpa.Document</class>
<class>com.sismics.docs.core.model.jpa.Tag</class>
<class>com.sismics.docs.core.model.jpa.DocumentTag</class>
<class>com.sismics.docs.core.model.jpa.Share</class>
<class>com.sismics.docs.core.model.jpa.Acl</class>
<class>com.sismics.docs.core.model.jpa.AuditLog</class>
</persistence-unit>
</persistence>

View File

@@ -1 +1 @@
db.version=2
db.version=3

View File

@@ -0,0 +1,4 @@
create cached table T_COMMENT ( COM_ID_C varchar(36) not null, COM_IDDOC_C varchar(36) not null, COM_IDUSER_C varchar(36) not null, COM_CONTENT_C varchar(4000) not null, COM_CREATEDATE_D datetime, COM_DELETEDATE_D datetime, primary key (COM_ID_C) );
alter table T_COMMENT add constraint FK_COM_IDDOC_C foreign key (COM_IDDOC_C) references T_DOCUMENT (DOC_ID_C) on delete restrict on update restrict;
alter table T_COMMENT add constraint FK_COM_IDUSER_C foreign key (COM_IDUSER_C) references T_USER (USE_ID_C) on delete restrict on update restrict;
update T_CONFIG set CFG_VALUE_C = '3' where CFG_ID_C = 'DB_VERSION';