package org.ironbrain.dao; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.hibernate.Query; import org.hibernate.criterion.Order; import org.ironbrain.APIController; import org.ironbrain.IB; import org.ironbrain.Result; import org.ironbrain.core.Section; import org.ironbrain.core.Ticket; import org.ironbrain.core.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; @Repository @SuppressWarnings("unchecked") @Transactional public class TicketDao extends BaseDao { @Autowired APIController api; @Autowired SectionDao sectionDao; public Ticket getTicket(int id) { Ticket ticket = (Ticket) getSess().get(Ticket.class, id); return ticket; } public Result updateTicket(int id, String answers, String questions, String customInfo, String label, long clientVersionDate) { Result result; Ticket ticket = (Ticket) getSess().get(Ticket.class, id); if (!data.testOwner(ticket.getOwner())) { throw new RuntimeException("Access denied"); } if (ticket.getEditDate() > clientVersionDate) { result = Result.getError("Есть более новая версия!"); result.setSubRes("versionConflict"); return result; } result = Result.getOk(); ticket.setQuestions(questions); ticket.setAnswers(answers); ticket.setEditDate(IB.getNowMs()); ticket.setCustomInfo(customInfo); getSess().update(ticket); Section section = api.getSectionFromTicket(id); section.setLabel(label); getSess().update(section); result.setData(ticket.getEditDate()); return result; } public Pair<Section, Ticket> addTicket(int sectionId) { return addTicket(sectionId, data.getUser()); } public Pair<Section, Ticket> addTicket(int sectionId, User user) { Section parentSection = sectionDao.getSection(sectionId, user); if (!data.testOwner(parentSection.getOwner())) { throw new RuntimeException("Access denied"); } Long genNum = api.getChildCount(sectionId) + 1; Ticket ticket = new Ticket(); ticket.setCreateDate(IB.getNowMs()); ticket.setEditDate(ticket.getCreateDate()); int ticketId = (int) getSess().save(ticket); ticket.setId(ticketId); ticket.setOwner(user.getId()); Section section = new Section(); section.setLabel("Билет " + genNum); section.setParent(sectionId); section.setTicket(ticketId); section.setOwner(user.getId()); int ticketSectionId = (int) getSess().save(section); section.setId(ticketSectionId); ticket.setPath(api.getPathToSection(section.getId())); api.addRemind(ticketSectionId, null); return new ImmutablePair<>(section, ticket); } public String getTicketLabel(int ticketId) { Section section = api.getSectionFromTicket(ticketId); return section.getLabel(); } public void updateTicket(int id, long editDate) { Ticket ticket = (Ticket) getSess().get(Ticket.class, id); ticket.setEditDate(editDate); getSess().update(ticket); } public void updateTicket(Ticket ticket) { getSess().update(ticket); } public Result checkTicket(int id, long clientVersionDate) { Result result; Ticket ticket = (Ticket) getSess().get(Ticket.class, id); if (ticket.getEditDate() > clientVersionDate) { result = Result.getError("Есть более новая версия!"); result.setSubRes("versionConflict"); return result; } else { result = Result.getOk(); } return result; } boolean firstIter = true; public List<Ticket> query(String query) { query = query.trim(); List<String> words = Arrays.asList((query.split(" "))); StringBuilder dbQuery = new StringBuilder("FROM Ticket as ticket WHERE ((ticket.owner = " + data.getUserId() + ") AND "); firstIter = true; words.forEach(word -> { if (!firstIter) { dbQuery.append(" AND "); } dbQuery.append("(ticket.answers LIKE '%").append(word).append("%'"); dbQuery.append(" OR ticket.questions LIKE '%").append(word).append("%'"); dbQuery.append(" OR ticket.customInfo LIKE '%").append(word).append("%'"); dbQuery.append(" OR ticket.path LIKE '%").append(word).append("%'").append(")"); firstIter = false; }); dbQuery.append(")"); Query queryResult = getSess().createQuery(dbQuery.toString()); return queryResult.list(); } public List<Ticket> getAllTickets() { return getSess().createCriteria(Ticket.class).list(); } public List<Ticket> getAllTicketsFromEnd(int limit) { return getSess().createCriteria(Ticket.class).addOrder(Order.desc("id")).setMaxResults(limit).list(); } }