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();
}
}