package managers; import models.*; import models.base.FileOperationException; import models.enums.LinkType; import models.services.ElasticsearchService; import play.db.jpa.JPA; import play.db.jpa.JPAApi; import javax.inject.Inject; import java.io.IOException; import java.util.List; /** * Created by Iven on 16.12.2015. */ public class GroupManager implements BaseManager { @Inject ElasticsearchService elasticsearchService; @Inject GroupAccountManager groupAccountManager; @Inject PostManager postManager; @Inject NotificationManager notificationManager; @Inject FolderManager folderManager; @Inject AvatarManager avatarManager; @Inject JPAApi jpaApi; public void createWithGroupAccount(Group group, Account account) { group.owner = account; group.rootFolder = new Folder("_"+group.title, account, null, group, null); folderManager.create(group.rootFolder); create(group); groupAccountManager.create(new GroupAccount(group, account, LinkType.establish)); } @Override public void create(Object model) { jpaApi.em().persist(model); } @Override public void update(Object model) { JPA.em().merge(model); try { elasticsearchService.index(model); } catch (IOException e) { e.printStackTrace(); } } @Override public void delete(Object model) { Group group = ((Group) model); // delete all Posts List<Post> posts = postManager.getPostsForGroup(group, 0, 0); for (Post post : posts) { postManager.delete(post); } //delete root folder folderManager.delete(group.rootFolder); // Delete Notifications notificationManager.deleteReferences(group); // Delete Elasticsearch document elasticsearchService.delete(group); jpaApi.em().remove(group); } public Group findById(Long id) { return jpaApi.em().find(Group.class, id); } @SuppressWarnings("unchecked") public Group findByTitle(String title) { List<Group> groups = (List<Group>) jpaApi.em() .createQuery("FROM Group g WHERE g.title = ?1") .setParameter(1, title).getResultList(); if (groups.isEmpty()) { return null; } else { return groups.get(0); } } @SuppressWarnings("unchecked") public static Group findByTitle2(String title) { List<Group> groups = (List<Group>) JPA.em() .createQuery("FROM Group g WHERE g.title = ?1") .setParameter(1, title).getResultList(); if (groups.isEmpty()) { return null; } else { return groups.get(0); } } @SuppressWarnings("unchecked") public List<Group> all() { return jpaApi.em().createQuery("FROM Group").getResultList(); } @SuppressWarnings("unchecked") public List<Group> listAllGroupsOwnedBy(Long id) { return jpaApi.em().createQuery("FROM Group g WHERE g.owner.id = " + id).getResultList(); } /** * Returns true, if an account is member of a group. * * @param group Group instance * @param account Account instance * @return True, if account is member of group */ public static boolean isMember(Group group, Account account) { @SuppressWarnings("unchecked") List<GroupAccount> groupAccounts = (List<GroupAccount>) JPA .em() .createQuery( "SELECT g FROM GroupAccount g WHERE g.account.id = ?1 and g.group.id = ?2 AND linkType = ?3") .setParameter(1, account.id).setParameter(2, group.id) .setParameter(3, LinkType.establish).getResultList(); return !groupAccounts.isEmpty(); } public long indexAllGroups() throws IOException { final long start = System.currentTimeMillis(); for (Group group : all()) elasticsearchService.index(group); return (System.currentTimeMillis() - start) / 1000; } public void saveAvatar(Avatar avatar, Group group) throws FileOperationException { avatarManager.saveAvatar(avatar, group.id); group.hasAvatar = true; this.update(group); } }