/*
* Copyright 1998-2016 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.edithistory;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.org.linux.comment.Comment;
import ru.org.linux.spring.dao.MsgbaseDao;
import ru.org.linux.tag.TagName;
import ru.org.linux.tag.TagRef;
import ru.org.linux.tag.TagService;
import ru.org.linux.topic.Topic;
import ru.org.linux.topic.TopicTagService;
import ru.org.linux.user.User;
import ru.org.linux.user.UserDao;
import ru.org.linux.user.UserNotFoundException;
import ru.org.linux.user.UserService;
import ru.org.linux.util.bbcode.LorCodeService;
import scala.Option;
import java.util.ArrayList;
import java.util.List;
@Service
public class EditHistoryService {
@Autowired
TopicTagService topicTagService;
@Autowired
private UserDao userDao;
@Autowired
private UserService userService;
@Autowired
private LorCodeService lorCodeService;
@Autowired
private MsgbaseDao msgbaseDao;
@Autowired
private EditHistoryDao editHistoryDao;
/**
* Получить историю изменений топика
*/
public List<PreparedEditHistory> prepareEditInfo(
Topic message,
boolean secure
) throws UserNotFoundException {
List<EditHistoryDto> editInfoDTOs = editHistoryDao.getEditInfo(message.getId(), EditHistoryObjectTypeEnum.TOPIC);
List<PreparedEditHistory> editHistories = new ArrayList<>(editInfoDTOs.size());
String currentMessage = msgbaseDao.getMessageText(message.getId()).getText();
String currentTitle = message.getTitle();
String currentUrl = message.getUrl();
String currentLinktext = message.getLinktext();
List<TagRef> currentTags = topicTagService.getTagRefs(message);
boolean currentMinor = message.isMinor();
for (int i = 0; i < editInfoDTOs.size(); i++) {
EditHistoryDto dto = editInfoDTOs.get(i);
editHistories.add(
new PreparedEditHistory(
lorCodeService,
secure,
userDao.getUserCached(dto.getEditor()),
dto.getEditdate(),
dto.getOldmessage() != null ? currentMessage : null,
dto.getOldtitle() != null ? currentTitle : null,
dto.getOldurl() != null ? currentUrl : null,
dto.getOldlinktext() != null ? currentLinktext : null,
dto.getOldtags() != null ? currentTags : null,
i == 0,
false,
dto.getOldminor() != null ? currentMinor : null
)
);
if (dto.getOldmessage() != null) {
currentMessage = dto.getOldmessage();
}
if (dto.getOldtitle() != null) {
currentTitle = dto.getOldtitle();
}
if (dto.getOldurl() != null) {
currentUrl = dto.getOldurl();
}
if (dto.getOldlinktext() != null) {
currentLinktext = dto.getOldlinktext();
}
if (dto.getOldtags() != null) {
currentTags = TagService.namesToRefs(TagName.parseAndSanitizeTags(dto.getOldtags()));
}
if (dto.getOldminor() != null) {
currentMinor = dto.getOldminor();
}
}
if (!editInfoDTOs.isEmpty()) {
if (currentTags.isEmpty()) {
currentTags = null;
}
editHistories.add(new PreparedEditHistory(
lorCodeService,
secure,
userDao.getUserCached(message.getUid()),
message.getPostdate(),
currentMessage,
currentTitle,
currentUrl,
currentLinktext,
currentTags,
false,
true,
null
));
}
return editHistories;
}
public List<PreparedEditHistory> prepareEditInfo(
Comment comment,
boolean secure
) throws UserNotFoundException {
List<EditHistoryDto> editInfoDTOs = editHistoryDao.getEditInfo(comment.getId(), EditHistoryObjectTypeEnum.COMMENT);
List<PreparedEditHistory> editHistories = new ArrayList<>(editInfoDTOs.size());
String currentMessage = msgbaseDao.getMessageText(comment.getId()).getText();
String currentTitle = comment.getTitle();
for (int i = 0; i < editInfoDTOs.size(); i++) {
EditHistoryDto dto = editInfoDTOs.get(i);
editHistories.add(
new PreparedEditHistory(
lorCodeService,
secure,
userDao.getUserCached(dto.getEditor()),
dto.getEditdate(),
dto.getOldmessage() != null ? currentMessage : null,
dto.getOldtitle() != null ? currentTitle : null,
null,
null,
null,
i == 0,
false,
null
)
);
if (dto.getOldmessage() != null) {
currentMessage = dto.getOldmessage();
}
if (dto.getOldtitle() != null) {
currentTitle = dto.getOldtitle();
}
}
if (!editInfoDTOs.isEmpty()) {
editHistories.add(
new PreparedEditHistory(
lorCodeService,
secure,
userDao.getUserCached(comment.getUserid()),
comment.getPostdate(),
currentMessage,
currentTitle,
null,
null,
null,
false,
true,
null
)
);
}
return editHistories;
}
public List<EditHistoryDto> getEditInfo(int id, EditHistoryObjectTypeEnum objectTypeEnum) {
return editHistoryDao.getEditInfo(id, objectTypeEnum);
}
public List<BriefEditInfo> getBriefEditInfo(int id, EditHistoryObjectTypeEnum objectTypeEnum) {
return editHistoryDao.getBriefEditInfo(id, objectTypeEnum);
}
public int editCount(int id, EditHistoryObjectTypeEnum objectTypeEnum) {
// TODO replace with count() SQL query
return editHistoryDao.getEditInfo(id, objectTypeEnum).size();
}
public void insert(EditHistoryDto editHistoryDto) {
editHistoryDao.insert(editHistoryDto);
}
public ImmutableSet<User> getEditorUsers(final Topic message, List<EditHistoryDto> editInfoList) {
ImmutableSet<Integer> editors = getEditors(message, editInfoList);
return ImmutableSet.copyOf(userService.getUsersCached(editors));
}
public ImmutableSet<Integer> getEditors(final Topic message, List<EditHistoryDto> editInfoList) {
return ImmutableSet.copyOf(
Iterables.transform(
Iterables.filter(editInfoList, new Predicate<EditHistoryDto>() {
@Override
public boolean apply(EditHistoryDto input) {
return input.getEditor() != message.getUid();
}
}),
new Function<EditHistoryDto, Integer>() {
@Override
public Integer apply(EditHistoryDto input) {
return input.getEditor();
}
})
);
}
public Option<EditInfoSummary> editInfoSummary(int id, EditHistoryObjectTypeEnum objectTypeEnum) {
List<BriefEditInfo> history = editHistoryDao.getBriefEditInfo(id, objectTypeEnum);
if (history.isEmpty()) {
return Option.empty();
} else {
return Option.apply(EditInfoSummary.apply(history.size(), history.get(0)));
}
}
}