Skip to content

Commit 9c07c0e

Browse files
authored
Merge pull request #44 from companieshouse/lp-225-update-transaction
LP-225 Update transaction with LP details
2 parents e171014 + 5f91033 commit 9c07c0e

File tree

8 files changed

+308
-14
lines changed

8 files changed

+308
-14
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ public ResponseEntity<Object> createPartnership(
4848
logMap.put(URL_PARAM_TRANSACTION_ID, transactionId);
4949

5050
try {
51-
ApiLogger.infoContext(requestId, "Calling service to create Partnership Submission", logMap);
51+
ApiLogger.infoContext(requestId, "Calling service to create a Limited Partnership Submission", logMap);
5252

53-
var submissionId = limitedPartnershipService.createLimitedPartnership(limitedPartnershipSubmissionDto, requestId, userId);
53+
var submissionId = limitedPartnershipService.createLimitedPartnership(transaction, limitedPartnershipSubmissionDto, requestId, userId);
5454

5555
var location = URI.create(String.format(URL_GET_PARTNERSHIP, transactionId, submissionId));
5656
var response = new LimitedPartnershipSubmissionCreatedResponseDto(submissionId);
5757

5858
return ResponseEntity.created(location).body(response);
5959
} catch (Exception e) {
60-
ApiLogger.errorContext(requestId, "Error Creating Limited Partnership Submission", e, logMap);
60+
ApiLogger.errorContext(requestId, "Error creating Limited Partnership submission", e, logMap);
6161
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
6262
}
6363
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package uk.gov.companieshouse.limitedpartnershipsapi.exception;
2+
3+
public class ServiceException extends Exception {
4+
public ServiceException(String message, Throwable cause) {
5+
super(message, cause);
6+
}
7+
8+
public ServiceException(String message) {
9+
super(message);
10+
}
11+
}

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

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,104 @@
22

33
import org.springframework.beans.factory.annotation.Autowired;
44
import org.springframework.stereotype.Service;
5+
import uk.gov.companieshouse.api.model.transaction.Resource;
6+
import uk.gov.companieshouse.api.model.transaction.Transaction;
7+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
58
import uk.gov.companieshouse.limitedpartnershipsapi.mapper.LimitedPartnershipMapper;
69
import uk.gov.companieshouse.limitedpartnershipsapi.model.dao.LimitedPartnershipSubmissionDao;
710
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
811
import uk.gov.companieshouse.limitedpartnershipsapi.repository.LimitedPartnershipSubmissionsRepository;
912
import uk.gov.companieshouse.limitedpartnershipsapi.utils.ApiLogger;
1013

1114
import java.time.LocalDateTime;
15+
import java.util.Collections;
16+
import java.util.HashMap;
17+
import java.util.Map;
18+
19+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.FILING_KIND_LIMITED_PARTNERSHIP;
20+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.SUBMISSION_URI_PATTERN;
1221

1322
@Service
1423
public class LimitedPartnershipService {
1524

1625
private final LimitedPartnershipMapper mapper;
1726
private final LimitedPartnershipSubmissionsRepository repository;
27+
private final TransactionService transactionService;
1828

1929
@Autowired
20-
public LimitedPartnershipService(LimitedPartnershipMapper mapper, LimitedPartnershipSubmissionsRepository repository) {
30+
public LimitedPartnershipService(LimitedPartnershipMapper mapper,
31+
LimitedPartnershipSubmissionsRepository repository,
32+
TransactionService transactionService) {
2133
this.mapper = mapper;
2234
this.repository = repository;
35+
this.transactionService = transactionService;
2336
}
2437

25-
public String createLimitedPartnership(LimitedPartnershipSubmissionDto limitedPartnershipSubmissionDto, String requestId, String userId) {
38+
public String createLimitedPartnership(Transaction transaction,
39+
LimitedPartnershipSubmissionDto limitedPartnershipSubmissionDto,
40+
String requestId,
41+
String userId) throws ServiceException {
2642
ApiLogger.debug("Called createLimitedPartnership(...)");
2743

44+
if (hasExistingLimitedPartnershipSubmission(transaction)) {
45+
throw new ServiceException(String.format(
46+
"The transaction with id %s already has a Limited Partnership submission associated with it", transaction.getId()));
47+
}
48+
2849
LimitedPartnershipSubmissionDao dao = mapper.dtoToDao(limitedPartnershipSubmissionDto);
2950
dao.setCreatedAt(LocalDateTime.now());
3051
dao.setUserId(userId);
3152
LimitedPartnershipSubmissionDao insertedSubmission = repository.insert(dao);
32-
ApiLogger.infoContext(requestId, String.format("Limited Partnership Submission created with limited-partnership submission id: %s", insertedSubmission.getId()));
53+
54+
final String submissionUri = getSubmissionUri(transaction.getId(), insertedSubmission.getId());
55+
56+
// Create the Resource to be added to the Transaction (includes various links to the resource)
57+
var limitedPartnershipResource = createLimitedPartnershipTransactionResource(submissionUri);
58+
59+
// Update company name set on the transaction and add a link to the newly created Limited Partnership
60+
// submission (aka resource) to the transaction
61+
updateTransactionWithLinksAndPartnershipName(transaction, limitedPartnershipSubmissionDto,
62+
submissionUri, limitedPartnershipResource, requestId);
63+
64+
ApiLogger.infoContext(requestId, String.format("Limited Partnership submission created with id: %s", insertedSubmission.getId()));
3365

3466
return insertedSubmission.getId();
3567
}
68+
69+
private Resource createLimitedPartnershipTransactionResource(String submissionUri) {
70+
var limitedPartnershipResource = new Resource();
71+
72+
Map<String, String> linksMap = new HashMap<>();
73+
linksMap.put("resource", submissionUri);
74+
75+
// TODO Add 'validation status' and 'cost' links here later
76+
77+
limitedPartnershipResource.setLinks(linksMap);
78+
limitedPartnershipResource.setKind(FILING_KIND_LIMITED_PARTNERSHIP);
79+
80+
return limitedPartnershipResource;
81+
}
82+
83+
private String getSubmissionUri(String transactionId, String submissionId) {
84+
return String.format(SUBMISSION_URI_PATTERN, transactionId, submissionId);
85+
}
86+
87+
private void updateTransactionWithLinksAndPartnershipName(Transaction transaction,
88+
LimitedPartnershipSubmissionDto limitedPartnershipSubmissionDto,
89+
String submissionUri,
90+
Resource limitedPartnershipResource,
91+
String loggingContext) throws ServiceException {
92+
transaction.setCompanyName(limitedPartnershipSubmissionDto.getData().getPartnershipName());
93+
transaction.setResources(Collections.singletonMap(submissionUri, limitedPartnershipResource));
94+
95+
transactionService.updateTransaction(transaction, loggingContext);
96+
}
97+
98+
private boolean hasExistingLimitedPartnershipSubmission(Transaction transaction) {
99+
if (transaction.getResources() != null) {
100+
return transaction.getResources().entrySet().stream().anyMatch(
101+
resourceEntry -> FILING_KIND_LIMITED_PARTNERSHIP.equals(resourceEntry.getValue().getKind()));
102+
}
103+
return false;
104+
}
36105
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package uk.gov.companieshouse.limitedpartnershipsapi.service;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.http.HttpStatus;
5+
import org.springframework.stereotype.Service;
6+
import uk.gov.companieshouse.api.handler.exception.URIValidationException;
7+
import uk.gov.companieshouse.api.model.transaction.Transaction;
8+
import uk.gov.companieshouse.api.sdk.ApiClientService;
9+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
10+
import uk.gov.companieshouse.limitedpartnershipsapi.utils.ApiLogger;
11+
12+
import java.io.IOException;
13+
14+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.TRANSACTIONS_PRIVATE_API_URI_PREFIX;
15+
16+
@Service
17+
public class TransactionService {
18+
19+
@Autowired
20+
private final ApiClientService apiClientService;
21+
22+
@Autowired
23+
public TransactionService(ApiClientService apiClientService) {
24+
this.apiClientService = apiClientService;
25+
}
26+
27+
public void updateTransaction(Transaction transaction, String loggingContext) throws ServiceException {
28+
try {
29+
var uri = TRANSACTIONS_PRIVATE_API_URI_PREFIX + transaction.getId();
30+
31+
// The internal API key client is used here as the transaction service will potentially call back into the
32+
// LP API (e.g. to get the costs, if a costs end-point has already been set on the transaction) and those
33+
// calls cannot be made with a user OAuth token
34+
var response = apiClientService.getInternalApiClient()
35+
.privateTransaction().patch(uri, transaction).execute();
36+
37+
if (response.getStatusCode() != HttpStatus.NO_CONTENT.value()) {
38+
throw new IOException("Invalid status code received from the Transactions API: " + response.getStatusCode());
39+
}
40+
} catch (IOException | URIValidationException e) {
41+
var message = "Error Updating transaction " + transaction.getId();
42+
ApiLogger.errorContext(loggingContext, message, e);
43+
throw new ServiceException(message, e);
44+
}
45+
}
46+
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
public class Constants {
44

5-
private Constants() { }
5+
private Constants() {
6+
}
67

78
// Request header names
89
public static final String ERIC_REQUEST_ID_KEY = "X-Request-Id";
@@ -11,4 +12,11 @@ private Constants() { }
1112
public static final String URL_PARAM_TRANSACTION_ID = "transactionId";
1213

1314
public static final String TRANSACTION_KEY = "transaction";
15+
16+
// URIs
17+
public static final String TRANSACTIONS_PRIVATE_API_URI_PREFIX = "/private/transactions/";
18+
public static final String SUBMISSION_URI_PATTERN = "/transactions/%s/limited-partnership/%s";
19+
20+
// Filings
21+
public static final String FILING_KIND_LIMITED_PARTNERSHIP = "limited-partnership";
1422
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.http.HttpHeaders;
1010
import org.springframework.http.HttpStatus;
1111
import uk.gov.companieshouse.api.model.transaction.Transaction;
12+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
1213
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.DataDto;
1314
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionCreatedResponseDto;
1415
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
@@ -49,8 +50,9 @@ void init() {
4950
}
5051

5152
@Test
52-
void testCreatePartnership() {
53+
void testCreatePartnership() throws ServiceException {
5354
when(limitedPartnershipService.createLimitedPartnership(
55+
any(Transaction.class),
5456
any(LimitedPartnershipSubmissionDto.class),
5557
eq(REQUEST_ID),
5658
eq(USER_ID)))
@@ -75,8 +77,9 @@ void testCreatePartnership() {
7577
}
7678

7779
@Test
78-
void testCreatePartnershipInternalServerError() {
80+
void testCreatePartnershipInternalServerError() throws ServiceException {
7981
when(limitedPartnershipService.createLimitedPartnership(
82+
any(Transaction.class),
8083
any(LimitedPartnershipSubmissionDto.class),
8184
eq(REQUEST_ID),
8285
eq(USER_ID)))

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

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,40 @@
22

33
import org.junit.jupiter.api.Test;
44
import org.junit.jupiter.api.extension.ExtendWith;
5+
import org.mockito.ArgumentCaptor;
6+
import org.mockito.Captor;
57
import org.mockito.InjectMocks;
68
import org.mockito.Mock;
79
import org.mockito.junit.jupiter.MockitoExtension;
10+
import uk.gov.companieshouse.api.model.transaction.Resource;
11+
import uk.gov.companieshouse.api.model.transaction.Transaction;
12+
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
813
import uk.gov.companieshouse.limitedpartnershipsapi.mapper.LimitedPartnershipMapper;
14+
import uk.gov.companieshouse.limitedpartnershipsapi.model.PartnershipNameEnding;
915
import uk.gov.companieshouse.limitedpartnershipsapi.model.dao.LimitedPartnershipSubmissionDao;
16+
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.DataDto;
1017
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
1118
import uk.gov.companieshouse.limitedpartnershipsapi.repository.LimitedPartnershipSubmissionsRepository;
1219

20+
import java.util.HashMap;
21+
import java.util.Map;
22+
1323
import static org.junit.jupiter.api.Assertions.assertEquals;
14-
import static org.mockito.Mockito.*;
24+
import static org.junit.jupiter.api.Assertions.assertNull;
25+
import static org.junit.jupiter.api.Assertions.assertThrows;
26+
import static org.mockito.ArgumentMatchers.any;
27+
import static org.mockito.Mockito.times;
28+
import static org.mockito.Mockito.verify;
29+
import static org.mockito.Mockito.when;
30+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.FILING_KIND_LIMITED_PARTNERSHIP;
1531

1632
@ExtendWith(MockitoExtension.class)
1733
public class LimitedPartnershipServiceTest {
1834

1935
private static final String USER_ID = "xbJf0l";
2036
private static final String SUBMISSION_ID = "abc-123";
2137
private static final String REQUEST_ID = "fd4gld5h3jhh";
38+
private static final String TRANSACTION_ID = "12321123";
2239

2340
@InjectMocks
2441
private LimitedPartnershipService service;
@@ -29,22 +46,60 @@ public class LimitedPartnershipServiceTest {
2946
@Mock
3047
private LimitedPartnershipSubmissionsRepository repository;
3148

49+
@Mock
50+
private TransactionService transactionService;
51+
52+
@Captor
53+
private ArgumentCaptor<Transaction> transactionApiCaptor;
54+
3255
@Test
33-
public void givenDto_whenCreateLP_thenLPCreatedWithSubmissionId() {
56+
void givenDto_whenCreateLP_thenLPCreatedWithSubmissionIdAndTransactionUpdated() throws ServiceException {
3457
// given
3558
LimitedPartnershipSubmissionDto limitedPartnershipSubmissionDto = createDto();
3659
LimitedPartnershipSubmissionDao limitedPartnershipSubmissionDao = createDao();
3760

3861
when(mapper.dtoToDao(limitedPartnershipSubmissionDto)).thenReturn(limitedPartnershipSubmissionDao);
3962
when(repository.insert(limitedPartnershipSubmissionDao)).thenReturn(limitedPartnershipSubmissionDao);
4063

64+
Transaction transaction = buildTransaction();
65+
4166
// when
42-
String submissionId = service.createLimitedPartnership(limitedPartnershipSubmissionDto, REQUEST_ID, USER_ID);
67+
String submissionId = service.createLimitedPartnership(transaction, limitedPartnershipSubmissionDto, REQUEST_ID, USER_ID);
4368

44-
//then
69+
// then
4570
verify(mapper, times(1)).dtoToDao(limitedPartnershipSubmissionDto);
4671
verify(repository, times(1)).insert(limitedPartnershipSubmissionDao);
72+
verify(transactionService, times(1)).updateTransaction(transactionApiCaptor.capture(), any());
4773
assertEquals(SUBMISSION_ID, submissionId);
74+
75+
// assert transaction resources are updated appropriately
76+
Transaction sentTransaction = transactionApiCaptor.getValue();
77+
assertEquals(limitedPartnershipSubmissionDto.getData().getPartnershipName(), sentTransaction.getCompanyName());
78+
assertNull(sentTransaction.getCompanyNumber());
79+
String submissionUri = String.format("/transactions/%s/limited-partnership/%s", transaction.getId(), limitedPartnershipSubmissionDao.getId());
80+
assertEquals(submissionUri, sentTransaction.getResources().get(submissionUri).getLinks().get("resource"));
81+
}
82+
83+
@Test
84+
void givenTransactionAlreadyAssociatedWithAnLP_whenCreateLP_thenServiceExceptionThrown() throws ServiceException {
85+
// given
86+
LimitedPartnershipSubmissionDto limitedPartnershipSubmissionDto = createDto();
87+
88+
Transaction transaction = buildTransaction();
89+
Resource resource = new Resource();
90+
resource.setKind(FILING_KIND_LIMITED_PARTNERSHIP);
91+
Map<String, Resource> resourceMap = new HashMap<>();
92+
resourceMap.put(String.format("/transactions/%s/limited-partnership/%s", TRANSACTION_ID, SUBMISSION_ID), resource);
93+
transaction.setResources(resourceMap);
94+
95+
// when + then
96+
assertThrows(ServiceException.class, () -> service.createLimitedPartnership(transaction, limitedPartnershipSubmissionDto, REQUEST_ID, USER_ID));
97+
}
98+
99+
private Transaction buildTransaction() {
100+
Transaction transaction = new Transaction();
101+
transaction.setId(TRANSACTION_ID);
102+
return transaction;
48103
}
49104

50105
private LimitedPartnershipSubmissionDao createDao() {
@@ -54,6 +109,12 @@ private LimitedPartnershipSubmissionDao createDao() {
54109
}
55110

56111
private LimitedPartnershipSubmissionDto createDto() {
57-
return new LimitedPartnershipSubmissionDto();
112+
var submissionDto = new LimitedPartnershipSubmissionDto();
113+
var dataDto = new DataDto();
114+
dataDto.setPartnershipName("Asset Strippers");
115+
dataDto.setNameEnding(PartnershipNameEnding.LP);
116+
submissionDto.setData(dataDto);
117+
118+
return submissionDto;
58119
}
59120
}

0 commit comments

Comments
 (0)