Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package uk.gov.hmcts.reform.pcs.ccd.event;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.hmcts.ccd.sdk.api.CCDConfig;
import uk.gov.hmcts.ccd.sdk.api.DecentralisedConfigBuilder;
import uk.gov.hmcts.ccd.sdk.api.Permission;
import uk.gov.hmcts.reform.pcs.ccd.ShowConditions;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
import uk.gov.hmcts.reform.pcs.ccd.domain.State;
import uk.gov.hmcts.reform.pcs.ccd.event.dashboard.StartDashboardViewHandler;
import uk.gov.hmcts.reform.pcs.ccd.event.dashboard.SubmitDashboardViewHandler;

import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.dashboardView;

@Component
@Slf4j
@RequiredArgsConstructor
public class DashboardView implements CCDConfig<PCSCase, State, UserRole> {

private final StartDashboardViewHandler startDashboardViewHandler;
private final SubmitDashboardViewHandler submitDashboardViewHandler;

@Override
public void configureDecentralised(final DecentralisedConfigBuilder<PCSCase, State, UserRole> configBuilder) {
configBuilder
.decentralisedEvent(dashboardView.name(), submitDashboardViewHandler, startDashboardViewHandler)
.forState(State.CASE_ISSUED)
.showCondition(ShowConditions.NEVER_SHOW)
.name("Dashboard view")
.description("Compute dashboard notifications for case journey")
.grant(Permission.CRU, UserRole.DEFENDANT);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ public enum EventId {
enforceTheOrder,
respondPossessionClaim,
submitDefendantResponse,
createTestCase
createTestCase,
dashboardView
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package uk.gov.hmcts.reform.pcs.ccd.event.dashboard;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.hmcts.ccd.sdk.api.EventPayload;
import uk.gov.hmcts.ccd.sdk.api.callback.Start;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
import uk.gov.hmcts.reform.pcs.ccd.domain.State;
import uk.gov.hmcts.reform.pcs.ccd.event.EventId;
import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService;
import uk.gov.hmcts.reform.pcs.ccd.service.dashboard.DashboardJourneyService;
import uk.gov.hmcts.reform.pcs.dashboard.model.DashboardNotification;

import java.util.List;
import java.util.Optional;

import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.respondPossessionClaim;

@Component
@Slf4j
@RequiredArgsConstructor
public class StartDashboardViewHandler implements Start<PCSCase, State> {

private final DraftCaseDataService draftCaseDataService;
private final DashboardJourneyService dashboardJourneyService;
private final ObjectMapper objectMapper;

@Override
public PCSCase start(EventPayload<PCSCase, State> eventPayload) {
long caseReference = eventPayload.caseReference();
State state = State.CASE_ISSUED;

PCSCase submittedCaseData = eventPayload.caseData();

Optional<PCSCase> draftForRespondPossession = getDraft(caseReference, respondPossessionClaim);

List<DashboardNotification> notifications = dashboardJourneyService.computeNotifications(
caseReference,
state,
submittedCaseData,
draftForRespondPossession
);

String payloadJson = toPayloadJson(caseReference, notifications);

submittedCaseData.setCaseTitleMarkdown(payloadJson);
return submittedCaseData;
}

private Optional<PCSCase> getDraft(long caseReference, EventId eventId) {
try {
return draftCaseDataService.getUnsubmittedCaseData(caseReference, eventId);
} catch (Exception e) {
log.warn("Failed to load draft case data for caseReference={} eventId={}", caseReference, eventId, e);
return Optional.empty();
}
}

private String toPayloadJson(long caseReference, List<DashboardNotification> notifications) {
DashboardPayload payload = new DashboardPayload(notifications);
try {
return objectMapper.writeValueAsString(payload);
} catch (JsonProcessingException e) {
log.error("Failed to serialise dashboard payload for caseReference={}", caseReference, e);
return "{\"notifications\":[]}";
}
}

private record DashboardPayload(List<DashboardNotification> notifications) {
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package uk.gov.hmcts.reform.pcs.ccd.event.dashboard;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.hmcts.ccd.sdk.api.EventPayload;
import uk.gov.hmcts.ccd.sdk.api.callback.Submit;
import uk.gov.hmcts.ccd.sdk.api.callback.SubmitResponse;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
import uk.gov.hmcts.reform.pcs.ccd.domain.State;

@Component
@Slf4j
@RequiredArgsConstructor
public class SubmitDashboardViewHandler implements Submit<PCSCase, State> {

@Override
public SubmitResponse<State> submit(EventPayload<PCSCase, State> eventPayload) {
// READ-ONLY: the dashboard view event should not persist changes.
return SubmitResponse.defaultResponse();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package uk.gov.hmcts.reform.pcs.ccd.service.dashboard;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
import uk.gov.hmcts.reform.pcs.ccd.domain.State;
import uk.gov.hmcts.reform.pcs.dashboard.model.DashboardNotification;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
* Computes dashboard notifications (template IDs + values) from submitted and draft case data.
*
* <p>READ-ONLY: callers are responsible for loading any data needed and passing it in.</p>
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class DashboardJourneyService {

public List<DashboardNotification> computeNotifications(long caseReference,
State state,
PCSCase submittedCaseData,
Optional<PCSCase> draftCaseData) {

boolean hasDraft = draftCaseData.isPresent();

if (state == State.CASE_ISSUED) {
DashboardNotification journeyNotification = DashboardNotification.builder()
.templateId("Notice.PCS.Dashboard.CaseIssued")
.templateValues(Map.of(
"caseReference", caseReference,
"hasDraft", hasDraft
))
.build();

return List.of(journeyNotification);
}

if (state == State.AWAITING_SUBMISSION_TO_HMCTS && hasDraft) {
DashboardNotification resumeNotification = DashboardNotification.builder()
.templateId("Notice.PCS.Dashboard.DraftInProgress")
.templateValues(Map.of(
"caseReference", caseReference
))
.build();
return List.of(resumeNotification);
}

return List.of();
}
}

Loading