package io.budgetapp.dao; import io.budgetapp.application.NotFoundException; import io.budgetapp.configuration.AppConfiguration; import io.budgetapp.model.Category; import io.budgetapp.model.User; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * */ public class CategoryDAO extends DefaultDAO<Category> { private static final Logger LOGGER = LoggerFactory.getLogger(CategoryDAO.class); private final AppConfiguration configuration; public CategoryDAO(SessionFactory sessionFactory, AppConfiguration configuration) { super(sessionFactory); this.configuration = configuration; } public List<Category> findCategories(User user) { Criteria criteria = userCriteria(user); criteria.addOrder(Order.desc("type")); return list(criteria); } public Collection<Category> addDefaultCategories(User user) { Collection<Category> categories = new ArrayList<>(configuration.getCategories().size()); configuration.getCategories() .stream() .forEach(c -> categories.add(addCategory(user, category(c)))); return categories; } public Category addCategory(User user, Category category) { LOGGER.debug("Add new category {}", category); category.setUser(user); return persist(category); } public Category findById(long categoryId) { Category category = get(categoryId); if(category == null) { throw new NotFoundException(); } return category; } private Category category(Category ori) { Category category = new Category(); category.setName(ori.getName()); category.setType(ori.getType()); return category; } public Category find(User user, long categoryId) { Criteria criteria = userCriteria(user); criteria.add(Restrictions.eq("id", categoryId)); return singleResult(criteria); } private Criteria defaultCriteria() { return currentSession().createCriteria(Category.class); } private Criteria userCriteria(User user) { Criteria criteria = defaultCriteria(); criteria.add(Restrictions.eq("user", user)); return criteria; } public void delete(Category category) { currentSession().delete(category); } public List<String> findSuggestions(User user, String q) { q = q == null? "": q.toLowerCase(); Query query = currentSession().createQuery("SELECT c.name FROM Category c WHERE c.user != :user AND LOWER(c.name) LIKE :q"); query .setParameter("user", user) .setParameter("q", "%" + q + "%"); return (List<String>)query.list(); } }