EN · DE · RU · FR · ES

#93: DataTransferPageRest.kt

plugins/org.projectforge.plugins.datatransfer/src/main/kotlin/org/projectforge/plugins/datatransfer/rest/DataTransferPageRest.kt Typ: Kotlin · Rolle: Plugin-Registrierung · Quelle: plugins/org.projectforge.plugins.datatransfer/src/main/kotlin/org/projectforge/plugins/datatransfer/rest/DataTransferPageRest.kt 366 Zeilen · 310 Code · 38 Kommentare · 18 leer
REST-API-Endpunkt für DataTransfer. Verarbeitet HTTP-Anfragen und gibt JSON-Antworten für das React-Frontend zurück.

Codestruktur

Annotationen: PostConstruct, Valid, GetMapping, RequestBody, PathVariable, Autowired, return, RequestMapping, RestController, PostMapping, RequestParam

Klassen: DataTransferPageRest

Supertyp(en): AbstractDynamicPageRest

Funktionen (7): postConstruct, downloadAll, getForm, watchFields, isLoggedInUserObserver, hasEditAccess, convertData

Eigenschaften (25): attachmentsService, attachmentsServicesRest, dataTransferAreaPagesRest, dataTransferAreaDao, groupService, pair, dbObj, dto, id, pair, dbObj, dto, layout, attachmentsFieldset, fieldSet, id, userWantsToOserveArea, loggedInUser, dbDto, dbObj, newObservers, user, dbObj, dto, accessGroupUsers

Importe: 30 Pakete

Paket: org.projectforge.plugins.datatransfer.rest

Quellcode (gekürzt)

package org.projectforge.plugins.datatransfer.rest

import org.projectforge.business.group.service.GroupService
import org.projectforge.business.user.service.UserService
import org.projectforge.common.NumberOfBytes
import org.projectforge.framework.jcr.AttachmentsService
import org.projectforge.framework.persistence.user.api.ThreadLocalUserContext
import org.projectforge.framework.persistence.user.entities.PFUserDO
import org.projectforge.framework.utils.NumberHelper
import org.projectforge.menu.MenuItem
import org.projectforge.menu.MenuItemTargetType
import org.projectforge.model.rest.RestPaths
import org.projectforge.plugins.datatransfer.DataTransferAreaDO
import org.projectforge.plugins.datatransfer.DataTransferAreaDao
import org.projectforge.plugins.datatransfer.DataTransferPlugin
import org.projectforge.plugins.datatransfer.DataTransferUtils
import org.projectforge.rest.AttachmentsServicesRest
import org.projectforge.rest.config.Rest
import org.projectforge.rest.core.AbstractDynamicPageRest
import org.projectforge.rest.core.PagesResolver
import org.projectforge.rest.core.RestResolver
import org.projectforge.rest.dto.FormLayoutData
import org.projectforge.rest.dto.PostData
import org.projectforge.rest.dto.User
import org.projectforge.ui.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import jakarta.annotation.PostConstruct
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import jakarta.validation.Valid

/**
 * Seite des Datenübertragungsbereichs mit Anhangsliste (inkl. Hochladen/Herunterladen und Bearbeitung).
 */
@RestController
@RequestMapping("${Rest.URL}/datatransferfiles")
class DataTransferPageRest : AbstractDynamicPageRest() {
  @Autowired
  private lateinit var attachmentsService: AttachmentsService

  @Autowired
  private lateinit var attachmentsServicesRest: AttachmentsServicesRest

  @Autowired
  private lateinit var dataTransferAreaPagesRest: DataTransferAreaPagesRest

  @Autowired
  private lateinit var dataTransferAreaDao: DataTransferAreaDao

  @Autowired
  private lateinit var groupService: GroupService

  @PostConstruct
  private fun postConstruct() {
    attachmentsServicesRest.register(
      dataTransferAreaPagesRest.category,
      DataTransferAttachmentsActionListener(attachmentsService, dataTransferAreaDao)
    )
  }

  @GetMapping("downloadAll/{id}")
  fun downloadAll(
    @PathVariable("id", required = true) id: Long,
    response: HttpServletResponse
  ) {
    val pair = convertData(id)
    val dbObj = pair.first
    val dto = pair.second
    DataTransferRestUtils.multiDownload(
      response,
      attachmentsService,
      dataTransferAreaPagesRest.attachmentsAccessChecker,
      dbObj,
      dto.areaName,
      jcrPath = dataTransferAreaPagesRest.jcrPath!!,
      id,
      dto.attachments,
      byUser = ThreadLocalUserContext.loggedInUser
    )
  }

  @GetMapping("dynamic")
  fun getForm(request: HttpServletRequest, @RequestParam("id") idString: String?): FormLayoutData {
    var id = NumberHelper.parseLong(idString)
    if (id == -1L) {
      // Persönliche Box des angemeldeten Benutzers wird angefordert:
      id = dataTransferAreaDao.ensurePersonalBox(ThreadLocalUserContext.loggedInUserId!!)?.id
    }
    id ?: throw IllegalAccessException("Parameter id ist keine ganze Zahl oder keine persönliche Box gefunden.")
    val pair = convertData(id)
    val dbObj = pair.first
    val dto = pair.second
    val layout = UILayout("plugins.datatransfer.title.heading")
    val attachmentsFieldset = UIFieldset(title = "'${dto.areaName}")
    attachmentsFieldset.add(
      UIAttachmentList(
        DataTransferPlugin.ID,
        id,
        showExpiryInfo = true,
        maxSizeInKB = DataTransferAreaDao.getMaxUploadFileSizeKB(dbObj)
      )
    )
    if ((dto.attachmentsSize ?: 0) in 1..NumberOfBytes.GIGA_BYTES) {
      // Nicht alle herunterladen bei Anhängen mit einer Gesamtgröße von mehr als 1 GB.
      attachmentsFieldset.add(
        UIButton.createDownloadButton(
          id = "downloadAll",
          title = "plugins.datatransfer.button.downloadAll",
          tooltip = "plugins.datatransfer.button.downloadAll.info",
          responseAction = ResponseAction(
            RestResolver.getRestUrl(
              this.javaClass,
              "downloadAll/$id"
            ), targetType = TargetType.DOWNLOAD
          ),
          default = true
        )
// ... (gekürzt, insgesamt 344 Zeilen)

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelltext-Dateiköpfe: 2024 -> 2025.
4942c854d Migrationsarbeiten in Bearbeitung...
1b50060c3 BaseDao: umbenannt: get -> find, save -> insert, getList -> select, load -> select
2a8ea2076 Migrationsarbeiten in Bearbeitung... BaseDao umgestaltet (noch nicht abgeschlossen) interne* Methoden umbenannt.