/**
* Copyright (C) 2011 JTalks.org Team
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jtalks.jcommune.service.transactional;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.jtalks.jcommune.model.dao.TopicDao;
import org.jtalks.jcommune.model.dao.search.TopicSearchDao;
import org.jtalks.jcommune.model.dto.PageRequest;
import org.jtalks.jcommune.model.entity.Branch;
import org.jtalks.jcommune.model.entity.JCUser;
import org.jtalks.jcommune.model.entity.Topic;
import org.jtalks.jcommune.plugin.api.service.PluginTopicFetchService;
import org.jtalks.jcommune.service.ComponentService;
import org.jtalks.jcommune.service.TopicFetchService;
import org.jtalks.jcommune.service.UserService;
import org.jtalks.jcommune.plugin.api.exceptions.NotFoundException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.security.access.prepost.PreAuthorize;
import java.util.Collections;
import java.util.List;
/**
* Performs load operations on topic based on various
* conditions. Topic search operations are also performed here.
*/
public class TransactionalTopicFetchService extends AbstractTransactionalEntityService<Topic, TopicDao>
implements TopicFetchService, PluginTopicFetchService {
private ComponentService componentService;
private UserService userService;
private TopicSearchDao searchDao;
/**
* @param dao topic dao for database manipulations
* @param componentService to checking user permissions
* @param userService to get current user and his preferences
* @param searchDao for search index access
*/
public TransactionalTopicFetchService(TopicDao dao, ComponentService componentService, UserService userService, TopicSearchDao searchDao) {
super(dao);
this.componentService = componentService;
this.userService = userService;
this.searchDao = searchDao;
}
/**
* {@inheritDoc}
*/
@Override
public Topic get(Long id) throws NotFoundException {
Topic topic = super.get(id);
topic.setViews(topic.getViews() + 1);
this.getDao().saveOrUpdate(topic);
return topic;
}
/**
* {@inheritDoc}
*/
@Override
public Page<Topic> getRecentTopics(String page) {
int pageSize = userService.getCurrentUser().getPageSize();
PageRequest pageRequest = new PageRequest(page, pageSize);
DateTime date24HoursAgo = new DateTime().minusDays(1);
return this.getDao().getTopicsUpdatedSince(date24HoursAgo, pageRequest, userService.getCurrentUser());
}
/**
* {@inheritDoc}
*/
@Override
public Page<Topic> getUnansweredTopics(String page) {
int pageSize = userService.getCurrentUser().getPageSize();
PageRequest pageRequest = new PageRequest(page, pageSize);
return this.getDao().getUnansweredTopics(pageRequest, userService.getCurrentUser());
}
@Override
public Topic getTopicSilently(Long id) throws NotFoundException {
return super.get(id);
}
/**
* {@inheritDoc}
*/
@Override
public Page<Topic> getTopics(Branch branch, String page) {
int pageSize = userService.getCurrentUser().getPageSize();
PageRequest pageRequest = new PageRequest(page, pageSize);
return getDao().getTopics(branch, pageRequest);
}
/**
* {@inheritDoc}
*/
@Override
public Page<Topic> searchByTitleAndContent(String phrase, String page) {
JCUser currentUser = userService.getCurrentUser();
List<Long> allowedBranchesIds = this.getDao().getAllowedBranchesIds(currentUser);
if (!StringUtils.isEmpty(phrase) && !allowedBranchesIds.isEmpty()) {
int pageSize = currentUser.getPageSize();
PageRequest pageRequest = new PageRequest(page, pageSize);
// hibernate search refuses to process long string throwing error
String normalizedPhrase = StringUtils.left(phrase, 50);
return searchDao.searchByTitleAndContent(normalizedPhrase, pageRequest, allowedBranchesIds);
}
return new PageImpl<>(Collections.<Topic>emptyList());
}
/**
* {@inheritDoc}
*/
@Override
public void rebuildSearchIndex() {
long componentId = componentService.getComponentOfForum().getId();
componentService.checkPermissionsForComponent(componentId);
searchDao.rebuildIndex();
}
/**
* {@inheritDoc}
*/
@PreAuthorize("hasPermission(#branchId, 'BRANCH', 'BranchPermission.VIEW_TOPICS')")
@Override
public void checkViewTopicPermission(Long branchId) {
}
}