Skip to content

Commit

Permalink
попытка выпрямить логику загрузки изображений
Browse files Browse the repository at this point in the history
  • Loading branch information
maxcom committed Oct 30, 2023
1 parent 31a091f commit e99fabf
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 50 deletions.
12 changes: 11 additions & 1 deletion src/main/java/ru/org/linux/topic/AddTopicRequest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 1998-2022 Linux.org.ru
* Copyright 1998-2023 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
Expand Down Expand Up @@ -38,6 +38,8 @@ public class AddTopicRequest {
private String draft;
private boolean allowAnonymous = true;

private String uploadedImage;

public String getTitle() {
return title;
}
Expand Down Expand Up @@ -169,4 +171,12 @@ public boolean isAllowAnonymous() {
public void setAllowAnonymous(boolean allowAnonymous) {
this.allowAnonymous = allowAnonymous;
}

public String getUploadedImage() {
return uploadedImage;
}

public void setUploadedImage(String uploadedImage) {
this.uploadedImage = uploadedImage;
}
}
10 changes: 10 additions & 0 deletions src/main/java/ru/org/linux/topic/EditTopicRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public class EditTopicRequest {

private Integer fromHistory;

private String uploadedImage;

public String getUrl() {
return url;
}
Expand Down Expand Up @@ -128,4 +130,12 @@ public Integer getFromHistory() {
public void setFromHistory(Integer fromHistory) {
this.fromHistory = fromHistory;
}

public String getUploadedImage() {
return uploadedImage;
}

public void setUploadedImage(String uploadedImage) {
this.uploadedImage = uploadedImage;
}
}
14 changes: 7 additions & 7 deletions src/main/scala/ru/org/linux/gallery/ImageService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import ru.org.linux.util.image.{ImageInfo, ImageUtil}

import java.io.{File, FileNotFoundException, IOException}
import java.util.Optional
import javax.servlet.http.{HttpServletRequest, HttpSession}
import javax.servlet.http.HttpServletRequest
import scala.jdk.CollectionConverters.*
import scala.jdk.OptionConverters.RichOption
import scala.util.control.NonFatal
Expand Down Expand Up @@ -138,7 +138,7 @@ class ImageService(imageDao: ImageDao, editHistoryDao: EditHistoryDao,

if (!errors.hasErrors) {
Some(UploadedImagePreview.create(
prefix = s"preview-${user.getId}-",
prefix = uploadedImagePrefix(user),
extension = imageParam.getExtension,
previewPath = previewPath,
uploadedData = file))
Expand All @@ -147,6 +147,8 @@ class ImageService(imageDao: ImageDao, editHistoryDao: EditHistoryDao,
}
}

private def uploadedImagePrefix(user: User) = s"preview-${user.getId}-"

def processUploadImage(request: HttpServletRequest): Option[File] = {
request match {
case multipartRequest: MultipartRequest =>
Expand All @@ -166,15 +168,13 @@ class ImageService(imageDao: ImageDao, editHistoryDao: EditHistoryDao,
}
}

def processUpload(currentUser: User, session: HttpSession, image: Option[File], errors: Errors): Option[UploadedImagePreview] = {
def processUpload(currentUser: User, uploadedImage: Option[String], image: Option[File], errors: Errors): Option[UploadedImagePreview] = {
image match {
case Some(image) =>
try {
createImagePreview(currentUser, image, errors).map { previewImage =>
logger.info("SCREEN: " + image.getAbsolutePath + "\nINFO: SCREEN: " + image)

session.setAttribute("image", previewImage.mainFile.getName)

previewImage
}
} catch {
Expand All @@ -183,8 +183,8 @@ class ImageService(imageDao: ImageDao, editHistoryDao: EditHistoryDao,
None
}
case None =>
Option(session.getAttribute("image"))
.map(_.asInstanceOf[String])
uploadedImage
.filter(_.startsWith(uploadedImagePrefix(currentUser)))
.map(f => UploadedImagePreview.reuse(previewPath, f))
.filter(_.mainFile.exists)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class UploadedImagePreview(val mainFile: File) {
}

object UploadedImagePreview {
private val CorrectFilename="""[\w-]+\.[a-z]+""".r

def create(prefix: String, extension: String, previewPath: File, uploadedData: File): UploadedImagePreview = {
val mainFile = File.createTempFile(prefix, "." + extension, previewPath)

Expand All @@ -73,6 +75,8 @@ object UploadedImagePreview {
}

def reuse(previewPath: File, filename: String): UploadedImagePreview = {
assert(CorrectFilename.matches(filename))

val mainFile = new File(previewPath, filename)

new UploadedImagePreview(mainFile)
Expand Down
6 changes: 5 additions & 1 deletion src/main/scala/ru/org/linux/topic/AddTopicController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,11 @@ class AddTopicController(searchQueueSender: SearchQueueSender, captcha: CaptchaS
if (groupPermissionService.isImagePostingAllowed(section, user)) {
if (groupPermissionService.isTopicPostingAllowed(group, user)) {
val image = imageService.processUploadImage(request)
imagePreview = imageService.processUpload(user, session, image, errors)
imagePreview = imageService.processUpload(user, Option(form.getUploadedImage), image, errors)

imagePreview.foreach { img =>
form.setUploadedImage(img.mainFile.getName)
}
}

if (section.isImagepost && imagePreview.isEmpty) {
Expand Down
76 changes: 42 additions & 34 deletions src/main/scala/ru/org/linux/topic/EditTopicController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,14 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
throw new UserErrorException("Сообщение уже подтверждено")
}

val preparedMessage = prepareService.prepareTopic(topic, currentUser.user)
val preparedTopic = prepareService.prepareTopic(topic, currentUser.user)

if (!preparedMessage.section.isPremoderated) {
if (!preparedTopic.section.isPremoderated) {
throw new UserErrorException("Раздел не премодерируемый")
}

val mv = prepareModel(preparedMessage, form, currentUser.user, tmpl.getProf)
initForm(preparedTopic, form)
val mv = new ModelAndView("edit", prepareModel(preparedTopic, currentUser.user, tmpl.getProf).asJava)

mv.getModel.put("commit", true)

Expand All @@ -94,18 +95,19 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
@ModelAttribute("form") form: EditTopicRequest): ModelAndView = AuthorizedOnly { currentUser =>
val message = messageDao.getById(msgid)
val user = currentUser.user
val preparedMessage = prepareService.prepareTopic(message, user)
val preparedTopic = prepareService.prepareTopic(message, user)

if (!permissionService.isEditable(preparedMessage, user) && !permissionService.isTagsEditable(preparedMessage, user)) {
if (!permissionService.isEditable(preparedTopic, user) && !permissionService.isTagsEditable(preparedTopic, user)) {
throw new AccessViolationException("это сообщение нельзя править")
}

val tmpl = Template.getTemplate

prepareModel(preparedMessage, form, user, tmpl.getProf)
initForm(preparedTopic, form)
new ModelAndView("edit", prepareModel(preparedTopic, user, tmpl.getProf).asJava)
}

private def prepareModel(preparedTopic: PreparedTopic, form: EditTopicRequest, currentUser: User, profile: Profile) = {
private def prepareModel(preparedTopic: PreparedTopic, currentUser: User, profile: Profile): mutable.HashMap[String, AnyRef] = {
val params = mutable.HashMap[String, AnyRef]()

val message = preparedTopic.message
Expand All @@ -129,14 +131,31 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
params.put("editInfo", editInfoList.get(0))
val editors = editHistoryService.getEditorUsers(message, editInfoList).asScala

form.setEditorBonus(editors.view.map(u => Integer.valueOf(u.getId) -> Integer.valueOf(0)).toMap.asJava)

params.put("editors", editors.asJava)
}

params.put("commit", Boolean.box(false))

if (group.isLinksAllowed) {
val messageText = msgbaseDao.getMessageText(message.id)

params.put("imagepost", Boolean.box(permissionService.isImagePostingAllowed(preparedTopic.section, currentUser)))
params.put("mode", messageText.markup.title)

params
}

private def initForm(preparedTopic: PreparedTopic, form: EditTopicRequest): Unit = {
val message = preparedTopic.message

val editInfoList = editHistoryService.getEditInfo(message.id, EditHistoryObjectTypeEnum.TOPIC)

if (!editInfoList.isEmpty) {
val editors = editHistoryService.getEditorUsers(message, editInfoList).asScala

form.setEditorBonus(editors.view.map(u => Integer.valueOf(u.getId) -> Integer.valueOf(0)).toMap.asJava)
}

if (preparedTopic.group.isLinksAllowed) {
form.setLinktext(message.linktext)
form.setUrl(message.url)
}
Expand Down Expand Up @@ -165,11 +184,6 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
form.setPoll(PollVariant.toMap(poll.getVariants))
form.setMultiselect(poll.multiSelect)
}

params.put("imagepost", Boolean.box(permissionService.isImagePostingAllowed(preparedTopic.section, currentUser)))
params.put("mode", messageText.markup.title)

new ModelAndView("edit", params.asJava)
}

@ModelAttribute("ipBlockInfo")
Expand All @@ -184,12 +198,12 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
@ModelAttribute("ipBlockInfo") ipBlockInfo: IPBlockInfo): ModelAndView = AuthorizedOnly { currentUser =>
val tmpl = Template.getTemplate

val params = new mutable.HashMap[String, AnyRef]()

val topic = messageDao.getById(msgid)
val preparedTopic = prepareService.prepareTopic(topic, currentUser.user)

val params = prepareModel(preparedTopic, currentUser.user, tmpl.getProf)

val group = preparedTopic.group
val section = preparedTopic.section
val user = currentUser.user

IPBlockDao.checkBlockIP(ipBlockInfo, errors, user)
Expand All @@ -201,12 +215,6 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
throw new AccessViolationException("это сообщение нельзя править")
}

params.put("message", topic)
params.put("preparedMessage", preparedTopic)
params.put("group", group)
params.put("topicMenu", prepareService.getTopicMenu(preparedTopic, user, tmpl.getProf, loadUserpics = true))
params.put("groups", groupDao.getGroups(preparedTopic.section))

if (editable) {
val title = request.getParameter("title")
if (title == null || title.trim.isEmpty) {
Expand All @@ -224,7 +232,6 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe

if (editInfoList.nonEmpty) {
val editHistoryRecord = editInfoList.head
params.put("editInfo", editHistoryRecord)

if (lastEdit == null || editHistoryRecord.getEditdate.getTime.toString != lastEdit) {
errors.reject(null, "Сообщение было отредактировано независимо")
Expand Down Expand Up @@ -279,16 +286,19 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
}
}

var imagePreview: Option[UploadedImagePreview] = None
if (permissionService.isImagePostingAllowed(preparedTopic.section, user)) {
if (permissionService.isTopicPostingAllowed(group, user)) {
val imagePreview: Option[UploadedImagePreview] =
if (permissionService.isImagePostingAllowed(preparedTopic.section, user) && permissionService.isTopicPostingAllowed(group, user)) {
val image = imageService.processUploadImage(request)
imagePreview = imageService.processUpload(user, request.getSession, image, errors)
val preview = imageService.processUpload(user, Option(form.getUploadedImage), image, errors)

if (imagePreview.isDefined) {
preview.foreach { img =>
modified = true
form.setUploadedImage(img.mainFile.getName)
}
}

preview
} else {
None
}

if (!editable && modified) {
Expand All @@ -305,7 +315,7 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
newTags = Some(TagName.parseAndSanitizeTags(form.getTags)).filter(_.nonEmpty)

newTags.foreach { newTags =>
if (!permissionService.canCreateTag(section, user)) {
if (!permissionService.canCreateTag(preparedTopic.section, user)) {
val nonExistingTags = tagService.getNewTags(newTags)

if (nonExistingTags.nonEmpty) {
Expand Down Expand Up @@ -380,8 +390,6 @@ class EditTopicController(messageDao: TopicDao, searchQueueSender: SearchQueueSe
prepareService.prepareTopicPreview(newMsg, newTags.map(t => TagService.namesToRefs(t.asJava).asScala.toSeq).getOrElse(Seq.empty),
newPoll, newText, imageObject))

params.put("mode", oldText.markup.title)

new ModelAndView("edit", params.asJava)
}

Expand Down
10 changes: 6 additions & 4 deletions src/main/scala/ru/org/linux/topic/TopicPrepareService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,12 @@ class TopicPrepareService(sectionService: SectionService, groupDao: GroupDao, de
val processedMessage = textService.renderTopic(text, minimizeCut, !topicPermissionService.followInTopic(topic, author), url)

val preparedImage = if (section.isImagepost || section.isImageAllowed) {
val loadedImage = if (topic.id != 0) {
imageService.imageForTopic(topic).toScala
} else {
image
val loadedImage = image.orElse {
if (topic.id != 0) {
imageService.imageForTopic(topic).toScala
} else {
None
}
}

loadedImage.flatMap(imageService.prepareImage)
Expand Down
3 changes: 2 additions & 1 deletion src/main/webapp/WEB-INF/jsp/add.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<%@ page import="ru.org.linux.topic.TopicTagService" %>
<%@ page import="ru.org.linux.gallery.Image" %>
<%--
~ Copyright 1998-2022 Linux.org.ru
~ Copyright 1998-2023 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
Expand Down Expand Up @@ -130,6 +130,7 @@
</div>

<c:if test="${imagepost}">
<form:hidden path="uploadedImage"/>
<div class="control-group">
<label for="image">Изображение:</label>
<input id="image" type="file" name="image">
Expand Down
6 changes: 4 additions & 2 deletions src/main/webapp/WEB-INF/jsp/edit.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--
~ Copyright 1998-2022 Linux.org.ru
~ Copyright 1998-2023 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
Expand Down Expand Up @@ -66,7 +66,7 @@
</c:if>

<c:if test="${newPreparedMessage!=null}">
<h2>Ваше сообщение</h2>
<h2>Ваше сообщение</h2>
<div class=messages>
<lor:topic messageMenu="${topicMenu}" preparedMessage="${newPreparedMessage}" message="${newMsg}" showMenu="false"/>
</div>
Expand All @@ -90,6 +90,8 @@
</div>

<c:if test="${imagepost}">
<form:hidden path="uploadedImage"/>

<div class="control-group">
<c:if test="${preparedMessage.image!=null}">
<label for="image">Заменить изображение:</label>
Expand Down

0 comments on commit e99fabf

Please sign in to comment.