package com.aperture_software.glados_wiki.services; import com.aperture_software.glados_wiki.entities.Group; import com.google.common.base.Optional; import org.mongodb.morphia.Datastore; import org.mongodb.morphia.Key; import org.mongodb.morphia.query.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * User: jhyun * Date: 13. 11. 26 * Time: 오후 3:57 */ @Service public class GroupService { public static final String EVERYONE_ROLE = "everyone"; public static final String ADMIN_ROLE = "admins"; @Autowired private Datastore datastore; public Group create(final String name, final String description) { Group g = new Group(); g.setName(name); g.setDescription(description); g.setEnabled(true); Key<Group> k = datastore.save(g); return datastore.getByKey(Group.class, k); } public void delete(Group g) { datastore.delete(g); } public Optional<Group> getByName(final String name) { Group g = datastore.getByKey(Group.class, new Key<Group>(Group.class, name)); return Optional.fromNullable(g); } public boolean existsByName(final String name) { return datastore.find(Group.class, "name", name).countAll() > 0; } public Optional<Group> update(Group g) { Key<Group> k = datastore.save(g); return getByName((String) k.getId()); } public List<Group> list(final Optional<String> searchTerm, final int offset, final int limit) { Query<Group> q = datastore.createQuery(Group.class) .offset(offset).limit(limit) .order("-ctime"); queryApplySearchTerm(searchTerm, q); return q.asList(); } private void queryApplySearchTerm(Optional<String> searchTerm, Query<Group> q) { if (searchTerm.isPresent()) { final String searchTerm_ = searchTerm.get(); q.or(q.criteria("name").containsIgnoreCase(searchTerm_), q.criteria("description").containsIgnoreCase(searchTerm_)); } } public long count(final Optional<String> searchTerm) { Query<Group> q = datastore.createQuery(Group.class); queryApplySearchTerm(searchTerm, q); return q.countAll(); } }