Skip to content

Commit 7019f0c

Browse files
authored
feat(specification-rule): add auditing for specification rules (#199)
Closes: MRSPECS-200
1 parent 86c05f1 commit 7019f0c

12 files changed

Lines changed: 96 additions & 32 deletions

File tree

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
### Features
1010
* Refactor specification sync from URL to local copy ([MRSPECS-87](https://folio-org.atlassian.net/browse/MRSPECS-87))
1111
* Default specification data updates to disable undefined rules ([MRSPECS-102](https://folio-org.atlassian.net/browse/MRSPECS-102))
12+
* Add auditing for specification rules ([MRSPECS-200](https://folio-org.atlassian.net/browse/MRSPECS-200))
1213

1314
### Bug fixes
1415
* Fix non-obsolete subfield choosing logic ([MRSPECS-95](https://folio-org.atlassian.net/browse/MRSPECS-95))

mod-record-specifications-server/src/main/java/org/folio/rspec/domain/entity/Rule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
import jakarta.persistence.Column;
44
import jakarta.persistence.Embedded;
55
import jakarta.persistence.Entity;
6+
import jakarta.persistence.EntityListeners;
67
import jakarta.persistence.Table;
78
import lombok.Getter;
89
import lombok.Setter;
910
import org.folio.rspec.domain.entity.support.Metadata;
1011
import org.folio.rspec.domain.entity.support.UuidPersistable;
12+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
1113

1214
@Getter
1315
@Setter
1416
@Entity
1517
@Table(name = "rule")
18+
@EntityListeners(AuditingEntityListener.class)
1619
public class Rule extends UuidPersistable {
1720

1821
public static final String NAME_COLUMN = "name";

mod-record-specifications-server/src/main/java/org/folio/rspec/domain/entity/Specification.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.persistence.Column;
44
import jakarta.persistence.Embedded;
55
import jakarta.persistence.Entity;
6+
import jakarta.persistence.EntityListeners;
67
import jakarta.persistence.EnumType;
78
import jakarta.persistence.Enumerated;
89
import jakarta.persistence.OneToMany;
@@ -21,6 +22,7 @@
2122
import org.folio.rspec.domain.entity.support.UuidPersistable;
2223
import org.hibernate.annotations.JdbcTypeCode;
2324
import org.hibernate.type.SqlTypes;
25+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
2426

2527
@Getter
2628
@Setter
@@ -29,6 +31,7 @@
2931
@UniqueConstraint(name = "uc_specification_family_profile",
3032
columnNames = {Specification.FAMILY_COLUMN, Specification.PROFILE_COLUMN})
3133
})
34+
@EntityListeners(AuditingEntityListener.class)
3235
public class Specification extends UuidPersistable {
3336

3437
public static final String TITLE_COLUMN = "title";

mod-record-specifications-server/src/main/java/org/folio/rspec/domain/entity/SpecificationRule.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
package org.folio.rspec.domain.entity;
22

33
import jakarta.persistence.Column;
4+
import jakarta.persistence.Embedded;
45
import jakarta.persistence.EmbeddedId;
56
import jakarta.persistence.Entity;
7+
import jakarta.persistence.EntityListeners;
68
import jakarta.persistence.ManyToOne;
79
import jakarta.persistence.MapsId;
810
import jakarta.persistence.Table;
911
import java.util.Objects;
1012
import lombok.Getter;
1113
import lombok.Setter;
14+
import org.folio.rspec.domain.entity.support.Metadata;
1215
import org.hibernate.Hibernate;
16+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
1317

1418
@Getter
1519
@Setter
1620
@Entity
1721
@Table(name = "specification_rule")
22+
@EntityListeners(AuditingEntityListener.class)
1823
public class SpecificationRule {
1924

2025
@EmbeddedId
@@ -31,6 +36,9 @@ public class SpecificationRule {
3136
@Column(name = "enabled", nullable = false)
3237
private boolean enabled = true;
3338

39+
@Embedded
40+
private Metadata metadata;
41+
3442
@Override
3543
public final int hashCode() {
3644
return Objects.hash(specificationRuleId);

mod-record-specifications-server/src/main/java/org/folio/rspec/domain/repository/SpecificationRuleRepository.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
import org.folio.rspec.domain.entity.SpecificationRule;
66
import org.folio.rspec.domain.entity.SpecificationRuleId;
77
import org.springframework.data.jpa.repository.JpaRepository;
8-
import org.springframework.data.jpa.repository.Modifying;
98
import org.springframework.data.jpa.repository.Query;
10-
import org.springframework.transaction.annotation.Transactional;
119

1210
public interface SpecificationRuleRepository extends JpaRepository<SpecificationRule, SpecificationRuleId> {
1311

@@ -17,9 +15,4 @@ public interface SpecificationRuleRepository extends JpaRepository<Specification
1715
where s.specificationRuleId.specificationId = ?1
1816
""")
1917
List<SpecificationRule> findBySpecificationId(UUID specificationId);
20-
21-
@Transactional
22-
@Modifying
23-
@Query("update SpecificationRule s set s.enabled = ?1 where s.specificationRuleId = ?2")
24-
int updateEnabledBySpecificationRuleId(boolean enabled, SpecificationRuleId specificationRuleId);
2518
}

mod-record-specifications-server/src/main/java/org/folio/rspec/service/SpecificationRuleService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public SpecificationRuleDtoCollection findSpecificationRules(UUID specificationI
3232

3333
public void toggleSpecificationRule(SpecificationRuleId specificationRuleId, boolean enabled) {
3434
log.info("toggleSpecificationRule::specificationRuleId={}, enabled={}", specificationRuleId, enabled);
35-
int updated = specificationRuleRepository.updateEnabledBySpecificationRuleId(enabled, specificationRuleId);
36-
if (updated == 0) {
37-
throw ResourceNotFoundException.forSpecificationRule(specificationRuleId);
38-
}
35+
var specificationRule = specificationRuleRepository.findById(specificationRuleId)
36+
.orElseThrow(() -> ResourceNotFoundException.forSpecificationRule(specificationRuleId));
37+
specificationRule.setEnabled(enabled);
38+
specificationRuleRepository.save(specificationRule);
3939
}
4040
}

mod-record-specifications-server/src/main/java/org/folio/rspec/service/mapper/SpecificationRuleMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public interface SpecificationRuleMapper {
1717
@Mapping(target = "name", source = "rule.name")
1818
@Mapping(target = "specificationId", source = "specification.id")
1919
@Mapping(target = "description", source = "rule.description")
20-
@Mapping(target = "metadata", source = "rule.metadata")
20+
@Mapping(target = "metadata", source = "metadata")
2121
SpecificationRuleDto toDto(SpecificationRule specificationRule);
2222

2323
@Mapping(target = "specificationId", ignore = true)

mod-record-specifications-server/src/main/resources/db/changelog/changelog-master.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66

77
<include file="changes/changelog-v1.0.xml" relativeToChangelogFile="true"/>
88
<include file="changes/changelog-v2.1.xml" relativeToChangelogFile="true"/>
9+
<include file="changes/changelog-v3.0.xml" relativeToChangelogFile="true"/>
910

1011
</databaseChangeLog>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
5+
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
6+
7+
<include file="v3.0/move-rule-metadata.xml" relativeToChangelogFile="true"/>
8+
9+
</databaseChangeLog>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
5+
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
6+
7+
8+
<changeSet id="MRSPECS-200@@update-table:specification_rule:add-metadata-fields" author="pavlo_smahin">
9+
<preConditions>
10+
<tableExists tableName="specification_rule"/>
11+
</preConditions>
12+
13+
<comment>Add metadata fields to specification_rule table</comment>
14+
15+
<addColumn tableName="specification_rule">
16+
<column name="created_by_user_id" type="UUID"/>
17+
<column name="created_date" type="DATETIME"/>
18+
<column name="updated_by_user_id" type="UUID"/>
19+
<column name="updated_date" type="DATETIME"/>
20+
</addColumn>
21+
</changeSet>
22+
23+
<changeSet id="MRSPECS-200@@migrate:rule-to-specification-rule:metadata-fields" author="pavlo_smahin">
24+
<preConditions>
25+
<and>
26+
<tableExists tableName="specification_rule"/>
27+
<tableExists tableName="rule"/>
28+
</and>
29+
</preConditions>
30+
31+
<comment>Migrate metadata from rule table to specification_rule table</comment>
32+
33+
<sql>
34+
UPDATE specification_rule sr
35+
SET created_by_user_id = r.created_by_user_id,
36+
created_date = r.created_date,
37+
updated_by_user_id = r.updated_by_user_id,
38+
updated_date = r.updated_date
39+
FROM rule r
40+
WHERE sr.rule_id = r.id
41+
</sql>
42+
</changeSet>
43+
44+
<changeSet id="MRSPECS-200@@update-table:specification_rule:add-not-null-constraints" author="pavlo_smahin">
45+
<preConditions>
46+
<tableExists tableName="specification_rule"/>
47+
</preConditions>
48+
49+
<comment>Add NOT NULL constraints to metadata fields</comment>
50+
51+
<addNotNullConstraint tableName="specification_rule" columnName="created_by_user_id" columnDataType="UUID"/>
52+
<addNotNullConstraint tableName="specification_rule" columnName="created_date" columnDataType="DATETIME"/>
53+
<addNotNullConstraint tableName="specification_rule" columnName="updated_by_user_id" columnDataType="UUID"/>
54+
<addNotNullConstraint tableName="specification_rule" columnName="updated_date" columnDataType="DATETIME"/>
55+
</changeSet>
56+
57+
</databaseChangeLog>

0 commit comments

Comments
 (0)