/* * Copyright 1998-2017 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ru.org.linux.group; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import ru.org.linux.section.Section; import javax.annotation.Nonnull; import javax.sql.DataSource; import java.sql.PreparedStatement; import java.util.List; import java.util.Optional; @Repository public class GroupDao { private static final Logger logger = LoggerFactory.getLogger(GroupDao.class); private JdbcTemplate jdbcTemplate; @Autowired public void setDateSource(DataSource ds) { jdbcTemplate = new JdbcTemplate(ds); } /** * Получить объект группы по идентификатору. * * @param id идентификатор группы * @return объект группы * @throws GroupNotFoundException если группа не существует */ @Cacheable("Groups") public Group getGroup(int id) throws GroupNotFoundException { try { return jdbcTemplate.queryForObject( "SELECT sections.moderate, vote, section, havelink, linktext, title, urlname, image, groups.restrict_topics, restrict_comments,stat3,groups.id, groups.info, groups.longinfo, groups.resolvable FROM groups, sections WHERE groups.id=? AND groups.section=sections.id", (resultSet, i) -> Group.buildGroup(resultSet), id ); } catch (EmptyResultDataAccessException ex) { throw new GroupNotFoundException("Группа " + id + " не существует", ex); } } /** * Получить спусок групп в указанной секции. * * @param section объект секции. * @return спусок групп */ public List<Group> getGroups(Section section) { return jdbcTemplate.query( "SELECT sections.moderate, vote, section, havelink, linktext, title, urlname, image, groups.restrict_topics, restrict_comments, stat3,groups.id,groups.info,groups.longinfo,groups.resolvable FROM groups, sections WHERE sections.id=? AND groups.section=sections.id ORDER BY id", (rs, rowNum) -> Group.buildGroup(rs), section.getId() ); } /** * Получить объект группы в указанной секции по имени группы. * * @param section объект секции. * @param name имя группы * @return объект группы * @throws GroupNotFoundException если группа не существует */ @Nonnull public Group getGroup(Section section, String name) throws GroupNotFoundException { Optional<Group> group = getGroupOpt(section, name, false); if (!group.isPresent()) { logger.info("Group '{}' not found in section {}", name, section.getUrlName()); throw new GroupNotFoundException("group not found"); } else { return group.get(); } } /** * Получить объект группы в указанной секции по имени группы. * * @param section объект секции. * @param name имя группы * @return объект группы */ public Optional<Group> getGroupOpt(Section section, String name, Boolean allowNumber) { try { int id; if (allowNumber && StringUtils.isNumeric(name)) { id = jdbcTemplate.queryForObject( "SELECT id FROM groups WHERE section=? AND id=?", Integer.class, section.getId(), Integer.parseInt(name) ); } else { id = jdbcTemplate.queryForObject( "SELECT id FROM groups WHERE section=? AND urlname=?", Integer.class, section.getId(), name ); } return Optional.of(getGroup(id)); } catch (EmptyResultDataAccessException ex) { logger.debug("Group '{}' not found in section {}", name, section.getUrlName()); return Optional.empty(); } } /** * Изменить настройки группы. * * @param group объект группы * @param title Заголовок группы * @param info дополнительная информация * @param longInfo расширенная дополнительная информация * @param resolvable можно ли ставить темам признак "тема решена" * @param urlName имя группы в URL */ @CacheEvict(value="Groups", key="#group.id") public void setParams(final Group group, final String title, final String info, final String longInfo, final boolean resolvable, final String urlName) { jdbcTemplate.execute( "UPDATE groups SET title=?, info=?, longinfo=?,resolvable=?,urlname=? WHERE id=?", (PreparedStatement pst) -> { pst.setString(1, title); if (!info.isEmpty()) { pst.setString(2, info); } else { pst.setString(2, null); } if (!longInfo.isEmpty()) { pst.setString(3, longInfo); } else { pst.setString(3, null); } pst.setBoolean(4, resolvable); pst.setString(5, urlName); pst.setInt(6, group.getId()); pst.executeUpdate(); return null; } ); } }