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:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
/**
|
||||
|
||||
@@ -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>
|
||||
@@ -1 +1 @@
|
||||
db.version=2
|
||||
db.version=3
|
||||
@@ -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';
|
||||
Reference in New Issue
Block a user