Skip to content

Commit c95cd95

Browse files
authored
Merge pull request #13 from hmcts/feature/amp-165-put
Feature/amp 165 put
2 parents 040feca + 8091b0b commit c95cd95

File tree

7 files changed

+143
-38
lines changed

7 files changed

+143
-38
lines changed

src/main/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionController.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,33 @@ public class SubscriptionController implements SubscriptionApi {
1919

2020
private final SubscriptionService subscriptionService;
2121

22+
private static final String CLIENT_ID = "TODO";
23+
2224
@Override
2325
public ResponseEntity<ClientSubscription> createClientSubscription(final ClientSubscriptionRequest request) {
24-
log.info("createClientSubscription clientId:{}", "TODO");
26+
log.info("createClientSubscription clientId:{}", CLIENT_ID);
2527
final ClientSubscription response = subscriptionService.saveSubscription(request);
2628
log.info("createClientSubscription created subscription:{}", response.getClientSubscriptionId());
2729
return new ResponseEntity<>(response, HttpStatus.CREATED);
2830
}
2931

32+
@Override
33+
public ResponseEntity<ClientSubscription> updateClientSubscription(final UUID clientSubscriptionId, final ClientSubscriptionRequest request) {
34+
log.info("updateClientSubscription clientSubscriptionId:{} clientId:{}", clientSubscriptionId, CLIENT_ID);
35+
final ClientSubscription response = subscriptionService.updateSubscription(clientSubscriptionId, request);
36+
return new ResponseEntity<>(response, HttpStatus.OK);
37+
}
38+
3039
@Override
3140
public ResponseEntity<ClientSubscription> getClientSubscription(final UUID clientSubscriptionId) {
32-
log.info("getClientSubscription clientSubscriptionId:{} clientId:{}", clientSubscriptionId, "TODO");
41+
log.info("getClientSubscription clientSubscriptionId:{} clientId:{}", clientSubscriptionId, CLIENT_ID);
3342
final ClientSubscription response = subscriptionService.getSubscription(clientSubscriptionId);
3443
return new ResponseEntity<>(response, HttpStatus.OK);
3544
}
3645

3746
@Override
3847
public ResponseEntity<Void> deleteClientSubscription(final UUID clientSubscriptionId) {
39-
log.info("deleteClientSubscription clientSubscriptionId:{} clientId:{}", clientSubscriptionId, "TODO");
48+
log.info("deleteClientSubscription clientSubscriptionId:{} clientId:{}", clientSubscriptionId, CLIENT_ID);
4049
subscriptionService.deleteSubscription(clientSubscriptionId);
4150
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
4251
}

src/main/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapper.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,44 @@
33
import org.mapstruct.Mapper;
44
import org.mapstruct.Mapping;
55
import org.mapstruct.Named;
6-
import org.mapstruct.ReportingPolicy;
7-
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
8-
import uk.gov.hmcts.cp.subscription.model.EntityEventType;
96
import uk.gov.hmcts.cp.openapi.model.ClientSubscription;
107
import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest;
118
import uk.gov.hmcts.cp.openapi.model.EventType;
129
import uk.gov.hmcts.cp.openapi.model.NotificationEndpoint;
10+
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
11+
import uk.gov.hmcts.cp.subscription.model.EntityEventType;
1312

1413
import java.util.List;
1514

1615
import static java.util.stream.Collectors.toList;
1716

18-
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
17+
@Mapper(componentModel = "spring")
1918
public interface SubscriptionMapper {
2019

21-
@Mapping(source = "request.eventTypes", target = "eventTypes", qualifiedByName = "sortedEventTypes")
20+
@Mapping(target = "id", expression = "java(null)")
21+
@Mapping(source = "request.eventTypes", target = "eventTypes", qualifiedByName = "mapWithSortedEventTypes")
22+
@Mapping(source = "request.notificationEndpoint", target = "notificationEndpoint", qualifiedByName = "mapFromNotificationEndpoint")
2223
@Mapping(target = "createdAt", expression = "java(java.time.OffsetDateTime.now())")
2324
@Mapping(target = "updatedAt", expression = "java(java.time.OffsetDateTime.now())")
24-
ClientSubscriptionEntity mapRequestToEntity(ClientSubscriptionRequest request);
25+
ClientSubscriptionEntity mapCreateRequestToEntity(ClientSubscriptionRequest request);
26+
27+
@Mapping(source = "existing.id", target = "id")
28+
@Mapping(source = "request.eventTypes", target = "eventTypes", qualifiedByName = "mapWithSortedEventTypes")
29+
@Mapping(source = "request.notificationEndpoint", target = "notificationEndpoint", qualifiedByName = "mapFromNotificationEndpoint")
30+
@Mapping(source = "existing.createdAt", target = "createdAt")
31+
@Mapping(expression = "java(java.time.OffsetDateTime.now())", target = "updatedAt")
32+
ClientSubscriptionEntity mapUpdateRequestToEntity(ClientSubscriptionEntity existing, ClientSubscriptionRequest request);
2533

2634
@Mapping(source = "id", target = "clientSubscriptionId")
2735
ClientSubscription mapEntityToResponse(ClientSubscriptionEntity entity);
2836

29-
@Named("sortedEventTypes")
37+
@Named("mapWithSortedEventTypes")
3038
static List<EntityEventType> sortedEventTypes(final List<EventType> events) {
3139
final List<String> sorted = events.stream().map(e -> e.name()).sorted().collect(toList());
3240
return sorted.stream().map(e -> EntityEventType.valueOf(e)).toList();
3341
}
3442

43+
@Named("mapFromNotificationEndpoint")
3544
static String mapFromNotificationEndpoint(final NotificationEndpoint notificationEndpoint) {
3645
return notificationEndpoint.getWebhookUrl().toString();
3746
}

src/main/java/uk/gov/hmcts/cp/subscription/services/SubscriptionService.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.springframework.stereotype.Service;
6-
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
7-
import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapper;
86
import uk.gov.hmcts.cp.openapi.model.ClientSubscription;
97
import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest;
8+
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
9+
import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapper;
1010
import uk.gov.hmcts.cp.subscription.repositories.SubscriptionRepository;
1111

1212
import java.util.UUID;
@@ -20,7 +20,13 @@ public class SubscriptionService {
2020
private final SubscriptionMapper mapper;
2121

2222
public ClientSubscription saveSubscription(final ClientSubscriptionRequest request) {
23-
final ClientSubscriptionEntity entity = mapper.mapRequestToEntity(request);
23+
final ClientSubscriptionEntity entity = mapper.mapCreateRequestToEntity(request);
24+
return mapper.mapEntityToResponse(subscriptionRepository.save(entity));
25+
}
26+
27+
public ClientSubscription updateSubscription(final UUID clientSubscriptionId, final ClientSubscriptionRequest request) {
28+
final ClientSubscriptionEntity existing = subscriptionRepository.getReferenceById(clientSubscriptionId);
29+
final ClientSubscriptionEntity entity = mapper.mapUpdateRequestToEntity(existing, request);
2430
return mapper.mapEntityToResponse(subscriptionRepository.save(entity));
2531
}
2632

src/test/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionControllerTest.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.util.UUID;
1313

1414
import static org.assertj.core.api.Assertions.assertThat;
15-
import static org.mockito.ArgumentMatchers.any;
1615
import static org.mockito.Mockito.verify;
1716
import static org.mockito.Mockito.when;
1817

@@ -31,13 +30,23 @@ class SubscriptionControllerTest {
3130
@Test
3231
void create_controller_should_call_service() {
3332
ClientSubscription response = ClientSubscription.builder().clientSubscriptionId(subscriptionId).build();
34-
when(subscriptionService.saveSubscription(any())).thenReturn(response);
33+
when(subscriptionService.saveSubscription(request)).thenReturn(response);
3534
var result = subscriptionController.createClientSubscription(request);
3635
verify(subscriptionService).saveSubscription(request);
3736
assertThat(result.getStatusCode().value()).isEqualTo(201);
3837
assertThat(result.getBody()).isEqualTo(response);
3938
}
4039

40+
@Test
41+
void update_controller_should_call_service() {
42+
ClientSubscription response = ClientSubscription.builder().clientSubscriptionId(subscriptionId).build();
43+
when(subscriptionService.updateSubscription(subscriptionId, request)).thenReturn(response);
44+
var result = subscriptionController.updateClientSubscription(subscriptionId, request);
45+
verify(subscriptionService).updateSubscription(subscriptionId, request);
46+
assertThat(result.getStatusCode().value()).isEqualTo(200);
47+
assertThat(result.getBody()).isEqualTo(response);
48+
}
49+
4150
@Test
4251
void get_controller_should_call_service() {
4352
ClientSubscription response = ClientSubscription.builder().clientSubscriptionId(subscriptionId).build();
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package uk.gov.hmcts.cp.subscription.integration;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.springframework.http.MediaType;
6+
import org.springframework.transaction.annotation.Transactional;
7+
import tools.jackson.databind.ObjectMapper;
8+
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
9+
import uk.gov.hmcts.cp.subscription.model.EntityEventType;
10+
11+
import java.util.List;
12+
13+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
14+
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
15+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
16+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
17+
18+
class SubscriptionUpdateControllerIntegrationTest extends IntegrationTestBase {
19+
20+
@BeforeEach
21+
void beforeEach() {
22+
clearAllTables();
23+
}
24+
25+
@Test
26+
@Transactional
27+
void update_client_subscription_should_update_subscription() throws Exception {
28+
ClientSubscriptionEntity existing = insertSubscription("https://oldendpoint", List.of(EntityEventType.PCR));
29+
String body = new ObjectMapper().writeValueAsString(request);
30+
mockMvc.perform(put("/client-subscriptions/{id}", existing.getId())
31+
.contentType(MediaType.APPLICATION_JSON)
32+
.header("client-id-todo", "1234")
33+
.content(body))
34+
.andDo(print())
35+
.andExpect(status().isOk())
36+
.andExpect(jsonPath("$.clientSubscriptionId").value(existing.getId().toString()))
37+
.andExpect(jsonPath("$.eventTypes.[0]").value("CUSTODIAL_RESULT"))
38+
.andExpect(jsonPath("$.eventTypes.[1]").value("PCR"))
39+
.andExpect(jsonPath("$.notificationEndpoint.webhookUrl").value("https://my-callback-url"))
40+
.andExpect(jsonPath("$.createdAt").value(existing.getCreatedAt().toString()));
41+
}
42+
}
Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package uk.gov.hmcts.cp.subscription.mappers;
22

33
import org.junit.jupiter.api.Test;
4-
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
5-
import uk.gov.hmcts.cp.subscription.model.EntityEventType;
64
import uk.gov.hmcts.cp.openapi.model.ClientSubscription;
75
import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest;
86
import uk.gov.hmcts.cp.openapi.model.NotificationEndpoint;
7+
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
8+
import uk.gov.hmcts.cp.subscription.model.EntityEventType;
99

1010
import java.time.OffsetDateTime;
11+
import java.util.ArrayList;
1112
import java.util.List;
1213
import java.util.UUID;
1314

@@ -19,21 +20,28 @@ class SubscriptionMapperTest {
1920

2021
SubscriptionMapper mapper = new SubscriptionMapperImpl();
2122

22-
UUID clientNotificationId = UUID.fromString("d730c6e1-66ba-4ef0-a3dd-0b9928faa76d");
23+
UUID clientSubscriptionId = UUID.fromString("d730c6e1-66ba-4ef0-a3dd-0b9928faa76d");
2324
NotificationEndpoint notificationEndpoint = NotificationEndpoint.builder()
2425
.webhookUrl("https://example.com")
2526
.build();
2627
OffsetDateTime createdAt = OffsetDateTime.now().minusDays(2);
2728
OffsetDateTime updatedAt = OffsetDateTime.now().minusHours(2);
29+
ClientSubscriptionEntity existing = ClientSubscriptionEntity.builder()
30+
.id(clientSubscriptionId)
31+
.notificationEndpoint(notificationEndpoint.getWebhookUrl().toString())
32+
.eventTypes(mutableLisOfEventTypes())
33+
.createdAt(createdAt)
34+
.updatedAt(updatedAt)
35+
.build();
2836

2937
@Test
30-
void request_should_map_to_entity_with_sorted_types() {
38+
void create_request_should_map_to_entity_with_sorted_types() {
3139
ClientSubscriptionRequest request = ClientSubscriptionRequest.builder()
3240
.notificationEndpoint(notificationEndpoint)
3341
.eventTypes(List.of(PCR, CUSTODIAL_RESULT))
3442
.build();
3543

36-
ClientSubscriptionEntity entity = mapper.mapRequestToEntity(request);
44+
ClientSubscriptionEntity entity = mapper.mapCreateRequestToEntity(request);
3745

3846
assertThat(entity.getId()).isNull();
3947
assertThat(entity.getNotificationEndpoint()).isEqualTo("https://example.com");
@@ -43,21 +51,39 @@ void request_should_map_to_entity_with_sorted_types() {
4351
}
4452

4553
@Test
46-
void entity_should_map_to_response() {
47-
ClientSubscriptionEntity clientSubscriptionEntity = ClientSubscriptionEntity.builder()
48-
.id(clientNotificationId)
49-
.notificationEndpoint(notificationEndpoint.getWebhookUrl().toString())
50-
.eventTypes(List.of(EntityEventType.CUSTODIAL_RESULT, EntityEventType.PCR))
51-
.createdAt(createdAt)
52-
.updatedAt(updatedAt)
54+
void update_request_should_map_to_entity_with_sorted_types() {
55+
NotificationEndpoint updatedEndpoint = NotificationEndpoint.builder()
56+
.webhookUrl("https://updated.com")
57+
.build();
58+
ClientSubscriptionRequest request = ClientSubscriptionRequest.builder()
59+
.notificationEndpoint(updatedEndpoint)
60+
.eventTypes(List.of(CUSTODIAL_RESULT))
5361
.build();
5462

55-
ClientSubscription subscription = mapper.mapEntityToResponse(clientSubscriptionEntity);
63+
ClientSubscriptionEntity entity = mapper.mapUpdateRequestToEntity(existing, request);
5664

57-
assertThat(subscription.getClientSubscriptionId()).isEqualTo(clientNotificationId);
65+
assertThat(entity.getId()).isEqualTo(clientSubscriptionId);
66+
assertThat(entity.getNotificationEndpoint()).isEqualTo("https://updated.com");
67+
assertThat(entity.getEventTypes().toString()).isEqualTo("[CUSTODIAL_RESULT]");
68+
assertThat(entity.getCreatedAt()).isEqualTo(createdAt);
69+
assertThat(entity.getUpdatedAt()).isAfter(updatedAt);
70+
}
71+
72+
@Test
73+
void entity_should_map_to_response() {
74+
ClientSubscription subscription = mapper.mapEntityToResponse(existing);
75+
76+
assertThat(subscription.getClientSubscriptionId()).isEqualTo(clientSubscriptionId);
5877
assertThat(subscription.getNotificationEndpoint()).isEqualTo(notificationEndpoint);
5978
assertThat(subscription.getEventTypes().toString()).isEqualTo("[CUSTODIAL_RESULT, PCR]");
6079
assertThat(subscription.getCreatedAt()).isEqualTo(createdAt);
6180
assertThat(subscription.getUpdatedAt()).isEqualTo(updatedAt);
6281
}
63-
}
82+
83+
private List<EntityEventType> mutableLisOfEventTypes() {
84+
List<EntityEventType> mutableList = new ArrayList<>();
85+
mutableList.add(EntityEventType.CUSTODIAL_RESULT);
86+
mutableList.add(EntityEventType.PCR);
87+
return mutableList;
88+
}
89+
}

src/test/java/uk/gov/hmcts/cp/subscription/services/SubscriptionServiceTest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import org.mockito.InjectMocks;
66
import org.mockito.Mock;
77
import org.mockito.junit.jupiter.MockitoExtension;
8+
import uk.gov.hmcts.cp.openapi.model.ClientSubscription;
9+
import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest;
810
import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity;
911
import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapper;
1012
import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapperImpl;
11-
import uk.gov.hmcts.cp.openapi.model.ClientSubscription;
12-
import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest;
1313
import uk.gov.hmcts.cp.subscription.repositories.SubscriptionRepository;
1414

1515
import java.util.UUID;
@@ -32,29 +32,33 @@ class SubscriptionServiceTest {
3232
ClientSubscriptionRequest request = ClientSubscriptionRequest.builder().build();
3333
ClientSubscriptionEntity requestEntity = ClientSubscriptionEntity.builder().build();
3434
ClientSubscriptionEntity savedEntity = ClientSubscriptionEntity.builder().build();
35+
ClientSubscriptionEntity updatedEntity = ClientSubscriptionEntity.builder().build();
3536
ClientSubscription response = ClientSubscription.builder().build();
3637
UUID subscriptionId = UUID.fromString("2ca16eb5-3998-4bb7-adce-4bb9b3b7223c");
3738

3839
@Test
39-
void request_should_save_entity() {
40-
when(mapper.mapRequestToEntity(request)).thenReturn(requestEntity);
40+
void save_request_should_save_new_entity() {
41+
when(mapper.mapCreateRequestToEntity(request)).thenReturn(requestEntity);
4142
when(subscriptionRepository.save(requestEntity)).thenReturn(savedEntity);
4243
when(mapper.mapEntityToResponse(savedEntity)).thenReturn(response);
4344

4445
ClientSubscription result = subscriptionService.saveSubscription(request);
4546

46-
verify(mapper).mapRequestToEntity(request);
47+
verify(mapper).mapCreateRequestToEntity(request);
4748
verify(subscriptionRepository).save(requestEntity);
4849
assertThat(result).isEqualTo(response);
4950
}
5051

5152
@Test
52-
void request_should_get_entity() {
53+
void update_request_should_update_existing_entity() {
5354
when(subscriptionRepository.getReferenceById(subscriptionId)).thenReturn(savedEntity);
54-
when(mapper.mapEntityToResponse(savedEntity)).thenReturn(response);
55+
when(mapper.mapUpdateRequestToEntity(savedEntity, request)).thenReturn(requestEntity);
56+
when(subscriptionRepository.save(requestEntity)).thenReturn(updatedEntity);
57+
when(mapper.mapEntityToResponse(updatedEntity)).thenReturn(response);
5558

56-
ClientSubscription result = subscriptionService.getSubscription(subscriptionId);
59+
ClientSubscription result = subscriptionService.updateSubscription(subscriptionId, request);
5760

61+
verify(subscriptionRepository).save(requestEntity);
5862
assertThat(result).isEqualTo(response);
5963
}
6064

0 commit comments

Comments
 (0)