package org.kalipo.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.joda.time.DateTime;
import org.kalipo.config.Constants;
import org.kalipo.validation.ModelExistsConstraint;
import org.springframework.beans.BeanUtils;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Set;
/**
* A Comment.
*/
@Document(collection = "T_COMMENT")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Comment implements Anonymizable<Comment> {
@Id
private String id;
@NotNull(message = "{constraint.notnull.threadId}")
@ModelExistsConstraint(Thread.class)
private String threadId;
private String parentId;
@CreatedDate
private DateTime createdDate;
// todo agent will affect this field, so do it manually for target actions
@LastModifiedDate
private DateTime lastModifiedDate;
@NotNull(message = "{constraint.notnull.body}")
@Size(min = 2, max = Constants.LIM_MAX_LEN_BODY, message = "{constraint.length.body}")
private String body;
private String bodyHtml;
@JsonIgnore
@NotNull(message = "{constraint.notnull.authorId}")
private String authorId;
@Size(max = Constants.LIM_MAX_LEN_DISPLAYNAME, message = "{constraint.length.displayname}")
private String displayName;
// A related-hash to order all comments close to their parents
@JsonIgnore
private String fingerprint;
private Integer level;
// generated - isolated comment quality
@JsonIgnore
private Double quality;
// generated - representing importance in discussion
private Double influence;
private Integer likes;
private Integer repliesCount;
private Integer dislikes;
// reported comments may be hidden
private Boolean hidden;
private Boolean pinned;
private Boolean createdByMod;
/**
* Stay on top of list in ui
*/
// todo implement in ui
private Boolean sticky;
private Integer reportedCount;
@NotNull(message = "{constraint.notnull.status}")
private Status status;
private String reviewerId;
@Size(max = 200)
private String reviewMsg;
@Transient
private Set<Link> links;
// Publish post as anonymous
@Transient
private Boolean anonymous;
public Boolean getAnonymous() {
return anonymous;
}
public void setAnonymous(Boolean anonymous) {
this.anonymous = anonymous;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public Comment anonymized() {
Comment a = new Comment();
BeanUtils.copyProperties(this, a);
a.setCreatedDate(null);
a.setAuthorId(null);
a.setFingerprint(null);
return a;
}
public Boolean getCreatedByMod() {
return createdByMod;
}
public void setCreatedByMod(Boolean createdByMod) {
this.createdByMod = createdByMod;
}
public String getThreadId() {
return threadId;
}
public void setThreadId(String threadId) {
this.threadId = threadId;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public DateTime getCreatedDate() {
return createdDate;
}
public void setCreatedDate(DateTime createdDate) {
this.createdDate = createdDate;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getAuthorId() {
return authorId;
}
public void setAuthorId(String authorId) {
this.authorId = authorId;
}
public Integer getLikes() {
return likes;
}
public void setLikes(Integer likes) {
this.likes = likes;
}
public Integer getDislikes() {
return dislikes;
}
public void setDislikes(Integer dislikes) {
this.dislikes = dislikes;
}
public String getFingerprint() {
return fingerprint;
}
public void setFingerprint(String fingerprint) {
this.fingerprint = fingerprint;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public String getReviewerId() {
return reviewerId;
}
public void setReviewerId(String reviewerId) {
this.reviewerId = reviewerId;
}
public Integer getReportedCount() {
return reportedCount;
}
public void setReportedCount(Integer reportedCount) {
this.reportedCount = reportedCount;
}
public Boolean getHidden() {
return hidden;
}
public void setHidden(Boolean hidden) {
this.hidden = hidden;
}
public Boolean getSticky() {
return sticky;
}
public void setSticky(Boolean sticky) {
this.sticky = sticky;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public Integer getRepliesCount() {
return repliesCount;
}
public void setRepliesCount(Integer repliesCount) {
this.repliesCount = repliesCount;
}
public Double getInfluence() {
return influence;
}
public void setInfluence(Double influence) {
this.influence = influence;
}
public Double getQuality() {
return quality;
}
public void setQuality(Double quality) {
this.quality = quality;
}
public DateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(DateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public String getReviewMsg() {
return reviewMsg;
}
public void setReviewMsg(String reviewMsg) {
this.reviewMsg = reviewMsg;
}
public String getBodyHtml() {
return bodyHtml;
}
public void setBodyHtml(String bodyHtml) {
this.bodyHtml = bodyHtml;
}
public Set<Link> getLinks() {
return links;
}
public void setLinks(Set<Link> links) {
this.links = links;
}
public Boolean getPinned() {
return pinned;
}
public void setPinned(Boolean pinned) {
this.pinned = pinned;
}
/**
* Created by damoeb on 7/28/14.
*/
public enum Status {
NONE, APPROVED, PENDING, SPAM, REJECTED, DELETED
}
public static class Link {
private String url;
private int impression;
public Link(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public int getImpression() {
return impression;
}
public void incrImpression() {
impression++;
}
}
@Override
public String toString() {
return "Comment{" +
"id='" + id + '\'' +
", threadId='" + threadId + '\'' +
", parentId='" + parentId + '\'' +
", body='" + body + '\'' +
", authorId='" + authorId + '\'' +
", status=" + status +
", reviewerId='" + reviewerId + '\'' +
'}';
}
}