All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.touk.nussknacker.ui.process.ScenarioAttachmentService.scala Maven / Gradle / Ivy

There is a newer version: 1.18.1
Show newest version
package pl.touk.nussknacker.ui.process

import com.typesafe.scalalogging.LazyLogging
import org.apache.commons.io.IOUtils
import org.apache.commons.io.input.BoundedInputStream
import pl.touk.nussknacker.engine.api.process.{ProcessId, VersionId}
import pl.touk.nussknacker.ui.config.AttachmentsConfig
import pl.touk.nussknacker.ui.process.ScenarioAttachmentService.{AttachmentDataWithName, AttachmentToAdd}
import pl.touk.nussknacker.ui.process.repository.DBIOActionRunner
import pl.touk.nussknacker.ui.process.repository.activities.ScenarioActivityRepository
import pl.touk.nussknacker.ui.security.api.LoggedUser

import java.io.InputStream
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Using

class ScenarioAttachmentService(
    config: AttachmentsConfig,
    scenarioActivityRepository: ScenarioActivityRepository,
    DBIOActionRunner: DBIOActionRunner,
)(
    implicit ec: ExecutionContext
) extends LazyLogging {

  def saveAttachment(
      scenarioId: ProcessId,
      scenarioVersionId: VersionId,
      originalFileName: String,
      inputStream: InputStream
  )(implicit loggedUser: LoggedUser): Future[Unit] = {
    Future
      .apply(new BoundedInputStream(inputStream, config.maxSizeInBytes + 1))
      .map(Using.resource(_) { isResource => IOUtils.toByteArray(isResource) })
      .flatMap { bytes =>
        if (bytes.length > config.maxSizeInBytes) {
          Future.failed(
            new IllegalArgumentException(s"Maximum (${config.maxSizeInBytes} bytes) attachment size exceeded.")
          )
        } else {
          DBIOActionRunner
            .run {
              scenarioActivityRepository.addAttachment(
                AttachmentToAdd(scenarioId, scenarioVersionId, originalFileName, bytes)
              )
            }
            .map(_ => ())
        }
      }
  }

  def readAttachment(attachmentId: Long, scenarioId: ProcessId): Future[Option[AttachmentDataWithName]] =
    DBIOActionRunner.run {
      scenarioActivityRepository
        .findAttachment(scenarioId, attachmentId)
        .map(_.map(attachment => (attachment.fileName, attachment.data)))
    }

}

object ScenarioAttachmentService {
  type AttachmentDataWithName = (String, Array[Byte])

  final case class AttachmentToAdd(
      scenarioId: ProcessId,
      scenarioVersionId: VersionId,
      fileName: String,
      data: Array[Byte]
  )

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy