Skip to content

Commit 636a993

Browse files
Merge pull request #157 from DTS-STN/ken/flag-hide-manifest
Add feature-flag for hiding manifest numbers
2 parents 26e306a + f372576 commit 636a993

File tree

7 files changed

+78
-8
lines changed

7 files changed

+78
-8
lines changed

src/main/java/ca/gov/dtsstn/passport/api/config/properties/ApplicationProperties.java

+2
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
@Validated
1212
@ConfigurationProperties("application")
1313
@EnableConfigurationProperties({
14+
FeatureFlagsProperties.class,
1415
GcNotifyProperties.class,
1516
JmsProperties.class,
1617
SecurityProperties.class,
1718
SwaggerUiProperties.class
1819
})
1920
public record ApplicationProperties(
21+
@NestedConfigurationProperty FeatureFlagsProperties featureFlags,
2022
@NestedConfigurationProperty GcNotifyProperties gcnotify,
2123
@NestedConfigurationProperty JmsProperties jms,
2224
@NestedConfigurationProperty SecurityProperties security,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ca.gov.dtsstn.passport.api.config.properties;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
5+
import java.util.List;
6+
7+
/**
8+
* @author Ken Blanchard ([email protected])
9+
*/
10+
@ConfigurationProperties("application.feature-flags")
11+
public class FeatureFlagsProperties {
12+
private List<String> hiddenManifests = List.of();
13+
14+
public List<String> getHiddenManifests() {
15+
return hiddenManifests;
16+
}
17+
18+
public void setHiddenManifests(List<String> list) {
19+
this.hiddenManifests = list;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ca.gov.dtsstn.passport.api.config.properties;
2+
3+
import java.util.Map;
4+
5+
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
7+
/**
8+
* Configuration properties for hiding the manifest numbers from client/public view.
9+
*
10+
* Mapping of status code to boolean value.
11+
*
12+
* @author Ken Blanchard ([email protected])
13+
*/
14+
@ConfigurationProperties("application.feature-flags.hide-manifest")
15+
public class HideManifestProperties {
16+
private Map<String, Boolean> map;
17+
18+
public Map<String, Boolean> getMap() {
19+
return map;
20+
}
21+
22+
public void setMap(Map<String, Boolean> map) {
23+
this.map = map;
24+
}
25+
}

src/main/java/ca/gov/dtsstn/passport/api/data/entity/StatusCodeEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@Entity(name = "StatusCode")
1717
public class StatusCodeEntity extends AbstractEntity {
1818

19-
@Column(length = 16, nullable = false)
19+
@Column(length = 64, nullable = false)
2020
private String code;
2121

2222
@Column(length = 8, nullable = false)

src/main/java/ca/gov/dtsstn/passport/api/web/model/mapper/CertificateApplicationModelMapper.java

+23-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.springframework.lang.Nullable;
1919
import org.springframework.util.Assert;
2020

21+
import ca.gov.dtsstn.passport.api.config.properties.FeatureFlagsProperties;
2122
import ca.gov.dtsstn.passport.api.service.SourceCodeService;
2223
import ca.gov.dtsstn.passport.api.service.StatusCodeService;
2324
import ca.gov.dtsstn.passport.api.service.domain.PassportStatus;
@@ -38,6 +39,9 @@
3839
@Mapper(componentModel = "spring")
3940
public abstract class CertificateApplicationModelMapper {
4041

42+
@Autowired
43+
private FeatureFlagsProperties featureFlagsProperties;
44+
4145
@Autowired
4246
protected SourceCodeService sourceCodeService;
4347

@@ -162,6 +166,8 @@ protected String findApplicationRegisterSid(@Nullable Iterable<CertificateApplic
162166
protected List<CertificateApplicationIdentificationModel> getCertificateApplicationIdentifications(@Nullable PassportStatus passportStatus) {
163167
if (passportStatus == null) { return null; }
164168

169+
boolean displayManifest = !isStatusManifestHidden(passportStatus);
170+
165171
final CertificateApplicationIdentificationModel applicationRegisterSid = Optional.ofNullable(passportStatus.getApplicationRegisterSid())
166172
.map(xxx -> ImmutableCertificateApplicationIdentificationModel.builder()
167173
.identificationCategoryText(CertificateApplicationIdentificationModel.APPLICATION_REGISTER_SID_CATEGORY_TEXT)
@@ -177,15 +183,27 @@ protected List<CertificateApplicationIdentificationModel> getCertificateApplicat
177183
.orElse(null);
178184

179185
final CertificateApplicationIdentificationModel manifestNumber = Optional.ofNullable(passportStatus.getManifestNumber())
180-
.map(xxx -> ImmutableCertificateApplicationIdentificationModel.builder()
181-
.identificationCategoryText(CertificateApplicationIdentificationModel.MANIFEST_NUMBER_CATEGORY_TEXT)
182-
.identificationId(passportStatus.getManifestNumber())
183-
.build())
184-
.orElse(null);
186+
.filter(xxx -> displayManifest)
187+
.map(xxx -> ImmutableCertificateApplicationIdentificationModel.builder()
188+
.identificationCategoryText(CertificateApplicationIdentificationModel.MANIFEST_NUMBER_CATEGORY_TEXT)
189+
.identificationId(passportStatus.getManifestNumber())
190+
.build())
191+
.orElse(null);
185192

186193
return Stream.of(applicationRegisterSid, fileNumber, manifestNumber).filter(Objects::nonNull).toList();
187194
}
188195

196+
private boolean isStatusManifestHidden(@Nullable PassportStatus passportStatus) {
197+
return Optional.ofNullable(passportStatus)
198+
.map(PassportStatus::getStatusCodeId)
199+
.flatMap(statusCodeService::read)
200+
.map(StatusCode::getCode)
201+
.map(code -> {
202+
return featureFlagsProperties.getHiddenManifests().contains(code);
203+
})
204+
.orElse(false);
205+
}
206+
189207
@Nullable
190208
@Named("getPersonGivenNames")
191209
protected List<String> getPersonGivenNames(@Nullable PassportStatus passportStatus) {

src/main/resources/application-local.yaml.sample

+4-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ spring:
2525
application:
2626
database-initializer:
2727
run-on-startup: true
28+
feature-flags:
29+
# List of statuses, whose manifests should not be sent to the client.
30+
hidden-manifests: ['PASSPORT_ISSUED_SHIPPING_CANADA_POST']
2831
gcnotify:
2932
english-api-key: gcntfy-project-00000000-0000-0000-0000-000000000000-00000000-0000-0000-0000-000000000000
3033
french-api-key: gcntfy-project-00000000-0000-0000-0000-000000000000-00000000-0000-0000-0000-000000000000
@@ -36,4 +39,4 @@ application:
3639
security:
3740
oauth:
3841
client-id: 2652573b-9b11-4f03-a3b8-eb38f1b00312
39-
tenant-id: 9ed55846-8a81-4246-acd8-b1a01abfc0d1
42+
tenant-id: 9ed55846-8a81-4246-acd8-b1a01abfc0d1

src/test/java/ca/gov/dtsstn/passport/api/web/model/mapper/CertificateApplicationModelMapperTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
55
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.Mockito.times;
67
import static org.mockito.Mockito.verify;
78
import static org.mockito.Mockito.when;
89

@@ -273,7 +274,7 @@ void testToModel_nonnull() {
273274
.extracting(StatusDateModel::getDate)
274275
.isEqualTo(statusDate.toString());
275276

276-
verify(statusCodeService).read(any());
277+
verify(statusCodeService, times(2)).read(any());
277278
}
278279

279280
@Test

0 commit comments

Comments
 (0)