Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cas2v2/cba 85 add bail hearing dates #2846

Merged
merged 12 commits into from
Jan 22, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.Application
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.NewApplication
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
Expand Down Expand Up @@ -103,6 +104,7 @@ class Cas2v2ApplicationController(
.body(cas2v2ApplicationsTransformer.transformJpaToApi(application, personInfo))
}

@Suppress("TooGenericExceptionThrown")
@Transactional
override fun applicationsApplicationIdPut(
applicationId: UUID,
Expand All @@ -112,12 +114,16 @@ class Cas2v2ApplicationController(

val serializedData = objectMapper.writeValueAsString(body.data)

val applicationResult = cas2v2ApplicationService.updateCas2v2Application(
applicationId =
applicationId,
data = serializedData,
user,
)
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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import jakarta.persistence.OrderBy
import jakarta.persistence.Table
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
import java.time.LocalDate
import java.time.OffsetDateTime
import java.util.UUID

Expand All @@ -31,7 +30,6 @@ data class Cas2v2AssessmentEntity(
var nacroReferralId: String? = null,

var assessorName: String? = null,
var bailHearingDate: LocalDate? = null,

@OneToMany(mappedBy = "assessment")
@OrderBy("createdAt DESC")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,12 @@ class Cas2v2ApplicationService(
}

@SuppressWarnings("ReturnCount")
fun updateCas2v2Application(applicationId: UUID, data: String?, user: NomisUserEntity): CasResult<Cas2v2ApplicationEntity> {
fun updateCas2v2Application(
applicationId: UUID,
data: String?,
user: NomisUserEntity,
bailHearingDate: LocalDate?,
): CasResult<Cas2v2ApplicationEntity> {
val application = cas2v2ApplicationRepository.findByIdOrNull(applicationId)?.let(jsonSchemaService::checkCas2v2SchemaOutdated)
?: return CasResult.NotFound()

Expand All @@ -193,6 +198,8 @@ class Cas2v2ApplicationService(
return CasResult.GeneralValidationError("The schema version is outdated")
}

application.bailHearingDate = bailHearingDate

application.apply {
this.data = removeXssCharacters(data)
}
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/static/_shared.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2249,8 +2249,6 @@ components:
bailHearingDate:
type: string
format: date
applicationOrigin:
$ref: "#/components/schemas/ApplicationOrigin"
UpdateApprovedPremisesApplication:
allOf:
- $ref: '#/components/schemas/UpdateApplication'
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/static/codegen/built-api-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6550,8 +6550,6 @@ components:
bailHearingDate:
type: string
format: date
applicationOrigin:
$ref: "#/components/schemas/ApplicationOrigin"
UpdateApprovedPremisesApplication:
allOf:
- $ref: '#/components/schemas/UpdateApplication'
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/static/codegen/built-cas1-api-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3471,8 +3471,6 @@ components:
bailHearingDate:
type: string
format: date
applicationOrigin:
$ref: "#/components/schemas/ApplicationOrigin"
UpdateApprovedPremisesApplication:
allOf:
- $ref: '#/components/schemas/UpdateApplication'
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/static/codegen/built-cas2-api-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2840,8 +2840,6 @@ components:
bailHearingDate:
type: string
format: date
applicationOrigin:
$ref: "#/components/schemas/ApplicationOrigin"
UpdateApprovedPremisesApplication:
allOf:
- $ref: '#/components/schemas/UpdateApplication'
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/static/codegen/built-cas2v2-api-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2840,8 +2840,6 @@ components:
bailHearingDate:
type: string
format: date
applicationOrigin:
$ref: "#/components/schemas/ApplicationOrigin"
UpdateApprovedPremisesApplication:
allOf:
- $ref: '#/components/schemas/UpdateApplication'
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/static/codegen/built-cas3-api-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2348,8 +2348,6 @@ components:
bailHearingDate:
type: string
format: date
applicationOrigin:
$ref: "#/components/schemas/ApplicationOrigin"
UpdateApprovedPremisesApplication:
allOf:
- $ref: '#/components/schemas/UpdateApplication'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.NewApplication
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.PersonStatus
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.ServiceName
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.UpdateApplicationType
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.UpdateCas2Application
import uk.gov.justice.digital.hmpps.approvedpremisesapi.api.model.UpdateCas2v2Application
import uk.gov.justice.digital.hmpps.approvedpremisesapi.integration.Cas2v2IntegrationTestBase
import uk.gov.justice.digital.hmpps.approvedpremisesapi.integration.givens.givenACas2Assessor
import uk.gov.justice.digital.hmpps.approvedpremisesapi.integration.givens.givenACas2LicenceCaseAdminUser
Expand Down Expand Up @@ -1677,9 +1677,9 @@ class Cas2v2ApplicationTest : Cas2v2IntegrationTestBase() {
.uri("/cas2v2/applications/$applicationId")
.header("Authorization", "Bearer $jwt")
.bodyValue(
UpdateCas2Application(
UpdateCas2v2Application(
data = mapOf("thingId" to 123),
type = UpdateApplicationType.CAS2,
type = UpdateApplicationType.CAS2V2,
),
)
.exchange()
Expand Down Expand Up @@ -1725,9 +1725,9 @@ class Cas2v2ApplicationTest : Cas2v2IntegrationTestBase() {
.uri("/cas2v2/applications/$applicationId")
.header("Authorization", "Bearer $jwt")
.bodyValue(
UpdateCas2Application(
UpdateCas2v2Application(
data = mapOf("thingId" to 123),
type = UpdateApplicationType.CAS2,
type = UpdateApplicationType.CAS2V2,
),
)
.exchange()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.getPageableOrAllPag
import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.randomStringMultiCaseWithNumbers
import java.time.LocalDate
import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter
import java.util.UUID

class Cas2v2ApplicationServiceTest {
Expand Down Expand Up @@ -327,6 +328,7 @@ class Cas2v2ApplicationServiceTest {
fun `returns Success with created Application`() {
val crn = "CRN345"
val username = "SOMEPERSON"
val bailHearingDate = LocalDate.of(2024, 12, 18)

val cas2v2ApplicationSchema = Cas2v2ApplicationJsonSchemaEntityFactory().produce()

Expand All @@ -342,11 +344,12 @@ class Cas2v2ApplicationServiceTest {
Cas2v2ApplicationEntity
}

val result = cas2v2ApplicationService.createCas2v2Application(crn, user, null)
val result = cas2v2ApplicationService.createCas2v2Application(crn, user, bailHearingDate)

assertThat(result is ValidatableActionResult.Success).isTrue
result as ValidatableActionResult.Success
assertThat(result.entity.crn).isEqualTo(crn)
assertThat(result.entity.bailHearingDate).isEqualTo(bailHearingDate)
// assertThat(result.entity.createdByUser).isEqualTo(user)
}
}
Expand All @@ -366,7 +369,8 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = "{}",
user = user,
) is AuthorisableActionResult.NotFound,
null,
) is CasResult.NotFound,
).isTrue
}

Expand All @@ -392,7 +396,8 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = "{}",
user = user,
) is AuthorisableActionResult.Unauthorised,
null,
) is CasResult.Unauthorised,
).isTrue
}

Expand Down Expand Up @@ -421,15 +426,12 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = "{}",
user = user,
null,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success
result as CasResult.GeneralValidationError

assertThat(result.entity is ValidatableActionResult.GeneralValidationError).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.GeneralValidationError

assertThat(validatableActionResult.message).isEqualTo("This application has already been submitted")
assertThat(result.message).isEqualTo("This application has already been submitted")
}

@Test
Expand All @@ -455,15 +457,12 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = "{}",
user = user,
null,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success
result as CasResult.GeneralValidationError

assertThat(result.entity is ValidatableActionResult.GeneralValidationError).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.GeneralValidationError

assertThat(validatableActionResult.message).isEqualTo("This application has been abandoned")
assertThat(result.message).isEqualTo("This application has been abandoned")
}

@Test
Expand All @@ -486,15 +485,11 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = "{}",
user = user,
null,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success

assertThat(result.entity is ValidatableActionResult.GeneralValidationError).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.GeneralValidationError

assertThat(validatableActionResult.message).isEqualTo("The schema version is outdated")
result as CasResult.GeneralValidationError
assertThat(result.message).isEqualTo("The schema version is outdated")
}

@ParameterizedTest
Expand Down Expand Up @@ -538,15 +533,12 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = updatedData,
user = user,
null,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success

assertThat(result.entity is ValidatableActionResult.Success).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.Success
result as CasResult.Success

val cas2v2Application = validatableActionResult.entity
val cas2v2Application = extractEntityFromCasResult(result)

assertThat(cas2v2Application.data).isEqualTo(
"""
Expand All @@ -561,10 +553,14 @@ class Cas2v2ApplicationServiceTest {
fun `returns Success with updated Application`() {
val applicationId = UUID.fromString("fa6e97ce-7b9e-473c-883c-83b1c2af773d")

val bailHearingDate = LocalDate.of(2030, 12, 18)
var formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")

val newestSchema = Cas2v2ApplicationJsonSchemaEntityFactory().produce()
val updatedData = """
{
"aProperty": "value"
"bailHearingDate": "${bailHearingDate.format(formatter)}"
}
"""

Expand Down Expand Up @@ -597,17 +593,17 @@ class Cas2v2ApplicationServiceTest {
applicationId = applicationId,
data = updatedData,
user = user,
bailHearingDate,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success
result as CasResult.Success

assertThat(result.entity is ValidatableActionResult.Success).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.Success
val cas2v2Application = extractEntityFromCasResult(result)

val cas2v2Application = validatableActionResult.entity
verify { mockCas2v2ApplicationRepository.save(application) }

assertThat(cas2v2Application.data).isEqualTo(updatedData)
assertThat(cas2v2Application.bailHearingDate).isEqualTo(bailHearingDate)
}
}

Expand All @@ -625,7 +621,7 @@ class Cas2v2ApplicationServiceTest {
cas2v2ApplicationService.abandonCas2v2Application(
applicationId = applicationId,
user = user,
) is AuthorisableActionResult.NotFound,
) is CasResult.NotFound,
).isTrue
}

Expand All @@ -648,7 +644,7 @@ class Cas2v2ApplicationServiceTest {
cas2v2ApplicationService.abandonCas2v2Application(
applicationId = applicationId,
user = user,
) is AuthorisableActionResult.Unauthorised,
) is CasResult.Unauthorised,
).isTrue
}

Expand Down Expand Up @@ -676,13 +672,9 @@ class Cas2v2ApplicationServiceTest {
user = user,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success
result as CasResult.ConflictError

assertThat(result.entity is ValidatableActionResult.ConflictError).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.ConflictError

assertThat(validatableActionResult.message).isEqualTo("This application has already been submitted")
assertThat(result.message).isEqualTo("This application has already been submitted")
}

@Test
Expand All @@ -709,10 +701,8 @@ class Cas2v2ApplicationServiceTest {
user = user,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success

assertThat(result.entity is ValidatableActionResult.Success).isTrue
result as CasResult.Success
assertThat(result).isNotNull
}

@Test
Expand Down Expand Up @@ -748,13 +738,9 @@ class Cas2v2ApplicationServiceTest {
user = user,
)

assertThat(result is AuthorisableActionResult.Success).isTrue
result as AuthorisableActionResult.Success

assertThat(result.entity is ValidatableActionResult.Success).isTrue
val validatableActionResult = result.entity as ValidatableActionResult.Success
result as CasResult.Success

val cas2v2Application = validatableActionResult.entity
val cas2v2Application = extractEntityFromCasResult(result)

assertThat(cas2v2Application.data).isNull()
}
Expand Down