From efa5e56fe699240ac900e8e87c599b36ca63be03 Mon Sep 17 00:00:00 2001 From: Marcus Aspin Date: Tue, 27 Aug 2024 12:45:31 +0000 Subject: [PATCH] DST-15503 Fixes for user export changes --- .../bconline/ndelius/model/ExportResult.java | 6 +- .../ndelius/model/entity/BoroughEntity.java | 40 ----------- .../entity/export/BoroughExportEntity.java | 27 +++----- .../entity/export/DistrictExportEntity.java | 41 +++++++++++ .../model/entity/export/LDUExportEntity.java | 39 ----------- .../model/entity/export/TeamExportEntity.java | 26 +------ .../ndelius/service/UserRoleService.java | 3 +- .../service/impl/UserRoleServiceImpl.java | 7 ++ .../ndelius/transformer/UserTransformer.java | 68 +++++++------------ 9 files changed, 88 insertions(+), 169 deletions(-) delete mode 100644 src/main/java/uk/co/bconline/ndelius/model/entity/BoroughEntity.java create mode 100644 src/main/java/uk/co/bconline/ndelius/model/entity/export/DistrictExportEntity.java delete mode 100644 src/main/java/uk/co/bconline/ndelius/model/entity/export/LDUExportEntity.java diff --git a/src/main/java/uk/co/bconline/ndelius/model/ExportResult.java b/src/main/java/uk/co/bconline/ndelius/model/ExportResult.java index 4d29d6a6..f8bdecc3 100644 --- a/src/main/java/uk/co/bconline/ndelius/model/ExportResult.java +++ b/src/main/java/uk/co/bconline/ndelius/model/ExportResult.java @@ -45,12 +45,12 @@ public final class ExportResult { private String teams; @CsvBindByName(column = "LAU") @CsvBindByPosition(position = 14) - private String lau; + private String localAdminUnit; @CsvBindByName(column = "PDU") @CsvBindByPosition(position = 15) - private String pdu; + private String probationDeliveryUnit; @CsvBindByPosition(position = 16) private String provider; @CsvBindByPosition(position = 17) - private String roleDescriptions; + private String roleNames; } diff --git a/src/main/java/uk/co/bconline/ndelius/model/entity/BoroughEntity.java b/src/main/java/uk/co/bconline/ndelius/model/entity/BoroughEntity.java deleted file mode 100644 index c9e43f3c..00000000 --- a/src/main/java/uk/co/bconline/ndelius/model/entity/BoroughEntity.java +++ /dev/null @@ -1,40 +0,0 @@ -package uk.co.bconline.ndelius.model.entity; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import uk.co.bconline.ndelius.model.entity.export.ProbationAreaExportEntity; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import java.io.Serializable; - -@Getter -@Entity -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "BOROUGH") -public class BoroughEntity implements Serializable -{ - @Id - @Column(name = "BOROUGH_ID") - @GeneratedValue(generator = "BOROUGH_ID_SEQ") - @SequenceGenerator(name = "BOROUGH_ID_SEQ", sequenceName = "BOROUGH_ID_SEQ", allocationSize = 1) - private Long id; - - @Column(name = "CODE") - private String code; - - @Column(name = "DESCRIPTION") - private String description; - - @ManyToOne - @JoinColumn(name = "PROBATION_AREA_ID") - private ProbationAreaExportEntity probationArea; -} diff --git a/src/main/java/uk/co/bconline/ndelius/model/entity/export/BoroughExportEntity.java b/src/main/java/uk/co/bconline/ndelius/model/entity/export/BoroughExportEntity.java index bcb40777..41589cee 100644 --- a/src/main/java/uk/co/bconline/ndelius/model/entity/export/BoroughExportEntity.java +++ b/src/main/java/uk/co/bconline/ndelius/model/entity/export/BoroughExportEntity.java @@ -3,26 +3,17 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.Type; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import uk.co.bconline.ndelius.model.entity.converter.YNConverter; + +import javax.persistence.*; import java.io.Serializable; -import java.time.LocalDate; @Getter @Entity @NoArgsConstructor @AllArgsConstructor @Table(name = "BOROUGH") -public class BoroughExportEntity implements Serializable -{ +public class BoroughExportEntity implements Serializable { @Id @Column(name = "BOROUGH_ID") @GeneratedValue(generator = "BOROUGH_ID_SEQ") @@ -35,11 +26,15 @@ public class BoroughExportEntity implements Serializable @Column(name = "DESCRIPTION") private String description; + @Column(name = "SELECTABLE") + @Convert(converter = YNConverter.class) + private boolean selectable; + @ManyToOne @JoinColumn(name = "PROBATION_AREA_ID") private ProbationAreaExportEntity probationArea; - @Column(name = "END_DATE") - @Type(type = "java.time.LocalDate") - private LocalDate endDate; + public String getExportDescription() { + return description + " (" + code + ") " + (isSelectable() ? " [Active]" : " [Inactive]"); + } } diff --git a/src/main/java/uk/co/bconline/ndelius/model/entity/export/DistrictExportEntity.java b/src/main/java/uk/co/bconline/ndelius/model/entity/export/DistrictExportEntity.java new file mode 100644 index 00000000..d72f15d3 --- /dev/null +++ b/src/main/java/uk/co/bconline/ndelius/model/entity/export/DistrictExportEntity.java @@ -0,0 +1,41 @@ +package uk.co.bconline.ndelius.model.entity.export; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import uk.co.bconline.ndelius.model.entity.converter.YNConverter; + +import javax.persistence.*; +import java.io.Serializable; + +@Getter +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "DISTRICT") +public class DistrictExportEntity implements Serializable +{ + @Id + @Column(name = "DISTRICT_ID") + @GeneratedValue(generator = "DISTRICT_ID_SEQ") + @SequenceGenerator(name = "DISTRICT_ID_SEQ", sequenceName = "DISTRICT_ID_SEQ", allocationSize = 1) + private Long id; + + @Column(name = "CODE") + private String code; + + @Column(name = "DESCRIPTION") + private String description; + + @Column(name = "SELECTABLE") + @Convert(converter = YNConverter.class) + private boolean selectable; + + @ManyToOne + @JoinColumn(name = "BOROUGH_ID") + private BoroughExportEntity borough; + + public String getExportDescription() { + return description + " (" + code + ") " + (isSelectable() ? " [Active]" : " [Inactive]"); + } +} diff --git a/src/main/java/uk/co/bconline/ndelius/model/entity/export/LDUExportEntity.java b/src/main/java/uk/co/bconline/ndelius/model/entity/export/LDUExportEntity.java deleted file mode 100644 index b38e8dcc..00000000 --- a/src/main/java/uk/co/bconline/ndelius/model/entity/export/LDUExportEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package uk.co.bconline.ndelius.model.entity.export; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.Type; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import java.io.Serializable; -import java.time.LocalDate; - -@Getter -@Entity -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "LOCAL_DELIVERY_UNIT") -public class LDUExportEntity implements Serializable -{ - @Id - @Column(name = "LOCAL_DELIVERY_UNIT_ID") - @GeneratedValue(generator = "LOCAL_DELIVERY_UNIT_ID_SEQ") - @SequenceGenerator(name = "LOCAL_DELIVERY_UNIT_ID_SEQ", sequenceName = "LOCAL_DELIVERY_UNIT_ID_SEQ", allocationSize = 1) - private Long id; - - @Column(name = "CODE") - private String code; - - @Column(name = "DESCRIPTION") - private String description; - - @Column(name = "END_DATE") - @Type(type = "java.time.LocalDate") - private LocalDate endDate; -} diff --git a/src/main/java/uk/co/bconline/ndelius/model/entity/export/TeamExportEntity.java b/src/main/java/uk/co/bconline/ndelius/model/entity/export/TeamExportEntity.java index 7ed76b9a..759b7170 100644 --- a/src/main/java/uk/co/bconline/ndelius/model/entity/export/TeamExportEntity.java +++ b/src/main/java/uk/co/bconline/ndelius/model/entity/export/TeamExportEntity.java @@ -29,13 +29,9 @@ public class TeamExportEntity implements Serializable { @Column(name = "DESCRIPTION") private String description; - @ManyToOne - @JoinColumn(name = "LOCAL_DELIVERY_UNIT_ID") - private LDUExportEntity localDeliveryUnit; - @ManyToOne @JoinColumn(name = "DISTRICT_ID") - private BoroughExportEntity borough; + private DistrictExportEntity district; @Column(name = "END_DATE") @Type(type = "java.time.LocalDate") @@ -45,24 +41,4 @@ public String getExportDescription() { return description + " (" + code + ") " + ((getEndDate() != null && getEndDate().isBefore(now())) ? " [Inactive]" : " [Active]"); } - - public String getLDUDescription() - { - if (localDeliveryUnit != null) - { - return localDeliveryUnit.getDescription() + " (" + localDeliveryUnit.getCode() + ") " + ((localDeliveryUnit.getEndDate() != null && localDeliveryUnit.getEndDate().isBefore(now())) ? " [Inactive]" : " [Active]"); - } else { - return null; - } - } - - public String getBoroughDescription() - { - if (borough != null) - { - return borough.getDescription() + " (" + borough.getCode() + ") " + ((borough.getEndDate() != null && borough.getEndDate().isBefore(now())) ? " [Inactive]" : " [Active]"); - } else { - return null; - } - } } diff --git a/src/main/java/uk/co/bconline/ndelius/service/UserRoleService.java b/src/main/java/uk/co/bconline/ndelius/service/UserRoleService.java index 99a3d0cf..683f7d79 100644 --- a/src/main/java/uk/co/bconline/ndelius/service/UserRoleService.java +++ b/src/main/java/uk/co/bconline/ndelius/service/UserRoleService.java @@ -1,6 +1,5 @@ package uk.co.bconline.ndelius.service; -import uk.co.bconline.ndelius.model.entry.RoleAssociationEntry; import uk.co.bconline.ndelius.model.entry.RoleEntry; import java.util.List; @@ -10,6 +9,8 @@ public interface UserRoleService { Set getRolesICanAssign(); Set getUserRoles(String username); + + Set getUserRoleNames(String username); List getAllUsersWithRole(String role); Set getClientRoles(String clientId); Set getUserInteractions(String username); diff --git a/src/main/java/uk/co/bconline/ndelius/service/impl/UserRoleServiceImpl.java b/src/main/java/uk/co/bconline/ndelius/service/impl/UserRoleServiceImpl.java index 88799176..f3d3ce58 100644 --- a/src/main/java/uk/co/bconline/ndelius/service/impl/UserRoleServiceImpl.java +++ b/src/main/java/uk/co/bconline/ndelius/service/impl/UserRoleServiceImpl.java @@ -90,6 +90,13 @@ public Set getUserRoles(String username) { return getAssignedRoles(username, usersBase); } + @Override + public Set getUserRoleNames(String username) { + return stream(getAssignedRoleAssociations(username, usersBase).spliterator(), false) + .map(RoleAssociationEntry::getName) + .collect(toSet()); + } + @Override public Set getClientRoles(String clientId) { return getAssignedRoles(clientId, clientsBase); diff --git a/src/main/java/uk/co/bconline/ndelius/transformer/UserTransformer.java b/src/main/java/uk/co/bconline/ndelius/transformer/UserTransformer.java index 804e61cd..0e23e3e7 100644 --- a/src/main/java/uk/co/bconline/ndelius/transformer/UserTransformer.java +++ b/src/main/java/uk/co/bconline/ndelius/transformer/UserTransformer.java @@ -11,62 +11,31 @@ import uk.co.bconline.ndelius.model.ExportResult; import uk.co.bconline.ndelius.model.ReferenceData; import uk.co.bconline.ndelius.model.User; -import uk.co.bconline.ndelius.model.entity.ChangeNoteEntity; -import uk.co.bconline.ndelius.model.entity.OrganisationEntity; -import uk.co.bconline.ndelius.model.entity.ProbationAreaEntity; -import uk.co.bconline.ndelius.model.entity.ProbationAreaUserEntity; -import uk.co.bconline.ndelius.model.entity.ProbationAreaUserId; -import uk.co.bconline.ndelius.model.entity.ReferenceDataEntity; -import uk.co.bconline.ndelius.model.entity.StaffEntity; -import uk.co.bconline.ndelius.model.entity.StaffTeamEntity; -import uk.co.bconline.ndelius.model.entity.StaffTeamId; -import uk.co.bconline.ndelius.model.entity.SubContractedProviderEntity; -import uk.co.bconline.ndelius.model.entity.TeamEntity; -import uk.co.bconline.ndelius.model.entity.UserEntity; -import uk.co.bconline.ndelius.model.entity.export.BoroughExportEntity; -import uk.co.bconline.ndelius.model.entity.export.ProbationAreaExportEntity; -import uk.co.bconline.ndelius.model.entity.export.ReferenceDataExportEntity; -import uk.co.bconline.ndelius.model.entity.export.StaffExportEntity; -import uk.co.bconline.ndelius.model.entity.export.TeamExportEntity; -import uk.co.bconline.ndelius.model.entity.export.UserExportEntity; +import uk.co.bconline.ndelius.model.entity.*; +import uk.co.bconline.ndelius.model.entity.export.*; import uk.co.bconline.ndelius.model.entry.ClientEntry; -import uk.co.bconline.ndelius.model.entry.RoleEntry; import uk.co.bconline.ndelius.model.entry.UserEntry; -import uk.co.bconline.ndelius.service.DatasetService; -import uk.co.bconline.ndelius.service.ReferenceDataService; -import uk.co.bconline.ndelius.service.RoleService; -import uk.co.bconline.ndelius.service.TeamService; -import uk.co.bconline.ndelius.service.UserEntityService; -import uk.co.bconline.ndelius.service.UserHistoryService; -import uk.co.bconline.ndelius.service.UserRoleService; +import uk.co.bconline.ndelius.service.*; import uk.co.bconline.ndelius.util.LdapUtils; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.time.LocalDateTime.now; import static java.time.temporal.ChronoUnit.MILLIS; -import static java.util.Collections.emptySet; -import static java.util.Collections.singleton; -import static java.util.Collections.singletonList; +import static java.util.Collections.*; import static java.util.Optional.ofNullable; -import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toSet; +import static java.util.stream.Collectors.*; import static org.springframework.util.StringUtils.isEmpty; import static uk.co.bconline.ndelius.util.LdapUtils.mapLdapStringToDate; import static uk.co.bconline.ndelius.util.LdapUtils.mapToLdapString; -import static uk.co.bconline.ndelius.util.NameUtils.combineNames; -import static uk.co.bconline.ndelius.util.NameUtils.firstForename; -import static uk.co.bconline.ndelius.util.NameUtils.subsequentForenames; +import static uk.co.bconline.ndelius.util.NameUtils.*; @Slf4j @Component @@ -182,7 +151,7 @@ public Optional map(UserEntry user) public ExportResult combine(UserExportEntity db, UserEntry ldap) { if (ldap == null) return null; DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - val userRoles = ofNullable(ldap.getUsername()).map(userRoleService::getUserRoles).orElse(emptySet()); + val userRoles = ofNullable(ldap.getUsername()).map(userRoleService::getUserRoleNames).orElse(emptySet()); return ExportResult.builder() .username(ofNullable(ldap.getUsername()).orElseGet(db::getUsername)) .forenames(ofNullable(ldap.getForenames()).orElseGet(() -> combineNames(db.getForename(), db.getForename2()))) @@ -200,14 +169,23 @@ public ExportResult combine(UserExportEntity db, UserEntry ldap) { .datasets(ofNullable(db.getDatasets()).map(l -> l.stream() .map(ProbationAreaExportEntity::getCode).distinct().sorted().collect(joining(","))).orElse(null)) .lastAccessedDate(db.getLastAccessedDate() != null ? db.getLastAccessedDate().format(format) : null) - .lau(ofNullable(db.getStaff()).map(StaffExportEntity::getTeams).map(l -> l.stream() - .map(TeamExportEntity::getLDUDescription).filter(Objects::nonNull).distinct().sorted().collect(joining(","))).orElse(null)) - .pdu(ofNullable(db.getStaff()).map(StaffExportEntity::getTeams).map(l -> l.stream() - .map(TeamExportEntity::getBoroughDescription).filter(Objects::nonNull).distinct().sorted().collect(joining(","))).orElse(null)) + .localAdminUnit(ofNullable(db.getStaff()).map(StaffExportEntity::getTeams).map(l -> l.stream() + .map(TeamExportEntity::getDistrict) + .map(DistrictExportEntity::getExportDescription) + .filter(Objects::nonNull) + .distinct().sorted().collect(joining(","))).orElse(null)) + .probationDeliveryUnit(ofNullable(db.getStaff()).map(StaffExportEntity::getTeams).map(l -> l.stream() + .map(TeamExportEntity::getDistrict) + .map(DistrictExportEntity::getBorough) + .map(BoroughExportEntity::getExportDescription) + .filter(Objects::nonNull).distinct().sorted().collect(joining(","))).orElse(null)) .provider(ofNullable(db.getStaff()).map(StaffExportEntity::getTeams).map(l -> l.stream() - .map(TeamExportEntity::getBorough).filter(Objects::nonNull).map(BoroughExportEntity::getProbationArea).map(ProbationAreaExportEntity::getExportDescription).distinct().sorted().collect(joining(","))).orElse(null)) - .roleDescriptions(ofNullable(userRoles).map(l -> l.stream() - .map(RoleEntry::getName).distinct().sorted().collect(joining(","))).orElse(null)) + .map(TeamExportEntity::getDistrict) + .map(DistrictExportEntity::getBorough) + .map(BoroughExportEntity::getProbationArea) + .map(ProbationAreaExportEntity::getExportDescription) + .filter(Objects::nonNull).distinct().sorted().collect(joining(","))).orElse(null)) + .roleNames(userRoles.stream().sorted().collect(joining(","))) .build(); }