Skip to content

Commit

Permalink
PI-2266: Extra staff details for ap (#3953)
Browse files Browse the repository at this point in the history
* PI-2266: Extra staff details for ap
  • Loading branch information
pmcphee77 authored Jun 27, 2024
1 parent 31527d2 commit df74fb0
Show file tree
Hide file tree
Showing 24 changed files with 243 additions and 78 deletions.
2 changes: 2 additions & 0 deletions projects/approved-premises-and-delius/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-data-ldap")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation(libs.springdoc)

dev(project(":libs:dev-tools"))
dev("com.unboundid:unboundid-ldapsdk")
dev("com.h2database:h2")
dev("org.testcontainers:oracle-xe")

Expand Down
3 changes: 3 additions & 0 deletions projects/approved-premises-and-delius/deploy/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ generic-service:
namespace_secrets:
common:
SPRING_DATASOURCE_URL: DB_URL
SPRING_LDAP_URLS: LDAP_URL
SPRING_LDAP_USERNAME: LDAP_USERNAME
SPRING_LDAP_PASSWORD: LDAP_PASSWORD
approved-premises-and-delius-client-credentials:
OAUTH2_CLIENT-ID: CLIENT_ID
OAUTH2_CLIENT-SECRET: CLIENT_SECRET
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import uk.gov.justice.digital.hmpps.integrations.delius.contact.type.ContactType
import uk.gov.justice.digital.hmpps.integrations.delius.document.DocumentRepository
import uk.gov.justice.digital.hmpps.integrations.delius.location.OfficeLocationRepository
import uk.gov.justice.digital.hmpps.integrations.delius.nonstatutoryintervention.entity.*
import uk.gov.justice.digital.hmpps.integrations.delius.person.BoroughRepository
import uk.gov.justice.digital.hmpps.integrations.delius.person.PersonRepository
import uk.gov.justice.digital.hmpps.integrations.delius.person.address.PersonAddressRepository
import uk.gov.justice.digital.hmpps.integrations.delius.person.manager.probation.PersonManagerRepository
Expand Down Expand Up @@ -69,8 +70,10 @@ class DataLoader(
private val lduRepository: LduRepository,
private val staffUserRepository: StaffUserRepository,
private val documentRepository: DocumentRepository,
private val referralBookingDataLoader: ReferralBookingDataLoader
) : ApplicationListener<ApplicationReadyEvent> {
private val boroughRepository: BoroughRepository,
private val referralBookingDataLoader: ReferralBookingDataLoader,

) : ApplicationListener<ApplicationReadyEvent> {

@PostConstruct
fun saveAuditUser() {
Expand All @@ -85,7 +88,7 @@ class DataLoader(
registerTypeRepository.saveAll(ReferenceDataGenerator.REGISTER_TYPES.values)

addressRepository.saveAll(listOf(AddressGenerator.Q001, AddressGenerator.Q002, AddressGenerator.Q710))

boroughRepository.save(ProbationCaseGenerator.BOROUGH)
probationAreaRepository.save(ProbationAreaGenerator.DEFAULT)
approvedPremisesRepository.save(ApprovedPremisesGenerator.DEFAULT)
// add a duplicate AP for testing selectable query
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.integrations.approvedpremises.AssessedBy
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.StaffMember
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea

object AssessedByGenerator {
fun generate(
staffMember: StaffMember = StaffMemberGenerator.DEFAULT,
probationArea: ProbationArea = ProbationAreaGenerator.DEFAULT
probationArea: ProbationArea = ProbationArea(
ProbationAreaGenerator.DEFAULT.code,
ProbationAreaGenerator.DEFAULT.description
)
) = AssessedBy(
staffMember = staffMember,
probationArea = probationArea
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@ package uk.gov.justice.digital.hmpps.data.generator
import uk.gov.justice.digital.hmpps.data.generator.ProbationCaseGenerator.COM_PROVIDER
import uk.gov.justice.digital.hmpps.data.generator.ProbationCaseGenerator.COM_TEAM
import uk.gov.justice.digital.hmpps.data.generator.ProbationCaseGenerator.COM_UNALLOCATED
import uk.gov.justice.digital.hmpps.integrations.delius.person.CommunityManager
import uk.gov.justice.digital.hmpps.integrations.delius.person.CommunityManagerTeam
import uk.gov.justice.digital.hmpps.integrations.delius.person.Ldu
import uk.gov.justice.digital.hmpps.integrations.delius.person.ProbationCase
import uk.gov.justice.digital.hmpps.integrations.delius.person.*
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.ReferenceData
import uk.gov.justice.digital.hmpps.integrations.delius.team.Team
import java.time.LocalDate

object ProbationCaseGenerator {
val COM_PROVIDER = ProbationAreaGenerator.generate("N01")
val COM_PROVIDER = ProbationAreaGenerator.generate(code = "N01", description = "N01 Description")
val BOROUGH = generateBorough("B1", "Borough 1")

val COM_LDU = generateLdu("N01LDU", "COM LDU")
val COM_TEAM = generateComTeam("N01COM", "Community Manager Team", COM_LDU)
val COM_UNALLOCATED = StaffGenerator.generate("Unallocated", "N01COMU")
Expand Down Expand Up @@ -100,11 +99,12 @@ object ProbationCaseGenerator {
id
)

fun generateBorough(code: String, description: String) = Borough(IdGenerator.getAndIncrement(), code, description)
fun generateLdu(code: String, description: String = "LDU of $code", id: Long = IdGenerator.getAndIncrement()) =
Ldu(code, description, id)
Ldu(code, description, BOROUGH, id)

fun generateComTeam(code: String, description: String, ldu: Ldu, id: Long = IdGenerator.getAndIncrement()) =
CommunityManagerTeam(code, description, ldu, id)
CommunityManagerTeam(code, description, ldu, LocalDate.now(), null, id)

fun generateManager(
pc: ProbationCase,
Expand All @@ -116,6 +116,6 @@ object ProbationCaseGenerator {
}

fun ProbationCase.asPerson() = PersonGenerator.generate(crn, id)
fun CommunityManagerTeam.asTeam() = Team(id, code, description, COM_PROVIDER, null, ldu.id)
fun CommunityManagerTeam.asTeam() = Team(id, code, description, COM_PROVIDER, null, ldu)
fun CommunityManager.asPersonManager() =
PersonManagerGenerator.generate(person.asPerson(), COM_TEAM.asTeam(), COM_UNALLOCATED, id)
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import java.util.concurrent.atomic.AtomicLong

object StaffGenerator {
private val staffCodeGenerator = AtomicLong(1)
val DEFAULT_STAFF = generate()
val DEFAULT_STAFF = generate(teams = listOf(TeamGenerator.NON_APPROVED_PREMISES_TEAM))
val JIM_SNOW = generate(
name = "Jim Snow"
)
Expand All @@ -19,7 +19,7 @@ object StaffGenerator {
val JIM_SNOW_USER = generateStaffUser("JIMSNOWLDAP", JIM_SNOW)

fun generate(
name: String = "TEST",
name: String = "Test",
code: String = "TEST${staffCodeGenerator.getAndIncrement().toString().padStart(3, '0')}",
teams: List<Team> = listOf(),
approvedPremises: List<ApprovedPremises> = listOf()
Expand All @@ -31,7 +31,8 @@ object StaffGenerator {
middleName = null,
surname = name,
teams = teams,
approvedPremises = approvedPremises
approvedPremises = approvedPremises,
probationArea = ProbationAreaGenerator.DEFAULT
)

fun generateStaffUser(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.integrations.approvedpremises.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.StaffMember
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.SubmittedBy
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea

object SubmittedByGenerator {
fun generate(
staffMember: StaffMember = StaffMemberGenerator.DEFAULT,
probationArea: ProbationArea = ProbationAreaGenerator.DEFAULT
probationArea: ProbationArea = ProbationArea(
ProbationAreaGenerator.DEFAULT.code,
ProbationAreaGenerator.DEFAULT.description
)
) = SubmittedBy(
staffMember = staffMember,
probationArea = probationArea
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.integrations.delius.approvedpremises.entity.ApprovedPremises
import uk.gov.justice.digital.hmpps.integrations.delius.person.Ldu
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.delius.team.Team
import java.util.concurrent.atomic.AtomicLong
Expand All @@ -19,20 +20,20 @@ object TeamGenerator {
approvedPremises: ApprovedPremises? = null,
code: String = "N54${teamCodeGenerator.getAndIncrement().toString().padStart(3, '0')}",
description: String = "Description of Team $code",
districtId: Long = AP_TEAM_LDU.id
district: Ldu = AP_TEAM_LDU
) = Team(
id = IdGenerator.getAndIncrement(),
code = code,
description = description,
probationArea = ProbationAreaGenerator.DEFAULT,
approvedPremises = approvedPremises,
districtId
district = district
)
}

object ProbationAreaGenerator {
val DEFAULT = generate("N54")
val DEFAULT = generate(code = "N54", description = "A description")

fun generate(code: String, id: Long = IdGenerator.getAndIncrement()) =
ProbationArea(id, code)
fun generate(code: String, id: Long = IdGenerator.getAndIncrement(), description: String) =
ProbationArea(id, code, description)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
dn: ou=Users,dc=moj,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Users

dn: cn=john-smith,ou=Users,dc=moj,dc=com
objectclass: top
objectclass: inetOrgPerson
cn: john-smith
sn: Smith
givenname: John
mail: john.smith@moj.gov.uk
telephoneNumber: 07321165373
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,13 @@ class ProbationCaseIntegrationTest {
assertTrue(detail.case.currentRestriction)
assertThat(
detail.case.manager.team,
equalTo(Team(COM_TEAM.code, COM_TEAM.description, Ldu(COM_TEAM.ldu.code, COM_TEAM.ldu.description)))
equalTo(
Team(
COM_TEAM.code, COM_TEAM.description, Ldu(COM_TEAM.ldu.code, COM_TEAM.ldu.description), Borough(
COM_TEAM.ldu.borough.code, COM_TEAM.ldu.borough.description
), COM_TEAM.startDate, COM_TEAM.endDate
)
)
)
assertThat(detail.mappaDetail?.category, equalTo(3))
assertThat(detail.mappaDetail?.level, equalTo(2))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package uk.gov.justice.digital.hmpps

import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
Expand All @@ -12,6 +13,8 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPat
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import uk.gov.justice.digital.hmpps.data.generator.ApprovedPremisesGenerator
import uk.gov.justice.digital.hmpps.data.generator.StaffGenerator
import uk.gov.justice.digital.hmpps.model.StaffDetail
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.contentAsJson
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.withToken

@AutoConfigureMockMvc
Expand Down Expand Up @@ -69,11 +72,24 @@ class StaffControllerIntegrationTest {
@Test
fun `Get staff by username`() {
val username = StaffGenerator.DEFAULT_STAFF.user!!.username
mockMvc.perform(get("/staff/$username").withToken())
.andExpect(status().isOk)
.andExpect(jsonPath("$.username", equalTo(username)))
.andExpect(jsonPath("$.name.surname", equalTo(StaffGenerator.DEFAULT_STAFF.surname)))
.andExpect(jsonPath("$.name.forename", equalTo(StaffGenerator.DEFAULT_STAFF.forename)))
.andExpect(jsonPath("$.code", equalTo(StaffGenerator.DEFAULT_STAFF.code)))
val res = mockMvc.perform(get("/staff/$username").withToken())
.andExpect(status().isOk).andReturn().response.contentAsJson<StaffDetail>()
assertThat(res.username, equalTo(username))
assertThat(res.name.surname, equalTo(StaffGenerator.DEFAULT_STAFF.surname))
assertThat(res.name.forename, equalTo(StaffGenerator.DEFAULT_STAFF.forename))
assertThat(res.code, equalTo(StaffGenerator.DEFAULT_STAFF.code))
assertThat(res.email, equalTo("john.smith@moj.gov.uk"))
assertThat(res.telephoneNumber, equalTo("07321165373"))
assertThat(res.staffIdentifier, equalTo(StaffGenerator.DEFAULT_STAFF.id))
assertThat(res.teams[0].borough?.code, equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].district.borough.code))
assertThat(
res.teams[0].borough?.description,
equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].district.borough.description)
)
assertThat(res.teams[0].startDate, equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].startDate))
assertThat(res.teams[0].endDate, equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].endDate))
assertThat(res.probationArea.code, equalTo(StaffGenerator.DEFAULT_STAFF.probationArea.code))
assertThat(res.probationArea.description, equalTo(StaffGenerator.DEFAULT_STAFF.probationArea.description))
assertThat(res.active, equalTo(true))
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package uk.gov.justice.digital.hmpps.integrations.approvedpremises

import com.fasterxml.jackson.annotation.JsonAlias
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.ReleaseType
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.SentenceType
import java.time.LocalDate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package uk.gov.justice.digital.hmpps.integrations.approvedpremises

data class ProbationArea(
val code: String,
val name: String
val name: String,
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
package uk.gov.justice.digital.hmpps.integrations.delius.person

import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne
import jakarta.persistence.OneToMany
import jakarta.persistence.Table
import jakarta.persistence.*
import org.hibernate.annotations.Immutable
import org.hibernate.annotations.SQLRestriction
import org.springframework.data.jpa.repository.EntityGraph
Expand Down Expand Up @@ -124,6 +118,12 @@ class CommunityManagerTeam(
@JoinColumn(name = "district_id")
val ldu: Ldu,

@Column(name = "start_date")
val startDate: LocalDate = LocalDate.now(),

@Column(name = "end_date")
val endDate: LocalDate? = null,

@Id
@Column(name = "team_id")
val id: Long
Expand All @@ -139,11 +139,33 @@ class Ldu(

val description: String,

@ManyToOne
@JoinColumn(name = "borough_id")
val borough: Borough,

@Id
@Column(name = "district_id")
val id: Long
)

@Immutable
@Entity
@Table(name = "borough")
class Borough(

@Id
@Column(name = "borough_id")
val id: Long,

@Column(name = "code")
val code: String,

@Column(name = "description")
val description: String
)

interface BoroughRepository : JpaRepository<Borough, Long>

interface ProbationCaseRepository : JpaRepository<ProbationCase, Long> {
@EntityGraph(attributePaths = ["gender", "ethnicity", "nationality", "religion", "genderIdentity", "communityManagers.team.ldu"])
fun findByCrnIn(crns: List<String>): List<ProbationCase>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@ class ProbationArea(
val id: Long,

@Column(columnDefinition = "char(3)")
val code: String
val code: String,

val description: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package uk.gov.justice.digital.hmpps.integrations.delius.staff

import org.springframework.ldap.odm.annotations.Attribute
import org.springframework.ldap.odm.annotations.DnAttribute
import org.springframework.ldap.odm.annotations.Entry
import org.springframework.ldap.odm.annotations.Id
import javax.naming.Name

@Entry(objectClasses = ["inetOrgPerson", "top"])
class LdapUser(

@Id
val dn: Name,

@Attribute(name = "sn")
val surname: String,

@Attribute(name = "givenName")
val forename: String,

@Attribute(name = "cn")
@DnAttribute(value = "cn", index = 0)
val username: String,

@Attribute(name = "telephoneNumber")
val telephoneNumber: String?,

@Attribute(name = "mail")
val email: String?,
)
Loading

0 comments on commit df74fb0

Please sign in to comment.