From 81b52194c18f1d543d3bb932c7955198463164c5 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Tue, 11 Feb 2025 12:04:43 +0100 Subject: [PATCH 01/12] create generic structure for new delete strategie and implement it into objective --- .../java/ch/puzzle/okr/models/Deletable.java | 20 +++++++++++++++++++ .../java/ch/puzzle/okr/models/Objective.java | 3 ++- .../okr/repository/DeleteRepository.java | 16 +++++++++++++++ .../okr/repository/ObjectiveRepository.java | 2 +- .../ObjectivePersistenceService.java | 5 +++++ .../migration/V3_5_2__add_is_deleted_flag.sql | 2 ++ 6 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/ch/puzzle/okr/models/Deletable.java create mode 100644 backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java create mode 100644 backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql diff --git a/backend/src/main/java/ch/puzzle/okr/models/Deletable.java b/backend/src/main/java/ch/puzzle/okr/models/Deletable.java new file mode 100644 index 0000000000..5216f8447d --- /dev/null +++ b/backend/src/main/java/ch/puzzle/okr/models/Deletable.java @@ -0,0 +1,20 @@ +package ch.puzzle.okr.models; + +import jakarta.persistence.*; +import org.hibernate.annotations.ColumnDefault; + + +@MappedSuperclass +public abstract class Deletable { + @Column(name = "is_deleted", nullable = false) + @ColumnDefault("false") + private boolean isDeleted = false; + + public boolean isDeleted() { + return isDeleted; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } +} diff --git a/backend/src/main/java/ch/puzzle/okr/models/Objective.java b/backend/src/main/java/ch/puzzle/okr/models/Objective.java index fadfac125a..3dbb6ac09d 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/Objective.java +++ b/backend/src/main/java/ch/puzzle/okr/models/Objective.java @@ -9,7 +9,7 @@ @Entity @Table(indexes = { @Index(name = "idx_objective_title", columnList = "title") }) -public class Objective implements WriteableInterface { +public class Objective extends Deletable implements WriteableInterface { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_objective") @SequenceGenerator(name = "sequence_objective", allocationSize = 1) @@ -70,6 +70,7 @@ private Objective(Builder builder) { setModifiedBy(builder.modifiedBy); } + public Long getId() { return id; } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java new file mode 100644 index 0000000000..ab98a2ddc0 --- /dev/null +++ b/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java @@ -0,0 +1,16 @@ +package ch.puzzle.okr.repository; + +import ch.puzzle.okr.models.Deletable; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.query.Param; + +@NoRepositoryBean +public interface DeleteRepository extends CrudRepository { + + @Modifying + @Query("update #{#entityName} e set e.isDeleted = true where e.id = :id") + void markAsDeleted(@Param("id") T id); +} diff --git a/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java index 95f2fe0dbf..c8a44bb5b7 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; @Repository -public interface ObjectiveRepository extends CrudRepository { +public interface ObjectiveRepository extends DeleteRepository { Integer countByTeamAndQuarter(Team team, Quarter quarter); diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java index aac01d8da1..36f74e878f 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java @@ -89,4 +89,9 @@ private Objective findByAnyId(Long id, AuthorizationUser authorizationUser, Stri throw noResultException; } } + + @Override + public void deleteById(Long id) { + this.getRepository().markAsDeleted(id); + } } diff --git a/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql b/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql new file mode 100644 index 0000000000..43e5e63d4e --- /dev/null +++ b/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql @@ -0,0 +1,2 @@ +ALTER TABLE objective + add COLUMN is_deleted boolean not null default false; From bcd676f0f498eb5f604914a498582d99c41c3a97 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Tue, 11 Feb 2025 13:29:18 +0100 Subject: [PATCH 02/12] create abstract delete method classes --- .../okr/repository/DeleteRepository.java | 7 +++++ .../ObjectivePersistenceService.java | 3 ++- .../service/persistence/PersistenceBase.java | 22 +++++++++++----- .../persistence/customCrud/DeleteMethod.java | 10 +++++++ .../persistence/customCrud/HardDelete.java | 18 +++++++++++++ .../persistence/customCrud/SoftDelete.java | 26 +++++++++++++++++++ .../service/validation/ValidationBase.java | 4 ++- 7 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java create mode 100644 backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java create mode 100644 backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java diff --git a/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java index ab98a2ddc0..787ed23906 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java @@ -7,8 +7,15 @@ import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.query.Param; +import java.util.List; + @NoRepositoryBean public interface DeleteRepository extends CrudRepository { +// @Query("select #{#entityName} e set e.isDeleted = true where e.id = :id") +// List isDeleted(boolean isDeleted); + + @Query("select e from #{#entityName} e where e.isDeleted = false ") + List findAllVisible(); @Modifying @Query("update #{#entityName} e set e.isDeleted = true where e.id = :id") diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java index 36f74e878f..617ec51cc1 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java @@ -8,6 +8,7 @@ import ch.puzzle.okr.models.Team; import ch.puzzle.okr.models.authorization.AuthorizationUser; import ch.puzzle.okr.repository.ObjectiveRepository; +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; import jakarta.persistence.TypedQuery; @@ -29,7 +30,7 @@ public class ObjectivePersistenceService extends PersistenceBase authorizationCriteria) { - super(repository); + super(repository, new SoftDelete(repository)); this.entityManager = entityManager; this.authorizationCriteria = authorizationCriteria; } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java index c1b66bf96d..508be49515 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java @@ -9,6 +9,10 @@ import java.util.Spliterator; import java.util.Spliterators; import java.util.stream.StreamSupport; + +import ch.puzzle.okr.models.Deletable; +import ch.puzzle.okr.service.persistence.customCrud.DeleteMethod; +import ch.puzzle.okr.service.persistence.customCrud.HardDelete; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.OptimisticLockingFailureException; @@ -23,19 +27,25 @@ * @param * the Repository of the entity */ -public abstract class PersistenceBase { +public abstract class PersistenceBase> { private static final Logger logger = LoggerFactory.getLogger(PersistenceBase.class); - private final CrudRepository repository; + private final R repository; + private final DeleteMethod deleteMethod; + + protected PersistenceBase(R repository, DeleteMethod deleteMethod) { + this.repository = repository; + this.deleteMethod = deleteMethod; + } - protected PersistenceBase(CrudRepository repository) { + protected PersistenceBase(R repository) { this.repository = repository; + this.deleteMethod = new HardDelete(); } - @SuppressWarnings(value = "unchecked casts") public R getRepository() { - return (R) repository; + return repository; } public T findById(I id) throws OkrResponseStatusException { @@ -69,7 +79,7 @@ public List findAll() { } public void deleteById(I id) { - repository.deleteById(id); + deleteMethod.deleteById(id, getRepository()); } public abstract String getModelName(); diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java new file mode 100644 index 0000000000..5bd10b36e1 --- /dev/null +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java @@ -0,0 +1,10 @@ +package ch.puzzle.okr.service.persistence.customCrud; + +import ch.puzzle.okr.models.Deletable; +import ch.puzzle.okr.repository.DeleteRepository; +import org.springframework.data.repository.CrudRepository; + +public interface DeleteMethod { + > void deleteById(I id, R repo); + DeleteMethod build(); +} diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java new file mode 100644 index 0000000000..cf21d9b125 --- /dev/null +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java @@ -0,0 +1,18 @@ +package ch.puzzle.okr.service.persistence.customCrud; + +import org.springframework.data.repository.CrudRepository; + + +public class HardDelete implements DeleteMethod{ + + @Override + public > void deleteById(I id, R repo) { + repo.deleteById(id); + + } + + @Override + public DeleteMethod build() { + return new HardDelete(); + } +} diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java new file mode 100644 index 0000000000..cf9bfb2c76 --- /dev/null +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java @@ -0,0 +1,26 @@ +package ch.puzzle.okr.service.persistence.customCrud; + +import ch.puzzle.okr.models.Deletable; +import ch.puzzle.okr.repository.DeleteRepository; +import org.springframework.data.repository.CrudRepository; + + +public class SoftDelete implements DeleteMethod { + + private > void deleteSoftById(I id, R repo) { + repo.markAsDeleted(id); + + } + + @Override + public > void deleteById(I id, R repo) { + @SuppressWarnings(value = "unchecked casts") + DeleteRepository deleteRepo = (DeleteRepository) repo; + deleteSoftById(id, deleteRepo); + } + + @Override + public DeleteMethod build() { + return new SoftDelete(); + } +} diff --git a/backend/src/main/java/ch/puzzle/okr/service/validation/ValidationBase.java b/backend/src/main/java/ch/puzzle/okr/service/validation/ValidationBase.java index f58f136e6f..f886adc747 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/validation/ValidationBase.java +++ b/backend/src/main/java/ch/puzzle/okr/service/validation/ValidationBase.java @@ -15,6 +15,8 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; + +import org.springframework.data.repository.CrudRepository; import org.springframework.http.HttpStatus; /** @@ -27,7 +29,7 @@ * @param

* the Persistence Service of this repository and entity */ -public abstract class ValidationBase> { +public abstract class ValidationBase, P extends PersistenceBase> { private final Validator validator; private final P persistenceService; From d930deac92d827d58300a38cc1fc8b5584d21995 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Tue, 11 Feb 2025 13:51:59 +0100 Subject: [PATCH 03/12] abstraction now supports default delete strategie and override --- .../service/persistence/PersistenceBase.java | 32 +++++++++++-------- .../persistence/customCrud/DeleteMethod.java | 12 ++++--- .../persistence/customCrud/HardDelete.java | 13 +++----- .../persistence/customCrud/SoftDelete.java | 20 ++---------- 4 files changed, 33 insertions(+), 44 deletions(-) diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java index 508be49515..db4544e2a7 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java @@ -1,16 +1,7 @@ package ch.puzzle.okr.service.persistence; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.NOT_FOUND; - import ch.puzzle.okr.ErrorKey; import ch.puzzle.okr.exception.OkrResponseStatusException; -import java.util.List; -import java.util.Spliterator; -import java.util.Spliterators; -import java.util.stream.StreamSupport; - -import ch.puzzle.okr.models.Deletable; import ch.puzzle.okr.service.persistence.customCrud.DeleteMethod; import ch.puzzle.okr.service.persistence.customCrud.HardDelete; import org.slf4j.Logger; @@ -19,6 +10,14 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.http.HttpStatus; +import java.util.List; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.stream.StreamSupport; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.NOT_FOUND; + /** * @param * the Type or entity of the repository @@ -32,16 +31,17 @@ public abstract class PersistenceBase> { private static final Logger logger = LoggerFactory.getLogger(PersistenceBase.class); private final R repository; - private final DeleteMethod deleteMethod; + private final DeleteMethod deleteMethod; - protected PersistenceBase(R repository, DeleteMethod deleteMethod) { + protected PersistenceBase(R repository, DeleteMethod deleteMethod) { this.repository = repository; this.deleteMethod = deleteMethod; + deleteMethod.setRepo(repository); } protected PersistenceBase(R repository) { this.repository = repository; - this.deleteMethod = new HardDelete(); + this.deleteMethod = new HardDelete<>(); } public R getRepository() { @@ -79,7 +79,13 @@ public List findAll() { } public void deleteById(I id) { - deleteMethod.deleteById(id, getRepository()); + deleteMethod.setRepo(repository); + deleteMethod.deleteById(id); + } + + public void deleteById(I id, DeleteMethod localDeleteMethod) { + localDeleteMethod.setRepo(repository); + localDeleteMethod.deleteById(id); } public abstract String getModelName(); diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java index 5bd10b36e1..2faacd7cf6 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java @@ -1,10 +1,12 @@ package ch.puzzle.okr.service.persistence.customCrud; -import ch.puzzle.okr.models.Deletable; -import ch.puzzle.okr.repository.DeleteRepository; import org.springframework.data.repository.CrudRepository; -public interface DeleteMethod { - > void deleteById(I id, R repo); - DeleteMethod build(); +public abstract class DeleteMethod> { + protected R repo; + public abstract void deleteById(I id); + + public void setRepo(R repo){ + this.repo = repo; + } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java index cf21d9b125..efd90bd800 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java @@ -1,18 +1,13 @@ package ch.puzzle.okr.service.persistence.customCrud; +import ch.puzzle.okr.models.Deletable; import org.springframework.data.repository.CrudRepository; -public class HardDelete implements DeleteMethod{ +public class HardDelete> extends DeleteMethod{ @Override - public > void deleteById(I id, R repo) { - repo.deleteById(id); - - } - - @Override - public DeleteMethod build() { - return new HardDelete(); + public void deleteById(I id) { + this.repo.deleteById(id); } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java index cf9bfb2c76..62e72d72d9 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java @@ -2,25 +2,11 @@ import ch.puzzle.okr.models.Deletable; import ch.puzzle.okr.repository.DeleteRepository; -import org.springframework.data.repository.CrudRepository; -public class SoftDelete implements DeleteMethod { - - private > void deleteSoftById(I id, R repo) { - repo.markAsDeleted(id); - - } - +public class SoftDelete > extends DeleteMethod { @Override - public > void deleteById(I id, R repo) { - @SuppressWarnings(value = "unchecked casts") - DeleteRepository deleteRepo = (DeleteRepository) repo; - deleteSoftById(id, deleteRepo); - } - - @Override - public DeleteMethod build() { - return new SoftDelete(); + public void deleteById(I id) { + repo.markAsDeleted(id); } } From e442d4a4756f43dd5ff89ad0f282dc4a320c6252 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Tue, 11 Feb 2025 14:00:54 +0100 Subject: [PATCH 04/12] implement delete abstraction for all required entities --- backend/src/main/java/ch/puzzle/okr/models/Action.java | 2 +- backend/src/main/java/ch/puzzle/okr/models/Team.java | 2 +- backend/src/main/java/ch/puzzle/okr/models/Unit.java | 2 +- backend/src/main/java/ch/puzzle/okr/models/User.java | 2 +- .../src/main/java/ch/puzzle/okr/models/checkin/CheckIn.java | 3 ++- .../main/java/ch/puzzle/okr/models/keyresult/KeyResult.java | 2 +- .../main/java/ch/puzzle/okr/repository/ActionRepository.java | 4 +++- .../main/java/ch/puzzle/okr/repository/CheckInRepository.java | 2 +- .../java/ch/puzzle/okr/repository/KeyResultRepository.java | 3 ++- .../main/java/ch/puzzle/okr/repository/TeamRepository.java | 2 +- .../main/java/ch/puzzle/okr/repository/UnitRepository.java | 2 +- .../main/java/ch/puzzle/okr/repository/UserRepository.java | 2 +- .../okr/service/persistence/ActionPersistenceService.java | 4 +++- .../okr/service/persistence/CheckInPersistenceService.java | 4 +++- .../okr/service/persistence/KeyResultPersistenceService.java | 3 ++- .../okr/service/persistence/ObjectivePersistenceService.java | 2 +- .../okr/service/persistence/TeamPersistenceService.java | 4 +++- .../okr/service/persistence/UnitPersistenceService.java | 4 +++- .../okr/service/persistence/UserPersistenceService.java | 4 +++- 19 files changed, 34 insertions(+), 19 deletions(-) diff --git a/backend/src/main/java/ch/puzzle/okr/models/Action.java b/backend/src/main/java/ch/puzzle/okr/models/Action.java index b251833788..9e7b2cab7f 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/Action.java +++ b/backend/src/main/java/ch/puzzle/okr/models/Action.java @@ -7,7 +7,7 @@ import java.util.Objects; @Entity -public class Action implements WriteableInterface { +public class Action extends Deletable implements WriteableInterface { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_action") @SequenceGenerator(name = "sequence_action", allocationSize = 1) diff --git a/backend/src/main/java/ch/puzzle/okr/models/Team.java b/backend/src/main/java/ch/puzzle/okr/models/Team.java index a7f9d91188..97c377dad4 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/Team.java +++ b/backend/src/main/java/ch/puzzle/okr/models/Team.java @@ -8,7 +8,7 @@ import java.util.Objects; @Entity -public class Team implements WriteableInterface { +public class Team extends Deletable implements WriteableInterface { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_team") @SequenceGenerator(name = "sequence_team", allocationSize = 1) diff --git a/backend/src/main/java/ch/puzzle/okr/models/Unit.java b/backend/src/main/java/ch/puzzle/okr/models/Unit.java index 79798da37d..6021500f4a 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/Unit.java +++ b/backend/src/main/java/ch/puzzle/okr/models/Unit.java @@ -9,7 +9,7 @@ @Entity @EntityListeners(AuditingEntityListener.class) -public class Unit { +public class Unit extends Deletable { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_unit") @SequenceGenerator(name = "sequence_unit", allocationSize = 1) diff --git a/backend/src/main/java/ch/puzzle/okr/models/User.java b/backend/src/main/java/ch/puzzle/okr/models/User.java index a3e88e6461..cb1252763b 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/User.java +++ b/backend/src/main/java/ch/puzzle/okr/models/User.java @@ -12,7 +12,7 @@ @Entity // table cannot be named "user" since it is a reserved keyword of Postgres @Table(name = "person") -public class User { +public class User extends Deletable { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_person") @SequenceGenerator(name = "sequence_person", allocationSize = 1) diff --git a/backend/src/main/java/ch/puzzle/okr/models/checkin/CheckIn.java b/backend/src/main/java/ch/puzzle/okr/models/checkin/CheckIn.java index 43531d3ea9..39b845d13e 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/checkin/CheckIn.java +++ b/backend/src/main/java/ch/puzzle/okr/models/checkin/CheckIn.java @@ -1,5 +1,6 @@ package ch.puzzle.okr.models.checkin; +import ch.puzzle.okr.models.Deletable; import ch.puzzle.okr.models.MessageKey; import ch.puzzle.okr.models.User; import ch.puzzle.okr.models.WriteableInterface; @@ -15,7 +16,7 @@ @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "check_in_type") -public abstract class CheckIn implements WriteableInterface { +public abstract class CheckIn extends Deletable implements WriteableInterface { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_check_in") @SequenceGenerator(name = "sequence_check_in", allocationSize = 1) diff --git a/backend/src/main/java/ch/puzzle/okr/models/keyresult/KeyResult.java b/backend/src/main/java/ch/puzzle/okr/models/keyresult/KeyResult.java index 177a594615..561ec55fff 100644 --- a/backend/src/main/java/ch/puzzle/okr/models/keyresult/KeyResult.java +++ b/backend/src/main/java/ch/puzzle/okr/models/keyresult/KeyResult.java @@ -11,7 +11,7 @@ @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "key_result_type") -public abstract class KeyResult implements WriteableInterface { +public abstract class KeyResult extends Deletable implements WriteableInterface { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_key_result") @SequenceGenerator(name = "sequence_key_result", allocationSize = 1) diff --git a/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java index ed82d16e41..5abed8e6f2 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java @@ -2,8 +2,10 @@ import ch.puzzle.okr.models.Action; import java.util.List; + +import ch.puzzle.okr.models.Objective; import org.springframework.data.repository.CrudRepository; -public interface ActionRepository extends CrudRepository { +public interface ActionRepository extends DeleteRepository { List getActionsByKeyResultIdOrderByPriorityAsc(Long keyResultId); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java index 3a17fecf0e..65f130d156 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java @@ -4,7 +4,7 @@ import java.util.List; import org.springframework.data.repository.CrudRepository; -public interface CheckInRepository extends CrudRepository { +public interface CheckInRepository extends DeleteRepository { List findCheckInsByKeyResultIdOrderByCreatedOnDesc(Long keyResultId); CheckIn findFirstByKeyResultIdOrderByCreatedOnDesc(Long keyResultId); diff --git a/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java index a48afe82e1..f475f91d31 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java @@ -1,9 +1,10 @@ package ch.puzzle.okr.repository; +import ch.puzzle.okr.models.Objective; import ch.puzzle.okr.models.keyresult.KeyResult; import java.util.List; import org.springframework.data.repository.CrudRepository; -public interface KeyResultRepository extends CrudRepository { +public interface KeyResultRepository extends DeleteRepository { List findByObjectiveId(Long objectiveId); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java index f4aaf40bb9..4afb68162a 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java @@ -4,7 +4,7 @@ import java.util.List; import org.springframework.data.repository.CrudRepository; -public interface TeamRepository extends CrudRepository { +public interface TeamRepository extends DeleteRepository { List findTeamsByName(String name); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java index 10566ddc0a..a07d9f286d 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Repository; @Repository -public interface UnitRepository extends CrudRepository { +public interface UnitRepository extends DeleteRepository { Optional findUnitByUnitName(String name); diff --git a/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java index 3b7a5a4e5b..b3b6ce8470 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java @@ -5,7 +5,7 @@ import java.util.Optional; import org.springframework.data.repository.CrudRepository; -public interface UserRepository extends CrudRepository { +public interface UserRepository extends DeleteRepository { Optional findByEmail(String email); List findByOkrChampion(boolean isOkrChampion); diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java index 2ceb3685fe..a156cfdf82 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java @@ -5,13 +5,15 @@ import ch.puzzle.okr.models.Action; import ch.puzzle.okr.repository.ActionRepository; import java.util.List; + +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import org.springframework.stereotype.Service; @Service public class ActionPersistenceService extends PersistenceBase { protected ActionPersistenceService(ActionRepository repository) { - super(repository); + super(repository, new SoftDelete<>()); } @Override diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java index 8beee6fd3b..6c4a9b6486 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java @@ -5,13 +5,15 @@ import ch.puzzle.okr.models.checkin.CheckIn; import ch.puzzle.okr.repository.CheckInRepository; import java.util.List; + +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import org.springframework.stereotype.Service; @Service public class CheckInPersistenceService extends PersistenceBase { protected CheckInPersistenceService(CheckInRepository repository) { - super(repository); + super(repository, new SoftDelete<>()); } @Override diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java index fad7a82806..4768e601c3 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java @@ -4,6 +4,7 @@ import ch.puzzle.okr.models.keyresult.KeyResult; import ch.puzzle.okr.repository.KeyResultRepository; +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import jakarta.transaction.Transactional; import java.util.List; import org.springframework.stereotype.Service; @@ -12,7 +13,7 @@ public class KeyResultPersistenceService extends PersistenceBase { protected KeyResultPersistenceService(KeyResultRepository repository) { - super(repository); + super(repository, new SoftDelete<>()); } @Override diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java index 617ec51cc1..7616e4c43c 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java @@ -30,7 +30,7 @@ public class ObjectivePersistenceService extends PersistenceBase authorizationCriteria) { - super(repository, new SoftDelete(repository)); + super(repository, new SoftDelete<>()); this.entityManager = entityManager; this.authorizationCriteria = authorizationCriteria; } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java index dd485164aa..9de77ec08e 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java @@ -5,13 +5,15 @@ import ch.puzzle.okr.models.Team; import ch.puzzle.okr.repository.TeamRepository; import java.util.List; + +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import org.springframework.stereotype.Service; @Service public class TeamPersistenceService extends PersistenceBase { protected TeamPersistenceService(TeamRepository repository) { - super(repository); + super(repository, new SoftDelete<>()); } @Override diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java index 74e6ada6d4..7652a1c916 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java @@ -8,6 +8,8 @@ import ch.puzzle.okr.models.Unit; import ch.puzzle.okr.repository.UnitRepository; import java.util.List; + +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -15,7 +17,7 @@ public class UnitPersistenceService extends PersistenceBase { protected UnitPersistenceService(UnitRepository repository) { - super(repository); + super(repository, new SoftDelete<>()); } @Override diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java index 7ec0dbce56..4f4aa26361 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java @@ -6,12 +6,14 @@ import ch.puzzle.okr.repository.UserRepository; import java.util.List; import java.util.Optional; + +import ch.puzzle.okr.service.persistence.customCrud.SoftDelete; import org.springframework.stereotype.Service; @Service public class UserPersistenceService extends PersistenceBase { protected UserPersistenceService(UserRepository repository) { - super(repository); + super(repository, new SoftDelete<>()); } @Override From 2804d751f5dd9e76e5db35d89395f4c9d17403dd Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Tue, 11 Feb 2025 14:40:24 +0100 Subject: [PATCH 05/12] find all should always return the visible entities --- .../okr/repository/ActionRepository.java | 5 ++++- .../okr/repository/CheckInRepository.java | 5 ++--- .../okr/repository/DeleteRepository.java | 4 ++-- .../okr/repository/KeyResultRepository.java | 4 +--- .../okr/repository/ObjectiveRepository.java | 4 ++-- .../puzzle/okr/repository/TeamRepository.java | 3 +-- .../puzzle/okr/repository/UnitRepository.java | 8 ++++---- .../puzzle/okr/repository/UserRepository.java | 4 ++-- .../persistence/ActionPersistenceService.java | 2 +- .../CheckInPersistenceService.java | 4 ++-- .../KeyResultPersistenceService.java | 2 +- .../ObjectivePersistenceService.java | 4 ++-- .../service/persistence/PersistenceBase.java | 2 +- .../persistence/TeamPersistenceService.java | 2 +- .../persistence/UnitPersistenceService.java | 8 ++++---- .../persistence/UserPersistenceService.java | 6 +++--- .../persistence/customCrud/DeleteMethod.java | 1 + .../persistence/customCrud/HardDelete.java | 8 +++++++- .../persistence/customCrud/SoftDelete.java | 5 +++++ .../migration/V3_5_2__add_is_deleted_flag.sql | 20 +++++++++++++++++++ 20 files changed, 66 insertions(+), 35 deletions(-) diff --git a/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java index 5abed8e6f2..7332e718a8 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/ActionRepository.java @@ -4,8 +4,11 @@ import java.util.List; import ch.puzzle.okr.models.Objective; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; public interface ActionRepository extends DeleteRepository { - List getActionsByKeyResultIdOrderByPriorityAsc(Long keyResultId); +// @Query("select Action from Action a where ") +// TODO rename this + List getActionsByKeyResultIdAndIsDeletedFalseOrderByPriorityAsc(Long keyResultId); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java index 65f130d156..cf9372a047 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/CheckInRepository.java @@ -2,10 +2,9 @@ import ch.puzzle.okr.models.checkin.CheckIn; import java.util.List; -import org.springframework.data.repository.CrudRepository; public interface CheckInRepository extends DeleteRepository { - List findCheckInsByKeyResultIdOrderByCreatedOnDesc(Long keyResultId); + List findCheckInsByKeyResultIdAndIsDeletedFalseOrderByCreatedOnDesc(Long keyResultId); - CheckIn findFirstByKeyResultIdOrderByCreatedOnDesc(Long keyResultId); + CheckIn findFirstByKeyResultIdAndIsDeletedFalseOrderByCreatedOnDesc(Long keyResultId); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java index 787ed23906..b9c2dbdd29 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/DeleteRepository.java @@ -10,7 +10,7 @@ import java.util.List; @NoRepositoryBean -public interface DeleteRepository extends CrudRepository { +public interface DeleteRepository extends CrudRepository { // @Query("select #{#entityName} e set e.isDeleted = true where e.id = :id") // List isDeleted(boolean isDeleted); @@ -19,5 +19,5 @@ public interface DeleteRepository extends CrudRepository @Modifying @Query("update #{#entityName} e set e.isDeleted = true where e.id = :id") - void markAsDeleted(@Param("id") T id); + void markAsDeleted(@Param("id") I id); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java index f475f91d31..067241d8de 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/KeyResultRepository.java @@ -1,10 +1,8 @@ package ch.puzzle.okr.repository; -import ch.puzzle.okr.models.Objective; import ch.puzzle.okr.models.keyresult.KeyResult; import java.util.List; -import org.springframework.data.repository.CrudRepository; public interface KeyResultRepository extends DeleteRepository { - List findByObjectiveId(Long objectiveId); + List findByObjectiveIdAndIsDeletedFalse(Long objectiveId); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java index c8a44bb5b7..ad0681ad41 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/ObjectiveRepository.java @@ -10,7 +10,7 @@ @Repository public interface ObjectiveRepository extends DeleteRepository { - Integer countByTeamAndQuarter(Team team, Quarter quarter); + Integer countByTeamAndQuarterAndIsDeletedFalse(Team team, Quarter quarter); - List findObjectivesByTeamId(Long id); + List findObjectivesByTeamIdAndIsDeletedFalse(Long id); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java index 4afb68162a..43af9813c0 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/TeamRepository.java @@ -2,9 +2,8 @@ import ch.puzzle.okr.models.Team; import java.util.List; -import org.springframework.data.repository.CrudRepository; public interface TeamRepository extends DeleteRepository { - List findTeamsByName(String name); + List findTeamsByNameAndIsDeletedFalse(String name); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java index a07d9f286d..ae2ce6ebee 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/UnitRepository.java @@ -9,11 +9,11 @@ @Repository public interface UnitRepository extends DeleteRepository { - Optional findUnitByUnitName(String name); + Optional findUnitByUnitNameAndIsDeletedFalse(String name); - List findAllByCreatedById(Long userId); + List findAllByCreatedByIdAndIsDeletedFalse(Long userId); - boolean existsUnitByUnitName(String unitName); + boolean existsUnitByUnitNameAndIsDeletedFalse(String unitName); - boolean existsUnitByUnitNameAndIdNot(String unitName, Long id); + boolean existsUnitByUnitNameAndIdNotAndIsDeletedFalse(String unitName, Long id); } diff --git a/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java b/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java index b3b6ce8470..e394a49cc4 100644 --- a/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java +++ b/backend/src/main/java/ch/puzzle/okr/repository/UserRepository.java @@ -6,7 +6,7 @@ import org.springframework.data.repository.CrudRepository; public interface UserRepository extends DeleteRepository { - Optional findByEmail(String email); + Optional findByEmailAndIsDeletedFalse(String email); - List findByOkrChampion(boolean isOkrChampion); + List findByOkrChampionAndIsDeletedFalse(boolean isOkrChampion); } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java index a156cfdf82..1bd78956d6 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/ActionPersistenceService.java @@ -22,6 +22,6 @@ public String getModelName() { } public List getActionsByKeyResultIdOrderByPriorityAsc(Long keyResultId) { - return getRepository().getActionsByKeyResultIdOrderByPriorityAsc(keyResultId); + return getRepository().getActionsByKeyResultIdAndIsDeletedFalseOrderByPriorityAsc(keyResultId); } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java index 6c4a9b6486..dfbbe47c46 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/CheckInPersistenceService.java @@ -22,10 +22,10 @@ public String getModelName() { } public List getCheckInsByKeyResultIdOrderByCheckInDateDesc(Long keyResultId) { - return getRepository().findCheckInsByKeyResultIdOrderByCreatedOnDesc(keyResultId); + return getRepository().findCheckInsByKeyResultIdAndIsDeletedFalseOrderByCreatedOnDesc(keyResultId); } public CheckIn getLastCheckInOfKeyResult(Long keyResultId) { - return getRepository().findFirstByKeyResultIdOrderByCreatedOnDesc(keyResultId); + return getRepository().findFirstByKeyResultIdAndIsDeletedFalseOrderByCreatedOnDesc(keyResultId); } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java index 4768e601c3..3f52d84a95 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/KeyResultPersistenceService.java @@ -22,7 +22,7 @@ public String getModelName() { } public List getKeyResultsByObjective(Long objectiveId) { - return getRepository().findByObjectiveId(objectiveId); + return getRepository().findByObjectiveIdAndIsDeletedFalse(objectiveId); } @Transactional diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java index 7616e4c43c..cbc7ccd406 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/ObjectivePersistenceService.java @@ -53,7 +53,7 @@ public String getModelName() { * @return number of Objectives of team in quarter */ public Integer countByTeamAndQuarter(Team team, Quarter quarter) { - return getRepository().countByTeamAndQuarter(team, quarter); + return getRepository().countByTeamAndQuarterAndIsDeletedFalse(team, quarter); } public Objective findObjectiveById(Long objectiveId, AuthorizationUser authorizationUser, @@ -62,7 +62,7 @@ public Objective findObjectiveById(Long objectiveId, AuthorizationUser authoriza } public List findObjectiveByTeamId(Long teamId) { - return getRepository().findObjectivesByTeamId(teamId); + return getRepository().findObjectivesByTeamIdAndIsDeletedFalse(teamId); } public Objective findObjectiveByKeyResultId(Long keyResultId, AuthorizationUser authorizationUser, diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java index db4544e2a7..6cc3bcb410 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/PersistenceBase.java @@ -75,7 +75,7 @@ public T save(T model) throws OkrResponseStatusException { } public List findAll() { - return iteratorToList(repository.findAll()); + return iteratorToList(this.deleteMethod.findAll()); } public void deleteById(I id) { diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java index 9de77ec08e..6afe3cf46c 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/TeamPersistenceService.java @@ -22,6 +22,6 @@ public String getModelName() { } public List findTeamsByName(String name) { - return getRepository().findTeamsByName(name); + return getRepository().findTeamsByNameAndIsDeletedFalse(name); } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java index 7652a1c916..3ce66ad30f 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/UnitPersistenceService.java @@ -27,21 +27,21 @@ public String getModelName() { public Unit findUnitByUnitName(String unitName) { return getRepository() - .findUnitByUnitName(unitName) + .findUnitByUnitNameAndIsDeletedFalse(unitName) .orElseThrow(() -> new OkrResponseStatusException(HttpStatus.NOT_FOUND, ErrorKey.MODEL_NOT_FOUND_BY_PROPERTY, List.of(Constants.UNIT, "unit name", unitName))); } public boolean existsUnitByUnitName(String unitName) { - return getRepository().existsUnitByUnitName(unitName); + return getRepository().existsUnitByUnitNameAndIsDeletedFalse(unitName); } public boolean existsUnitByUnitNameAndIdNot(String unitName, Long id) { - return getRepository().existsUnitByUnitNameAndIdNot(unitName, id); + return getRepository().existsUnitByUnitNameAndIdNotAndIsDeletedFalse(unitName, id); } public List findUnitsByUser(Long userId) { - return getRepository().findAllByCreatedById(userId); + return getRepository().findAllByCreatedByIdAndIsDeletedFalse(userId); } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java index 4f4aa26361..7565209464 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/UserPersistenceService.java @@ -22,12 +22,12 @@ public String getModelName() { } public synchronized User getOrCreateUser(User user) { - Optional savedUser = getRepository().findByEmail(user.getEmail()); + Optional savedUser = getRepository().findByEmailAndIsDeletedFalse(user.getEmail()); return savedUser.orElseGet(() -> getRepository().save(user)); } public Optional findByEmail(String email) { - return getRepository().findByEmail(email); + return getRepository().findByEmailAndIsDeletedFalse(email); } @Override @@ -39,7 +39,7 @@ public User save(User user) { } public List findAllOkrChampions() { - return getRepository().findByOkrChampion(true); + return getRepository().findByOkrChampionAndIsDeletedFalse(true); } public Iterable saveAll(List userList) { diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java index 2faacd7cf6..3c94c202f4 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/DeleteMethod.java @@ -5,6 +5,7 @@ public abstract class DeleteMethod> { protected R repo; public abstract void deleteById(I id); + public abstract Iterable findAll(); public void setRepo(R repo){ this.repo = repo; diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java index efd90bd800..513ecc51f7 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/HardDelete.java @@ -1,8 +1,9 @@ package ch.puzzle.okr.service.persistence.customCrud; -import ch.puzzle.okr.models.Deletable; import org.springframework.data.repository.CrudRepository; +import java.util.List; + public class HardDelete> extends DeleteMethod{ @@ -10,4 +11,9 @@ public class HardDelete> extends DeleteMeth public void deleteById(I id) { this.repo.deleteById(id); } + + @Override + public Iterable findAll() { + return this.repo.findAll(); + } } diff --git a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java index 62e72d72d9..b7c8942e33 100644 --- a/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java +++ b/backend/src/main/java/ch/puzzle/okr/service/persistence/customCrud/SoftDelete.java @@ -9,4 +9,9 @@ public class SoftDelete findAll() { + return this.repo.findAllVisible(); + } } diff --git a/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql b/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql index 43e5e63d4e..39f02475a0 100644 --- a/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql +++ b/backend/src/main/resources/db/migration/V3_5_2__add_is_deleted_flag.sql @@ -1,2 +1,22 @@ +ALTER TABLE team + add COLUMN is_deleted boolean not null default false; + ALTER TABLE objective add COLUMN is_deleted boolean not null default false; + +ALTER TABLE key_result + add COLUMN is_deleted boolean not null default false; + + +ALTER TABLE check_in + add COLUMN is_deleted boolean not null default false; + + +ALTER TABLE action + add COLUMN is_deleted boolean not null default false; + +ALTER TABLE unit + add COLUMN is_deleted boolean not null default false; + +ALTER TABLE person + add COLUMN is_deleted boolean not null default false; \ No newline at end of file From 2741735404d11a116e3b9420471b65fb884ba8c5 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Tue, 11 Feb 2025 15:15:00 +0100 Subject: [PATCH 06/12] add columns to h2 db --- .run/OkrApplication-E2E.run.xml | 2 +- .../java/ch/puzzle/okr/models/Deletable.java | 1 - .../java/ch/puzzle/okr/models/Objective.java | 1 - .../puzzle/okr/repository/ActionRepository.java | 8 ++------ .../puzzle/okr/repository/DeleteRepository.java | 7 +++---- .../okr/repository/ObjectiveRepository.java | 1 - .../puzzle/okr/repository/UnitRepository.java | 1 - .../puzzle/okr/repository/UserRepository.java | 1 - .../persistence/ActionPersistenceService.java | 3 +-- .../persistence/CheckInPersistenceService.java | 3 +-- .../service/persistence/PersistenceBase.java | 17 ++++++++--------- .../persistence/TeamPersistenceService.java | 3 +-- .../persistence/UnitPersistenceService.java | 3 +-- .../persistence/UserPersistenceService.java | 3 +-- .../persistence/customCrud/DeleteMethod.java | 6 +++--- .../persistence/customCrud/HardDelete.java | 5 +---- .../persistence/customCrud/SoftDelete.java | 8 ++++---- .../okr/service/validation/ValidationBase.java | 1 - .../V1_0_0__current-db-schema-for-testing.sql | 8 ++++++++ 19 files changed, 35 insertions(+), 47 deletions(-) diff --git a/.run/OkrApplication-E2E.run.xml b/.run/OkrApplication-E2E.run.xml index aa7706165a..d14babf764 100644 --- a/.run/OkrApplication-E2E.run.xml +++ b/.run/OkrApplication-E2E.run.xml @@ -1,7 +1,7 @@