package models; import managers.GroupManager; import models.base.BaseNotifiable; import models.base.INotifiable; import models.enums.GroupType; import org.hibernate.annotations.Type; import play.data.validation.Constraints.Required; import play.data.validation.ValidationError; import javax.persistence.*; import javax.validation.constraints.Size; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; @Entity @Table(name = "Group_") public class Group extends BaseNotifiable implements INotifiable { public static final String GROUP_INVITATION = "group_invitation"; public static final String GROUP_NEW_REQUEST = "group_new_request"; public static final String GROUP_REQUEST_SUCCESS = "group_request_success"; public static final String GROUP_REQUEST_DECLINE = "group_request_decline"; @Required @Column(unique = true) //@Pattern(value="^[ A-Za-z0-9\u00C0-\u00FF.!#$%&'+=?_{|}/\\\\\\[\\]~-]+$") @Size(max = 255, message = "error.length") public String title; @Lob @Type(type = "org.hibernate.type.TextType") public String description; @OneToMany(mappedBy = "group", cascade = CascadeType.ALL) @OrderBy("createdAt ASC") public Set<GroupAccount> groupAccounts; @ManyToOne public Account owner; @Enumerated(EnumType.STRING) public GroupType groupType; public String token; @OneToOne public Folder rootFolder; @Column(name = "has_avatar", nullable = false, columnDefinition = "boolean default false") public boolean hasAvatar; public void setTitle(String title) { this.title = title.trim(); } /** * Possible invitation list */ @Transient public Collection<String> inviteList = null; public List<ValidationError> validate() { List<ValidationError> errors = new ArrayList<>(); if (GroupManager.findByTitle2(this.title) != null) { errors.add(new ValidationError("title", "error.title")); return errors; } return null; } public static boolean validateToken(String token) { return !(token.equals("") || token.length() < 4 || token.length() > 45); } @Override public Account getSender() { return this.temporarySender; } @Override public List<Account> getRecipients() { switch (this.type) { case Group.GROUP_NEW_REQUEST: // group entry request notification, notify the owner of the group return this.getAsAccountList(this.owner); } // this is an invitation, a request accept or decline notification, notify the temporaryRecipients return this.temporaryRecipients; } @Override public String getTargetUrl() { if (this.type.equals(Group.GROUP_REQUEST_SUCCESS)) { return controllers.routes.GroupController.stream(this.id, 1, false).toString(); } return controllers.routes.GroupController.index().toString(); } }