generated from ministryofjustice/hmpps-template-kotlin
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2872 from ministryofjustice/cas2v2/dev
Cas2v2/dev
- Loading branch information
Showing
93 changed files
with
17,325 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
151 changes: 151 additions & 0 deletions
151
...ustice/digital/hmpps/approvedpremisesapi/controller/cas2v2/Cas2v2ApplicationController.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
package uk.gov.justice.digital.hmpps.approvedpremisesapi.controller.cas2v2 | ||
|
||
import com.fasterxml.jackson.databind.ObjectMapper | ||
import jakarta.transaction.Transactional | ||
import org.springframework.http.ResponseEntity | ||
import org.springframework.stereotype.Service | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.cas2v2.ApplicationsCas2v2Delegate | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.Application | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.NewCas2v2Application | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.SortDirection | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.UpdateApplication | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.UpdateCas2v2Application | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.jpa.entity.cas2v2.Cas2v2ApplicationEntity | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.jpa.entity.cas2v2.Cas2v2ApplicationSummaryEntity | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.problem.BadRequestProblem | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.problem.ConflictProblem | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.problem.ForbiddenProblem | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.results.ValidatableActionResult | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2.OffenderService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2v2.Cas2v2ApplicationService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2v2.Cas2v2UserService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.transformer.cas2v2.Cas2v2ApplicationsTransformer | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.PageCriteria | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.ensureEntityFromCasResultIsSuccess | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.extractEntityFromCasResult | ||
import java.net.URI | ||
import java.util.UUID | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.Cas2v2ApplicationSummary as ModelCas2v2ApplicationSummary | ||
|
||
@Service( | ||
"Cas2v2ApplicationController", | ||
) | ||
class Cas2v2ApplicationController( | ||
private val cas2v2ApplicationService: Cas2v2ApplicationService, | ||
private val cas2v2ApplicationsTransformer: Cas2v2ApplicationsTransformer, | ||
private val objectMapper: ObjectMapper, | ||
private val cas2OffenderService: OffenderService, | ||
private val userService: Cas2v2UserService, | ||
) : ApplicationsCas2v2Delegate { | ||
|
||
override fun applicationsGet( | ||
isSubmitted: Boolean?, | ||
page: Int?, | ||
prisonCode: String?, | ||
): ResponseEntity<List<ModelCas2v2ApplicationSummary>> { | ||
val user = userService.getUserForRequest() | ||
|
||
prisonCode?.let { if (prisonCode != user.activeNomisCaseloadId) throw ForbiddenProblem() } | ||
|
||
val pageCriteria = PageCriteria("createdAt", SortDirection.desc, page) | ||
|
||
val (applications, metadata) = cas2v2ApplicationService.getCas2v2Applications(prisonCode, isSubmitted, user, pageCriteria) | ||
|
||
return ResponseEntity.ok().headers( | ||
metadata?.toHeaders(), | ||
).body(getPersonNamesAndTransformToSummaries(applications)) | ||
} | ||
|
||
override fun applicationsApplicationIdGet(applicationId: UUID): ResponseEntity<Application> { | ||
val user = userService.getUserForRequest() | ||
|
||
val applicationResult = cas2v2ApplicationService | ||
.getCas2v2ApplicationForUser( | ||
applicationId, | ||
user, | ||
) | ||
|
||
val application = extractEntityFromCasResult(applicationResult) | ||
return ResponseEntity.ok(getPersonDetailAndTransform(application)) | ||
} | ||
|
||
@Transactional | ||
override fun applicationsPost(body: NewCas2v2Application): ResponseEntity<Application> { | ||
val user = userService.getUserForRequest() | ||
|
||
val personInfo = cas2OffenderService.getFullInfoForPersonOrThrow(body.crn) | ||
|
||
val applicationResult = cas2v2ApplicationService.createCas2v2Application( | ||
body.crn, | ||
user, | ||
body.applicationOrigin, | ||
body.bailHearingDate, | ||
) | ||
|
||
val application = when (applicationResult) { | ||
is ValidatableActionResult.GeneralValidationError -> throw BadRequestProblem(errorDetail = applicationResult.message) | ||
is ValidatableActionResult.FieldValidationError -> throw BadRequestProblem(invalidParams = applicationResult.validationMessages) | ||
is ValidatableActionResult.ConflictError -> throw ConflictProblem(id = applicationResult.conflictingEntityId, conflictReason = applicationResult.message) | ||
|
||
is ValidatableActionResult.Success -> applicationResult.entity | ||
} | ||
|
||
return ResponseEntity | ||
.created(URI.create("/cas2v2/applications/${application.id}")) | ||
.body(cas2v2ApplicationsTransformer.transformJpaToApi(application, personInfo)) | ||
} | ||
|
||
@Suppress("TooGenericExceptionThrown") | ||
@Transactional | ||
override fun applicationsApplicationIdPut( | ||
applicationId: UUID, | ||
body: UpdateApplication, | ||
): ResponseEntity<Application> { | ||
val user = userService.getUserForRequest() | ||
|
||
val serializedData = objectMapper.writeValueAsString(body.data) | ||
|
||
val applicationResult = when (body) { | ||
is UpdateCas2v2Application -> cas2v2ApplicationService.updateCas2v2Application( | ||
applicationId = applicationId, | ||
data = serializedData, | ||
user, | ||
body.bailHearingDate, | ||
) | ||
|
||
else -> throw RuntimeException("Unsupported UpdateApplication type: ${body::class.qualifiedName}") | ||
} | ||
|
||
val entity = extractEntityFromCasResult(applicationResult) | ||
return ResponseEntity.ok(getPersonDetailAndTransform(entity)) | ||
} | ||
|
||
@Transactional | ||
override fun applicationsApplicationIdAbandonPut(applicationId: UUID): ResponseEntity<Unit> { | ||
val user = userService.getUserForRequest() | ||
|
||
val applicationResult = cas2v2ApplicationService.abandonCas2v2Application(applicationId, user) | ||
ensureEntityFromCasResultIsSuccess(applicationResult) | ||
return ResponseEntity.ok(Unit) | ||
} | ||
|
||
private fun getPersonNamesAndTransformToSummaries( | ||
applicationSummaries: List<Cas2v2ApplicationSummaryEntity>, | ||
): List<ModelCas2v2ApplicationSummary> { | ||
val crns = applicationSummaries.map { it.crn } | ||
|
||
val personNamesMap = cas2OffenderService.getMapOfPersonNamesAndCrns(crns) | ||
|
||
return applicationSummaries.map { application -> | ||
cas2v2ApplicationsTransformer.transformJpaSummaryToSummary(application, personNamesMap[application.crn]!!) | ||
} | ||
} | ||
|
||
private fun getPersonDetailAndTransform( | ||
application: Cas2v2ApplicationEntity, | ||
): Application { | ||
val personInfo = cas2OffenderService.getFullInfoForPersonOrThrow(application.crn) | ||
|
||
return cas2v2ApplicationsTransformer.transformJpaToApi(application, personInfo) | ||
} | ||
} |
88 changes: 88 additions & 0 deletions
88
...ustice/digital/hmpps/approvedpremisesapi/controller/cas2v2/Cas2v2AssessmentsController.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package uk.gov.justice.digital.hmpps.approvedpremisesapi.controller.cas2v2 | ||
|
||
import org.springframework.http.HttpStatus | ||
import org.springframework.http.ResponseEntity | ||
import org.springframework.stereotype.Service | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.cas2v2.AssessmentsCas2v2Delegate | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.Cas2v2ApplicationNote | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.Cas2v2Assessment | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.Cas2v2AssessmentStatusUpdate | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.NewCas2ApplicationNote | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.UpdateCas2Assessment | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.results.CasResult | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2v2.Cas2v2ApplicationNoteService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2v2.Cas2v2AssessmentService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2v2.Cas2v2StatusUpdateService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.cas2v2.Cas2v2UserService | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.transformer.cas2v2.Cas2v2ApplicationNotesTransformer | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.transformer.cas2v2.Cas2v2AssessmentsTransformer | ||
import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.extractEntityFromCasResult | ||
import java.net.URI | ||
import java.util.UUID | ||
|
||
@Service("Cas2v2AssessmentsController") | ||
class Cas2v2AssessmentsController( | ||
private val cas2v2AssessmentService: Cas2v2AssessmentService, | ||
private val cas2v2ApplicationNoteService: Cas2v2ApplicationNoteService, | ||
private val cas2v2AssessmentsTransformer: Cas2v2AssessmentsTransformer, | ||
private val cas2v2ApplicationNotesTransformer: Cas2v2ApplicationNotesTransformer, | ||
private val cas2v2StatusUpdateService: Cas2v2StatusUpdateService, | ||
private val cas2v2UserService: Cas2v2UserService, | ||
) : AssessmentsCas2v2Delegate { | ||
|
||
override fun assessmentsAssessmentIdGet(assessmentId: UUID): ResponseEntity<Cas2v2Assessment> { | ||
val assessmentResult = cas2v2AssessmentService.getAssessment(assessmentId) | ||
val cas2v2AssessmentEntity = extractEntityFromCasResult(assessmentResult) | ||
return ResponseEntity.ok(cas2v2AssessmentsTransformer.transformJpaToApiRepresentation(cas2v2AssessmentEntity)) | ||
} | ||
|
||
override fun assessmentsAssessmentIdPut( | ||
assessmentId: UUID, | ||
updateCas2Assessment: UpdateCas2Assessment, | ||
): ResponseEntity<Cas2v2Assessment> { | ||
val assessmentResult = cas2v2AssessmentService.updateAssessment(assessmentId, updateCas2Assessment) | ||
|
||
val cas2v2AssessmentEntity = extractEntityFromCasResult(assessmentResult) | ||
return ResponseEntity.ok( | ||
cas2v2AssessmentsTransformer.transformJpaToApiRepresentation(cas2v2AssessmentEntity), | ||
) | ||
} | ||
|
||
override fun assessmentsAssessmentIdStatusUpdatesPost( | ||
assessmentId: UUID, | ||
cas2v2AssessmentStatusUpdate: Cas2v2AssessmentStatusUpdate, | ||
): ResponseEntity<Unit> { | ||
val result = cas2v2StatusUpdateService.createForAssessment( | ||
assessmentId = assessmentId, | ||
statusUpdate = cas2v2AssessmentStatusUpdate, | ||
assessor = cas2v2UserService.getUserForRequest(), | ||
) | ||
|
||
processAuthorisationFor(result).run { processValidation(result) } | ||
|
||
return ResponseEntity(HttpStatus.CREATED) | ||
} | ||
|
||
override fun assessmentsAssessmentIdNotesPost( | ||
assessmentId: UUID, | ||
body: NewCas2ApplicationNote, | ||
): ResponseEntity<Cas2v2ApplicationNote> { | ||
val noteResult = cas2v2ApplicationNoteService.createAssessmentNote(assessmentId, body) | ||
|
||
val note = extractEntityFromCasResult(noteResult) | ||
return ResponseEntity.created(URI.create("/cas2v2/assessments/$assessmentId/notes/${note.id}")) | ||
.body( | ||
cas2v2ApplicationNotesTransformer.transformJpaToApi(note), | ||
) | ||
} | ||
|
||
private fun <EntityType> processAuthorisationFor( | ||
result: CasResult<EntityType>, | ||
): Any? { | ||
return extractEntityFromCasResult(result) | ||
} | ||
|
||
private fun <EntityType : Any> processValidation(casResult: CasResult<EntityType>): Any { | ||
return extractEntityFromCasResult(casResult) | ||
} | ||
} |
Oops, something went wrong.