feat(#4): Add versioning of application form
This commit is contained in:
@@ -275,6 +275,111 @@ paths:
|
||||
"503":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"
|
||||
|
||||
/application-forms/{id}/versions:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
get:
|
||||
summary: Get all versions of an application form
|
||||
operationId: getApplicationFormVersions
|
||||
tags:
|
||||
- application-form-version
|
||||
responses:
|
||||
"200":
|
||||
description: List of versions
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/components/schemas/ApplicationFormVersionListItemDto"
|
||||
"400":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
|
||||
"401":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
|
||||
"404":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
|
||||
"500":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
|
||||
"503":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"
|
||||
|
||||
/application-forms/{id}/versions/{versionNumber}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
- name: versionNumber
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: integer
|
||||
get:
|
||||
summary: Get specific version with full snapshot
|
||||
operationId: getApplicationFormVersion
|
||||
tags:
|
||||
- application-form-version
|
||||
responses:
|
||||
"200":
|
||||
description: Version details with snapshot
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ApplicationFormVersionDto"
|
||||
"400":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
|
||||
"401":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
|
||||
"404":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
|
||||
"500":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
|
||||
"503":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"
|
||||
|
||||
/application-forms/{id}/versions/{versionNumber}/restore:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
- name: versionNumber
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: integer
|
||||
post:
|
||||
summary: Restore a specific version
|
||||
operationId: restoreApplicationFormVersion
|
||||
tags:
|
||||
- application-form-version
|
||||
responses:
|
||||
"200":
|
||||
description: Restored application form
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/ApplicationFormDto"
|
||||
"400":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
|
||||
"401":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
|
||||
"404":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
|
||||
"500":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
|
||||
"503":
|
||||
$ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"
|
||||
|
||||
####### Application Form Templates #######
|
||||
/application-form-templates:
|
||||
get:
|
||||
@@ -1017,6 +1122,92 @@ components:
|
||||
items:
|
||||
$ref: "#/components/schemas/ApplicationFormDto"
|
||||
|
||||
ApplicationFormSnapshotDto:
|
||||
type: object
|
||||
required:
|
||||
- name
|
||||
- status
|
||||
- organizationId
|
||||
- sections
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
status:
|
||||
$ref: "#/components/schemas/ApplicationFormStatus"
|
||||
organizationId:
|
||||
type: string
|
||||
sections:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/components/schemas/FormElementSectionSnapshotDto"
|
||||
|
||||
####### ApplicationFormVersion #######
|
||||
ApplicationFormVersionDto:
|
||||
type: object
|
||||
required:
|
||||
- id
|
||||
- applicationFormId
|
||||
- versionNumber
|
||||
- name
|
||||
- status
|
||||
- organizationId
|
||||
- snapshot
|
||||
- createdBy
|
||||
- createdAt
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
format: uuid
|
||||
applicationFormId:
|
||||
type: string
|
||||
format: uuid
|
||||
versionNumber:
|
||||
type: integer
|
||||
name:
|
||||
type: string
|
||||
status:
|
||||
$ref: "#/components/schemas/ApplicationFormStatus"
|
||||
organizationId:
|
||||
type: string
|
||||
snapshot:
|
||||
$ref: "#/components/schemas/ApplicationFormSnapshotDto"
|
||||
createdBy:
|
||||
$ref: "#/components/schemas/UserDto"
|
||||
createdAt:
|
||||
type: string
|
||||
format: date-time
|
||||
|
||||
ApplicationFormVersionListItemDto:
|
||||
type: object
|
||||
required:
|
||||
- id
|
||||
- applicationFormId
|
||||
- versionNumber
|
||||
- name
|
||||
- status
|
||||
- organizationId
|
||||
- createdBy
|
||||
- createdAt
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
format: uuid
|
||||
applicationFormId:
|
||||
type: string
|
||||
format: uuid
|
||||
versionNumber:
|
||||
type: integer
|
||||
name:
|
||||
type: string
|
||||
status:
|
||||
$ref: "#/components/schemas/ApplicationFormStatus"
|
||||
organizationId:
|
||||
type: string
|
||||
createdBy:
|
||||
$ref: "#/components/schemas/UserDto"
|
||||
createdAt:
|
||||
type: string
|
||||
format: date-time
|
||||
|
||||
####### Form #######
|
||||
FormElementSectionDto:
|
||||
@@ -1044,6 +1235,23 @@ components:
|
||||
type: string
|
||||
format: uuid
|
||||
|
||||
FormElementSectionSnapshotDto:
|
||||
type: object
|
||||
required:
|
||||
- title
|
||||
- elements
|
||||
properties:
|
||||
title:
|
||||
type: string
|
||||
shortTitle:
|
||||
type: string
|
||||
description:
|
||||
type: string
|
||||
elements:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/components/schemas/FormElementSnapshotDto"
|
||||
|
||||
CreateFormElementSectionDto:
|
||||
type: object
|
||||
required:
|
||||
@@ -1089,6 +1297,23 @@ components:
|
||||
type: string
|
||||
format: uuid
|
||||
|
||||
FormElementSnapshotDto:
|
||||
type: object
|
||||
required:
|
||||
- type
|
||||
- options
|
||||
properties:
|
||||
title:
|
||||
type: string
|
||||
description:
|
||||
type: string
|
||||
type:
|
||||
$ref: "#/components/schemas/FormElementType"
|
||||
options:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/components/schemas/FormOptionDto"
|
||||
|
||||
CreateFormElementDto:
|
||||
type: object
|
||||
required:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form
|
||||
|
||||
import com.betriebsratkanzlei.legalconsenthub.application_form_version.ApplicationFormVersionService
|
||||
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormInvalidStateException
|
||||
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotCreatedException
|
||||
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotDeletedException
|
||||
@@ -8,6 +9,7 @@ import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotUpdatedExc
|
||||
import com.betriebsratkanzlei.legalconsenthub.error.FormElementSectionNotFoundException
|
||||
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementMapper
|
||||
import com.betriebsratkanzlei.legalconsenthub.notification.NotificationService
|
||||
import com.betriebsratkanzlei.legalconsenthub.user.UserService
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateApplicationFormDto
|
||||
@@ -25,6 +27,8 @@ class ApplicationFormService(
|
||||
private val applicationFormMapper: ApplicationFormMapper,
|
||||
private val formElementMapper: FormElementMapper,
|
||||
private val notificationService: NotificationService,
|
||||
private val versionService: ApplicationFormVersionService,
|
||||
private val userService: UserService,
|
||||
) {
|
||||
fun createApplicationForm(createApplicationFormDto: CreateApplicationFormDto): ApplicationForm {
|
||||
val applicationForm = applicationFormMapper.toApplicationForm(createApplicationFormDto)
|
||||
@@ -35,6 +39,9 @@ class ApplicationFormService(
|
||||
throw ApplicationFormNotCreatedException(e)
|
||||
}
|
||||
|
||||
val currentUser = userService.getCurrentUser()
|
||||
versionService.createVersion(savedApplicationForm, currentUser)
|
||||
|
||||
return savedApplicationForm
|
||||
}
|
||||
|
||||
@@ -58,6 +65,9 @@ class ApplicationFormService(
|
||||
throw ApplicationFormNotUpdatedException(e, applicationFormDto.id)
|
||||
}
|
||||
|
||||
val currentUser = userService.getCurrentUser()
|
||||
versionService.createVersion(updatedApplicationForm, currentUser)
|
||||
|
||||
return updatedApplicationForm
|
||||
}
|
||||
|
||||
@@ -90,6 +100,9 @@ class ApplicationFormService(
|
||||
throw ApplicationFormNotUpdatedException(e, id)
|
||||
}
|
||||
|
||||
val currentUser = userService.getCurrentUser()
|
||||
versionService.createVersion(savedApplicationForm, currentUser)
|
||||
|
||||
createNotificationForOrganization(savedApplicationForm)
|
||||
|
||||
return savedApplicationForm
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form_version
|
||||
|
||||
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm
|
||||
import com.betriebsratkanzlei.legalconsenthub.user.User
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus
|
||||
import jakarta.persistence.Column
|
||||
import jakarta.persistence.Entity
|
||||
import jakarta.persistence.EntityListeners
|
||||
import jakarta.persistence.EnumType
|
||||
import jakarta.persistence.Enumerated
|
||||
import jakarta.persistence.GeneratedValue
|
||||
import jakarta.persistence.Id
|
||||
import jakarta.persistence.JoinColumn
|
||||
import jakarta.persistence.ManyToOne
|
||||
import org.springframework.data.annotation.CreatedDate
|
||||
import org.springframework.data.jpa.domain.support.AuditingEntityListener
|
||||
import java.time.LocalDateTime
|
||||
import java.util.UUID
|
||||
|
||||
@Entity
|
||||
@EntityListeners(AuditingEntityListener::class)
|
||||
class ApplicationFormVersion(
|
||||
@Id
|
||||
@GeneratedValue
|
||||
var id: UUID? = null,
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "application_form_id", nullable = false)
|
||||
var applicationForm: ApplicationForm,
|
||||
@Column(nullable = false)
|
||||
var versionNumber: Int,
|
||||
@Column(nullable = false)
|
||||
var name: String,
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(nullable = false)
|
||||
var status: ApplicationFormStatus,
|
||||
@Column(nullable = false)
|
||||
var organizationId: String,
|
||||
@Column(nullable = false, columnDefinition = "TEXT")
|
||||
var snapshotData: String,
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "created_by_id", nullable = false)
|
||||
var createdBy: User,
|
||||
@CreatedDate
|
||||
@Column(nullable = false)
|
||||
var createdAt: LocalDateTime? = null,
|
||||
)
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form_version
|
||||
|
||||
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormMapper
|
||||
import com.betriebsratkanzlei.legalconsenthub.user.UserService
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.api.ApplicationFormVersionApi
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionListItemDto
|
||||
import org.springframework.http.ResponseEntity
|
||||
import org.springframework.security.access.prepost.PreAuthorize
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import java.util.UUID
|
||||
|
||||
@RestController
|
||||
class ApplicationFormVersionController(
|
||||
private val versionService: ApplicationFormVersionService,
|
||||
private val versionMapper: ApplicationFormVersionMapper,
|
||||
private val applicationFormMapper: ApplicationFormMapper,
|
||||
private val userService: UserService,
|
||||
) : ApplicationFormVersionApi {
|
||||
@PreAuthorize(
|
||||
"hasAnyRole('CHIEF_EXECUTIVE_OFFICER', 'BUSINESS_DEPARTMENT', 'IT_DEPARTMENT', 'HUMAN_RESOURCES', 'HEAD_OF_WORKS_COUNCIL', 'WORKS_COUNCIL', 'EMPLOYEE')",
|
||||
)
|
||||
override fun getApplicationFormVersions(id: UUID): ResponseEntity<List<ApplicationFormVersionListItemDto>> {
|
||||
val versions = versionService.getVersionsByApplicationFormId(id)
|
||||
return ResponseEntity.ok(versions.map { versionMapper.toApplicationFormVersionListItemDto(it) })
|
||||
}
|
||||
|
||||
@PreAuthorize(
|
||||
"hasAnyRole('CHIEF_EXECUTIVE_OFFICER', 'BUSINESS_DEPARTMENT', 'IT_DEPARTMENT', 'HUMAN_RESOURCES', 'HEAD_OF_WORKS_COUNCIL', 'WORKS_COUNCIL', 'EMPLOYEE')",
|
||||
)
|
||||
override fun getApplicationFormVersion(
|
||||
id: UUID,
|
||||
versionNumber: Int,
|
||||
): ResponseEntity<ApplicationFormVersionDto> {
|
||||
val version = versionService.getVersion(id, versionNumber)
|
||||
return ResponseEntity.ok(versionMapper.toApplicationFormVersionDto(version))
|
||||
}
|
||||
|
||||
@PreAuthorize(
|
||||
"hasAnyRole('CHIEF_EXECUTIVE_OFFICER', 'BUSINESS_DEPARTMENT', 'IT_DEPARTMENT', 'HUMAN_RESOURCES', 'HEAD_OF_WORKS_COUNCIL', 'WORKS_COUNCIL')",
|
||||
)
|
||||
override fun restoreApplicationFormVersion(
|
||||
id: UUID,
|
||||
versionNumber: Int,
|
||||
): ResponseEntity<ApplicationFormDto> {
|
||||
val currentUser = userService.getCurrentUser()
|
||||
val restoredForm = versionService.restoreVersion(id, versionNumber, currentUser)
|
||||
return ResponseEntity.ok(applicationFormMapper.toApplicationFormDto(restoredForm))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form_version
|
||||
|
||||
import com.betriebsratkanzlei.legalconsenthub.user.UserMapper
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormSnapshotDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionListItemDto
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
@Component
|
||||
class ApplicationFormVersionMapper(
|
||||
private val userMapper: UserMapper,
|
||||
private val objectMapper: ObjectMapper,
|
||||
) {
|
||||
fun toApplicationFormVersionDto(version: ApplicationFormVersion): ApplicationFormVersionDto {
|
||||
val snapshot = objectMapper.readValue(version.snapshotData, ApplicationFormSnapshotDto::class.java)
|
||||
|
||||
return ApplicationFormVersionDto(
|
||||
id = version.id ?: throw IllegalStateException("ApplicationFormVersion ID must not be null!"),
|
||||
applicationFormId =
|
||||
version.applicationForm.id
|
||||
?: throw IllegalStateException("ApplicationForm ID must not be null!"),
|
||||
versionNumber = version.versionNumber,
|
||||
name = version.name,
|
||||
status = version.status,
|
||||
organizationId = version.organizationId,
|
||||
snapshot = snapshot,
|
||||
createdBy = userMapper.toUserDto(version.createdBy),
|
||||
createdAt =
|
||||
version.createdAt
|
||||
?: throw IllegalStateException("ApplicationFormVersion createdAt must not be null!"),
|
||||
)
|
||||
}
|
||||
|
||||
fun toApplicationFormVersionListItemDto(version: ApplicationFormVersion): ApplicationFormVersionListItemDto =
|
||||
ApplicationFormVersionListItemDto(
|
||||
id = version.id ?: throw IllegalStateException("ApplicationFormVersion ID must not be null!"),
|
||||
applicationFormId =
|
||||
version.applicationForm.id
|
||||
?: throw IllegalStateException("ApplicationForm ID must not be null!"),
|
||||
versionNumber = version.versionNumber,
|
||||
name = version.name,
|
||||
status = version.status,
|
||||
organizationId = version.organizationId,
|
||||
createdBy = userMapper.toUserDto(version.createdBy),
|
||||
createdAt =
|
||||
version.createdAt
|
||||
?: throw IllegalStateException("ApplicationFormVersion createdAt must not be null!"),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form_version
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.stereotype.Repository
|
||||
import java.util.Optional
|
||||
import java.util.UUID
|
||||
|
||||
@Repository
|
||||
interface ApplicationFormVersionRepository : JpaRepository<ApplicationFormVersion, UUID> {
|
||||
fun findByApplicationFormIdOrderByVersionNumberDesc(applicationFormId: UUID): List<ApplicationFormVersion>
|
||||
|
||||
fun findByApplicationFormIdAndVersionNumber(
|
||||
applicationFormId: UUID,
|
||||
versionNumber: Int,
|
||||
): Optional<ApplicationFormVersion>
|
||||
|
||||
fun countByApplicationFormId(applicationFormId: UUID): Int
|
||||
}
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.application_form_version
|
||||
|
||||
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm
|
||||
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormRepository
|
||||
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException
|
||||
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormVersionNotFoundException
|
||||
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElement
|
||||
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementSection
|
||||
import com.betriebsratkanzlei.legalconsenthub.form_element.FormOption
|
||||
import com.betriebsratkanzlei.legalconsenthub.user.User
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormSnapshotDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSnapshotDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSectionSnapshotDto
|
||||
import com.betriebsratkanzlei.legalconsenthub_api.model.FormOptionDto
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import org.springframework.stereotype.Service
|
||||
import org.springframework.transaction.annotation.Transactional
|
||||
import java.util.UUID
|
||||
|
||||
@Service
|
||||
class ApplicationFormVersionService(
|
||||
private val versionRepository: ApplicationFormVersionRepository,
|
||||
private val applicationFormRepository: ApplicationFormRepository,
|
||||
private val objectMapper: ObjectMapper,
|
||||
) {
|
||||
@Transactional
|
||||
fun createVersion(
|
||||
applicationForm: ApplicationForm,
|
||||
user: User,
|
||||
): ApplicationFormVersion {
|
||||
val nextVersionNumber = versionRepository.countByApplicationFormId(applicationForm.id!!) + 1
|
||||
|
||||
val snapshot = createSnapshot(applicationForm)
|
||||
val snapshotJson = objectMapper.writeValueAsString(snapshot)
|
||||
|
||||
val version =
|
||||
ApplicationFormVersion(
|
||||
applicationForm = applicationForm,
|
||||
versionNumber = nextVersionNumber,
|
||||
name = applicationForm.name,
|
||||
status = applicationForm.status,
|
||||
organizationId = applicationForm.organizationId,
|
||||
snapshotData = snapshotJson,
|
||||
createdBy = user,
|
||||
)
|
||||
|
||||
return versionRepository.save(version)
|
||||
}
|
||||
|
||||
fun getVersionsByApplicationFormId(applicationFormId: UUID): List<ApplicationFormVersion> =
|
||||
versionRepository.findByApplicationFormIdOrderByVersionNumberDesc(applicationFormId)
|
||||
|
||||
fun getVersion(
|
||||
applicationFormId: UUID,
|
||||
versionNumber: Int,
|
||||
): ApplicationFormVersion =
|
||||
versionRepository
|
||||
.findByApplicationFormIdAndVersionNumber(applicationFormId, versionNumber)
|
||||
.orElseThrow { ApplicationFormVersionNotFoundException(applicationFormId, versionNumber) }
|
||||
|
||||
@Transactional
|
||||
fun restoreVersion(
|
||||
applicationFormId: UUID,
|
||||
versionNumber: Int,
|
||||
user: User,
|
||||
): ApplicationForm {
|
||||
val version = getVersion(applicationFormId, versionNumber)
|
||||
val applicationForm =
|
||||
applicationFormRepository
|
||||
.findById(applicationFormId)
|
||||
.orElseThrow { ApplicationFormNotFoundException(applicationFormId) }
|
||||
|
||||
val snapshot = objectMapper.readValue(version.snapshotData, ApplicationFormSnapshotDto::class.java)
|
||||
|
||||
applicationForm.name = snapshot.name
|
||||
applicationForm.status = snapshot.status
|
||||
applicationForm.organizationId = snapshot.organizationId
|
||||
applicationForm.lastModifiedBy = user
|
||||
|
||||
applicationForm.formElementSections.clear()
|
||||
snapshot.sections.forEach { sectionSnapshot ->
|
||||
val section = createSectionFromSnapshot(sectionSnapshot, applicationForm)
|
||||
applicationForm.formElementSections.add(section)
|
||||
}
|
||||
|
||||
val restoredForm = applicationFormRepository.save(applicationForm)
|
||||
|
||||
createVersion(restoredForm, user)
|
||||
|
||||
return restoredForm
|
||||
}
|
||||
|
||||
private fun createSnapshot(applicationForm: ApplicationForm): ApplicationFormSnapshotDto =
|
||||
ApplicationFormSnapshotDto(
|
||||
name = applicationForm.name,
|
||||
status = applicationForm.status,
|
||||
organizationId = applicationForm.organizationId,
|
||||
sections =
|
||||
applicationForm.formElementSections.map { section ->
|
||||
FormElementSectionSnapshotDto(
|
||||
title = section.title,
|
||||
shortTitle = section.shortTitle,
|
||||
description = section.description,
|
||||
elements =
|
||||
section.formElements.map { element ->
|
||||
FormElementSnapshotDto(
|
||||
title = element.title,
|
||||
description = element.description,
|
||||
type = element.type,
|
||||
options =
|
||||
element.options.map { option ->
|
||||
FormOptionDto(
|
||||
value = option.value,
|
||||
label = option.label,
|
||||
processingPurpose = option.processingPurpose,
|
||||
employeeDataCategory = option.employeeDataCategory,
|
||||
)
|
||||
},
|
||||
)
|
||||
},
|
||||
)
|
||||
},
|
||||
)
|
||||
|
||||
private fun createSectionFromSnapshot(
|
||||
sectionSnapshot: FormElementSectionSnapshotDto,
|
||||
applicationForm: ApplicationForm,
|
||||
): FormElementSection {
|
||||
val section =
|
||||
FormElementSection(
|
||||
title = sectionSnapshot.title,
|
||||
shortTitle = sectionSnapshot.shortTitle,
|
||||
description = sectionSnapshot.description,
|
||||
applicationForm = applicationForm,
|
||||
)
|
||||
|
||||
sectionSnapshot.elements.forEach { elementSnapshot ->
|
||||
val element =
|
||||
FormElement(
|
||||
title = elementSnapshot.title,
|
||||
description = elementSnapshot.description,
|
||||
type = elementSnapshot.type,
|
||||
formElementSection = section,
|
||||
options =
|
||||
elementSnapshot.options.map { optionDto ->
|
||||
FormOption(
|
||||
value = optionDto.value,
|
||||
label = optionDto.label,
|
||||
processingPurpose = optionDto.processingPurpose,
|
||||
employeeDataCategory = optionDto.employeeDataCategory,
|
||||
)
|
||||
}.toMutableList(),
|
||||
)
|
||||
section.formElements.add(element)
|
||||
}
|
||||
|
||||
return section
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.betriebsratkanzlei.legalconsenthub.error
|
||||
|
||||
import java.util.UUID
|
||||
|
||||
class ApplicationFormVersionNotFoundException(
|
||||
applicationFormId: UUID,
|
||||
versionNumber: Int,
|
||||
) : RuntimeException("Application form version $versionNumber for application form $applicationFormId not found")
|
||||
|
||||
Reference in New Issue
Block a user