Skip to content

Commit af960b6

Browse files
authored
Merge pull request #54 from companieshouse/feature/create-get-endpoint
LP-304 Implement GET Endpoint to retrieve submission resource
2 parents 117263e + 1051468 commit af960b6

File tree

8 files changed

+254
-8
lines changed

8 files changed

+254
-8
lines changed

src/main/java/uk/gov/companieshouse/limitedpartnershipsapi/controller/PartnershipController.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.beans.factory.annotation.Autowired;
77
import org.springframework.http.HttpStatus;
88
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.GetMapping;
910
import org.springframework.web.bind.annotation.PatchMapping;
1011
import org.springframework.web.bind.annotation.PathVariable;
1112
import org.springframework.web.bind.annotation.PostMapping;
@@ -15,6 +16,7 @@
1516
import org.springframework.web.bind.annotation.RequestMapping;
1617
import org.springframework.web.bind.annotation.RestController;
1718
import uk.gov.companieshouse.api.model.transaction.Transaction;
19+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ResourceNotFoundException;
1820
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
1921
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
2022
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionCreatedResponseDto;
@@ -29,15 +31,14 @@
2931
import static uk.gov.companieshouse.api.util.security.EricConstants.ERIC_IDENTITY;
3032
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.ERIC_REQUEST_ID_KEY;
3133
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.TRANSACTION_KEY;
34+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_GET_PARTNERSHIP;
3235
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_PARAM_SUBMISSION_ID;
3336
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_PARAM_TRANSACTION_ID;
3437

3538
@RestController
3639
@RequestMapping("/transactions/{" + URL_PARAM_TRANSACTION_ID + "}/limited-partnership/partnership")
3740
public class PartnershipController {
3841

39-
static final String URL_GET_PARTNERSHIP = "/transactions/%s/limited-partnership/partnership/%s";
40-
4142
private final LimitedPartnershipService limitedPartnershipService;
4243

4344
@Autowired
@@ -98,11 +99,30 @@ public ResponseEntity<Object> updatePartnership(
9899
}
99100
}
100101

102+
@GetMapping("/{" + URL_PARAM_SUBMISSION_ID + "}")
103+
public ResponseEntity<Object> getPartnership(
104+
@RequestAttribute(TRANSACTION_KEY) Transaction transaction,
105+
@PathVariable(URL_PARAM_SUBMISSION_ID) String submissionId,
106+
@RequestHeader(value = ERIC_REQUEST_ID_KEY) String requestId,
107+
@RequestHeader(value = ERIC_IDENTITY) String userId
108+
){
109+
var transactionId = transaction.getId();
110+
var logMap = new HashMap<String, Object>();
111+
logMap.put(URL_PARAM_TRANSACTION_ID, transactionId);
112+
113+
try {
114+
LimitedPartnershipSubmissionDto dto = limitedPartnershipService.getLimitedPartnership(transaction, submissionId);
115+
return ResponseEntity.ok().body(dto);
116+
} catch (ResourceNotFoundException e){
117+
ApiLogger.errorContext(requestId, e.getMessage(), e, logMap);
118+
return ResponseEntity.notFound().build();
119+
}
120+
}
121+
101122
private static Map<String, Object> extractData(Map<String, Object> body) throws JsonProcessingException {
102123
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
103124
var json = ow.writeValueAsString(body.get("data"));
104125

105126
return new ObjectMapper().readValue(json, Map.class);
106127
}
107-
108128
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package uk.gov.companieshouse.limitedpartnershipsapi.exception;
2+
3+
public class ResourceNotFoundException extends ServiceException{
4+
public ResourceNotFoundException(String message) {
5+
super(message);
6+
}
7+
}

src/main/java/uk/gov/companieshouse/limitedpartnershipsapi/service/LimitedPartnershipService.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import org.springframework.stereotype.Service;
55
import uk.gov.companieshouse.api.model.transaction.Resource;
66
import uk.gov.companieshouse.api.model.transaction.Transaction;
7+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ResourceNotFoundException;
78
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
89
import uk.gov.companieshouse.limitedpartnershipsapi.mapper.LimitedPartnershipMapper;
910
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
1011
import uk.gov.companieshouse.limitedpartnershipsapi.model.dao.LimitedPartnershipSubmissionDao;
1112
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
1213
import uk.gov.companieshouse.limitedpartnershipsapi.repository.LimitedPartnershipSubmissionsRepository;
1314
import uk.gov.companieshouse.limitedpartnershipsapi.utils.ApiLogger;
15+
import uk.gov.companieshouse.limitedpartnershipsapi.utils.TransactionUtils;
1416

1517
import java.time.LocalDateTime;
1618
import java.util.Collections;
@@ -19,22 +21,25 @@
1921

2022
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.FILING_KIND_LIMITED_PARTNERSHIP;
2123
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.LINK_SELF;
22-
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.SUBMISSION_URI_PATTERN;
24+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_GET_PARTNERSHIP;
2325

2426
@Service
2527
public class LimitedPartnershipService {
2628

2729
private final LimitedPartnershipMapper mapper;
2830
private final LimitedPartnershipSubmissionsRepository repository;
2931
private final TransactionService transactionService;
32+
private final TransactionUtils transactionUtils;
3033

3134
@Autowired
3235
public LimitedPartnershipService(LimitedPartnershipMapper mapper,
3336
LimitedPartnershipSubmissionsRepository repository,
34-
TransactionService transactionService) {
37+
TransactionService transactionService,
38+
TransactionUtils transactionUtils) {
3539
this.mapper = mapper;
3640
this.repository = repository;
3741
this.transactionService = transactionService;
42+
this.transactionUtils = transactionUtils;
3843
}
3944

4045
public String createLimitedPartnership(Transaction transaction,
@@ -106,7 +111,7 @@ private Resource createLimitedPartnershipTransactionResource(String submissionUr
106111
}
107112

108113
private String getSubmissionUri(String transactionId, String submissionId) {
109-
return String.format(SUBMISSION_URI_PATTERN, transactionId, submissionId);
114+
return String.format(URL_GET_PARTNERSHIP, transactionId, submissionId);
110115
}
111116

112117
private void updateTransactionWithLinksAndPartnershipName(Transaction transaction,
@@ -133,4 +138,16 @@ private void updateLimitedPartnershipSubmissionWithSelfLink(LimitedPartnershipSu
133138
submission.setLinks(Collections.singletonMap(LINK_SELF, submissionUri));
134139
repository.save(submission);
135140
}
141+
142+
public LimitedPartnershipSubmissionDto getLimitedPartnership(Transaction transaction, String submissionId) throws ResourceNotFoundException{
143+
String submissionUri = getSubmissionUri(transaction.getId(), submissionId);
144+
if (!transactionUtils.isTransactionLinkedToLimitedPartnershipSubmission(transaction, submissionUri)) {
145+
throw new ResourceNotFoundException(String.format(
146+
"Transaction id: %s does not have a resource that matches submission id: %s", transaction.getId(), submissionId));
147+
}
148+
149+
var submission = repository.findById(submissionId);
150+
LimitedPartnershipSubmissionDao submissionDao = submission.orElseThrow(() -> new ResourceNotFoundException(String.format("Submission with id %s not found", submissionId)));
151+
return mapper.daoToDto(submissionDao);
152+
}
136153
}

src/main/java/uk/gov/companieshouse/limitedpartnershipsapi/utils/Constants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ private Constants() {
1717
// URIs
1818
public static final String TRANSACTIONS_PRIVATE_API_URI_PREFIX = "/private/transactions/";
1919
public static final String SUBMISSION_URI_PATTERN = "/transactions/%s/limited-partnership/%s";
20+
public static final String URL_GET_PARTNERSHIP = "/transactions/%s/limited-partnership/partnership/%s";
2021

2122
// Filings
2223
public static final String FILING_KIND_LIMITED_PARTNERSHIP = "limited-partnership";
2324

2425
public static final String LINK_SELF = "self";
26+
public static final String LINK_RESOURCE = "resource";
2527
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package uk.gov.companieshouse.limitedpartnershipsapi.utils;
2+
3+
import org.apache.commons.lang.StringUtils;
4+
import org.springframework.stereotype.Component;
5+
import uk.gov.companieshouse.api.model.transaction.Transaction;
6+
7+
import java.util.Objects;
8+
9+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.FILING_KIND_LIMITED_PARTNERSHIP;
10+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.LINK_RESOURCE;
11+
12+
@Component
13+
public class TransactionUtils {
14+
15+
public boolean isTransactionLinkedToLimitedPartnershipSubmission(Transaction transaction, String limitedPartnershipSubmissionSelfLink) {
16+
if (StringUtils.isBlank(limitedPartnershipSubmissionSelfLink)) {
17+
return false;
18+
}
19+
20+
if (Objects.isNull(transaction) || Objects.isNull(transaction.getResources())) {
21+
return false;
22+
}
23+
24+
return transaction.getResources().entrySet().stream()
25+
.filter(resource -> FILING_KIND_LIMITED_PARTNERSHIP.equals(resource.getValue().getKind()))
26+
.anyMatch(resource -> limitedPartnershipSubmissionSelfLink.equals(resource.getValue().getLinks().get(LINK_RESOURCE)));
27+
}
28+
}

src/test/java/uk/gov/companieshouse/limitedpartnershipsapi/controller/PartnershipControllerTest.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.http.HttpHeaders;
1111
import org.springframework.http.HttpStatus;
1212
import uk.gov.companieshouse.api.model.transaction.Transaction;
13+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ResourceNotFoundException;
1314
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
1415
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
1516
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.DataDto;
@@ -25,7 +26,7 @@
2526
import static org.mockito.ArgumentMatchers.eq;
2627
import static org.mockito.Mockito.doThrow;
2728
import static org.mockito.Mockito.when;
28-
import static uk.gov.companieshouse.limitedpartnershipsapi.controller.PartnershipController.URL_GET_PARTNERSHIP;
29+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_GET_PARTNERSHIP;
2930

3031
@ExtendWith(MockitoExtension.class)
3132
class PartnershipControllerTest {
@@ -141,4 +142,45 @@ void testUpdatePartnershipInternalServerError() throws ServiceException, JsonPro
141142

142143
assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), response.getStatusCode().value());
143144
}
145+
146+
@Test
147+
void testGetPartnership() throws ResourceNotFoundException {
148+
// given
149+
LimitedPartnershipSubmissionDto dto = createDto();
150+
when(transaction.getId()).thenReturn(TRANSACTION_ID);
151+
when(limitedPartnershipService.getLimitedPartnership(transaction, SUBMISSION_ID)).thenReturn(dto);
152+
153+
// when
154+
var response = partnershipController.getPartnership(
155+
transaction,
156+
SUBMISSION_ID,
157+
REQUEST_ID,
158+
USER_ID);
159+
160+
// then
161+
assertEquals(HttpStatus.OK.value(), response.getStatusCode().value());
162+
assertEquals(dto, response.getBody());
163+
}
164+
165+
@Test
166+
void testGetPartnershipReturnsStatusNotFound() throws ResourceNotFoundException {
167+
// given
168+
when(transaction.getId()).thenReturn(TRANSACTION_ID);
169+
when(limitedPartnershipService.getLimitedPartnership(transaction, SUBMISSION_ID)).thenThrow(new ResourceNotFoundException("error"));
170+
171+
// when
172+
var response = partnershipController.getPartnership(
173+
transaction,
174+
SUBMISSION_ID,
175+
REQUEST_ID,
176+
USER_ID);
177+
178+
// then
179+
assertEquals(HttpStatus.NOT_FOUND.value(), response.getStatusCode().value());
180+
assertEquals(null, response.getBody());
181+
}
182+
183+
private LimitedPartnershipSubmissionDto createDto() {
184+
return new LimitedPartnershipSubmissionDto();
185+
}
144186
}

src/test/java/uk/gov/companieshouse/limitedpartnershipsapi/service/LimitedPartnershipServiceTest.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.mockito.junit.jupiter.MockitoExtension;
1010
import uk.gov.companieshouse.api.model.transaction.Resource;
1111
import uk.gov.companieshouse.api.model.transaction.Transaction;
12+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ResourceNotFoundException;
1213
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
1314
import uk.gov.companieshouse.limitedpartnershipsapi.mapper.LimitedPartnershipMapper;
1415
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
@@ -18,6 +19,7 @@
1819
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.DataDto;
1920
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
2021
import uk.gov.companieshouse.limitedpartnershipsapi.repository.LimitedPartnershipSubmissionsRepository;
22+
import uk.gov.companieshouse.limitedpartnershipsapi.utils.TransactionUtils;
2123

2224
import java.util.HashMap;
2325
import java.util.Map;
@@ -27,10 +29,12 @@
2729
import static org.junit.jupiter.api.Assertions.assertNull;
2830
import static org.junit.jupiter.api.Assertions.assertThrows;
2931
import static org.mockito.ArgumentMatchers.any;
32+
import static org.mockito.ArgumentMatchers.eq;
3033
import static org.mockito.Mockito.times;
3134
import static org.mockito.Mockito.verify;
3235
import static org.mockito.Mockito.when;
3336
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.FILING_KIND_LIMITED_PARTNERSHIP;
37+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_GET_PARTNERSHIP;
3438

3539
@ExtendWith(MockitoExtension.class)
3640
class LimitedPartnershipServiceTest {
@@ -53,6 +57,9 @@ class LimitedPartnershipServiceTest {
5357
@Mock
5458
private TransactionService transactionService;
5559

60+
@Mock
61+
private TransactionUtils transactionUtils;
62+
5663
@Captor
5764
private ArgumentCaptor<Transaction> transactionApiCaptor;
5865

@@ -84,7 +91,7 @@ void givenDto_whenCreateLP_thenLPCreatedWithSubmissionIdAndTransactionUpdated()
8491
Transaction sentTransaction = transactionApiCaptor.getValue();
8592
assertEquals(limitedPartnershipSubmissionDto.getData().getPartnershipName(), sentTransaction.getCompanyName());
8693
assertNull(sentTransaction.getCompanyNumber());
87-
String submissionUri = String.format("/transactions/%s/limited-partnership/%s", transaction.getId(), limitedPartnershipSubmissionDao.getId());
94+
String submissionUri = String.format(URL_GET_PARTNERSHIP, transaction.getId(), limitedPartnershipSubmissionDao.getId());
8895
assertEquals(submissionUri, sentTransaction.getResources().get(submissionUri).getLinks().get("resource"));
8996
// assert dao submission self link is correct
9097
LimitedPartnershipSubmissionDao sentSubmission = submissionCaptor.getValue();
@@ -142,6 +149,47 @@ void givenWrongSubmissionId_whenUpdateLP_thenServiceExceptionThrown() throws Ser
142149
assertThrows(ServiceException.class, () -> service.updateLimitedPartnership("wrong-id", DataType.EMAIL, data));
143150
}
144151

152+
@Test
153+
void giveSubmissionId_whenGetLp_ThenLPRetrieved() throws ResourceNotFoundException {
154+
// given
155+
LimitedPartnershipSubmissionDto limitedPartnershipSubmissionDto = createDto();
156+
LimitedPartnershipSubmissionDao limitedPartnershipSubmissionDao = createDao();
157+
Transaction transaction = buildTransaction();
158+
159+
when(transactionUtils.isTransactionLinkedToLimitedPartnershipSubmission(eq(transaction), any(String.class))).thenReturn(true);
160+
when(repository.findById(limitedPartnershipSubmissionDao.getId())).thenReturn(Optional.of(limitedPartnershipSubmissionDao));
161+
when(mapper.daoToDto(limitedPartnershipSubmissionDao)).thenReturn(limitedPartnershipSubmissionDto);
162+
163+
// when
164+
LimitedPartnershipSubmissionDto retrievedDto = service.getLimitedPartnership(transaction, SUBMISSION_ID);
165+
166+
// then
167+
verify(repository, times(1)).findById(limitedPartnershipSubmissionDao.getId());
168+
verify(mapper, times(1)).daoToDto(limitedPartnershipSubmissionDao);
169+
assertEquals(limitedPartnershipSubmissionDto.getData(), retrievedDto.getData());
170+
}
171+
172+
@Test
173+
void giveInvalidSubmissionId_whenGetLp_ThenResourceNotFoundExceptionThrown() throws ResourceNotFoundException {
174+
// given
175+
Transaction transaction = buildTransaction();
176+
when(transactionUtils.isTransactionLinkedToLimitedPartnershipSubmission(eq(transaction), any(String.class))).thenReturn(true);
177+
when(repository.findById("wrong-id")).thenReturn(Optional.empty());
178+
179+
// when + then
180+
assertThrows(ResourceNotFoundException.class, () -> service.getLimitedPartnership(transaction, "wrong-id"));
181+
}
182+
183+
@Test
184+
void giveSubmissionIdAndTransactionIdDoNotMatch_whenGetLp_ThenResourceNotFoundExceptionThrown() throws ResourceNotFoundException {
185+
// given
186+
Transaction transaction = buildTransaction();
187+
when(transactionUtils.isTransactionLinkedToLimitedPartnershipSubmission(eq(transaction), any(String.class))).thenReturn(false);
188+
189+
// when + then
190+
assertThrows(ResourceNotFoundException.class, () -> service.getLimitedPartnership(transaction, SUBMISSION_ID));
191+
}
192+
145193
private Transaction buildTransaction() {
146194
Transaction transaction = new Transaction();
147195
transaction.setId(TRANSACTION_ID);

0 commit comments

Comments
 (0)