feat(fullstack): Add title and description to form element, add HTML and PDF endpoints for application form
This commit is contained in:
@@ -4,6 +4,10 @@ import com.betriebsratkanzlei.legalconsenthub_api.api.ApplicationFormApi
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateApplicationFormDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.PagedApplicationFormDto
|
||||
import org.springframework.core.io.ByteArrayResource
|
||||
import org.springframework.core.io.Resource
|
||||
import org.springframework.http.HttpHeaders
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.http.ResponseEntity
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import java.util.UUID
|
||||
@@ -13,6 +17,7 @@ class ApplicationFormController(
|
||||
val applicationFormService: ApplicationFormService,
|
||||
val pagedApplicationFormMapper: PagedApplicationFormMapper,
|
||||
val applicationFormMapper: ApplicationFormMapper,
|
||||
val applicationFormFormatService: ApplicationFormFormatService
|
||||
) : ApplicationFormApi {
|
||||
|
||||
override fun createApplicationForm(createApplicationFormDto: CreateApplicationFormDto): ResponseEntity<ApplicationFormDto> {
|
||||
@@ -40,6 +45,23 @@ class ApplicationFormController(
|
||||
)
|
||||
}
|
||||
|
||||
override fun getApplicationFormHtml(id: UUID): ResponseEntity<String> {
|
||||
val applicationForm = applicationFormService.getApplicationFormById(id)
|
||||
return ResponseEntity.ok(
|
||||
applicationFormFormatService.generateHtml(applicationForm)
|
||||
)
|
||||
}
|
||||
|
||||
override fun getApplicationFormPdf(id: UUID): ResponseEntity<Resource> {
|
||||
val applicationForm = applicationFormService.getApplicationFormById(id)
|
||||
val pdfBytes = applicationFormFormatService.generatePdf(applicationForm)
|
||||
val resource = ByteArrayResource(pdfBytes)
|
||||
return ResponseEntity.ok()
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"form-$id.pdf\"")
|
||||
.contentType(MediaType.APPLICATION_PDF)
|
||||
.body(resource)
|
||||
}
|
||||
|
||||
override fun updateApplicationForm(
|
||||
id: UUID,
|
||||
applicationFormDto: ApplicationFormDto
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form
|
||||
|
||||
import org.springframework.stereotype.Service
|
||||
import org.thymeleaf.TemplateEngine
|
||||
import org.thymeleaf.context.Context
|
||||
import java.io.ByteArrayOutputStream
|
||||
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder
|
||||
|
||||
@Service
|
||||
class ApplicationFormFormatService(
|
||||
private val templateEngine: TemplateEngine
|
||||
) {
|
||||
fun generatePdf(applicationForm: ApplicationForm): ByteArray {
|
||||
val htmlContent = generateHtml(applicationForm)
|
||||
|
||||
val outputStream = ByteArrayOutputStream()
|
||||
PdfRendererBuilder().useFastMode()
|
||||
.withHtmlContent(htmlContent, null)
|
||||
.toStream(outputStream)
|
||||
.run()
|
||||
|
||||
return outputStream.toByteArray()
|
||||
}
|
||||
|
||||
fun generateHtml(applicationForm: ApplicationForm): String {
|
||||
val context = Context().apply {
|
||||
setVariable("applicationForm", applicationForm)
|
||||
}
|
||||
return templateEngine.process("application_form_template", context)
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ import jakarta.persistence.OneToMany
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity
|
||||
class FormElement (
|
||||
class FormElement(
|
||||
@Id
|
||||
@GeneratedValue
|
||||
var id: UUID? = null,
|
||||
@@ -26,6 +26,10 @@ class FormElement (
|
||||
@JoinColumn(name = "application_form_id", nullable = false)
|
||||
var applicationForm: ApplicationForm? = null,
|
||||
|
||||
var title: String? = null,
|
||||
|
||||
var description: String? = null,
|
||||
|
||||
@ElementCollection
|
||||
@CollectionTable(name = "form_element_options", joinColumns = [JoinColumn(name = "form_element_id")])
|
||||
var options: MutableList<FormOption> = mutableListOf(),
|
||||
|
||||
@@ -15,6 +15,8 @@ class FormElementMapper(
|
||||
fun toFormElementDto(formElement: FormElement): FormElementDto {
|
||||
return FormElementDto(
|
||||
id = formElement.id ?: throw IllegalStateException("ApplicationForm ID must not be null!"),
|
||||
title = formElement.title,
|
||||
description = formElement.description,
|
||||
options = formElement.options.map { formOptionMapper.toFormOptionDto(it) },
|
||||
type = formElement.type,
|
||||
applicationFormId = formElement.applicationForm?.id
|
||||
@@ -28,6 +30,8 @@ class FormElementMapper(
|
||||
|
||||
return FormElement(
|
||||
id = formElement.id,
|
||||
title = formElement.title,
|
||||
description = formElement.description,
|
||||
options = formElement.options.map { formOptionMapper.toFormOption(it) }.toMutableList(),
|
||||
type = formElement.type,
|
||||
applicationForm = applicationForm
|
||||
@@ -37,6 +41,8 @@ class FormElementMapper(
|
||||
fun toFormElement(formElement: CreateFormElementDto, applicationForm: ApplicationForm): FormElement {
|
||||
return FormElement(
|
||||
id = null,
|
||||
title = formElement.title,
|
||||
description = formElement.description,
|
||||
options = formElement.options.map { formOptionMapper.toFormOption(it) }.toMutableList(),
|
||||
type = formElement.type,
|
||||
applicationForm = applicationForm
|
||||
|
||||
Reference in New Issue
Block a user