Skip to content

Commit 16417da

Browse files
authored
Merge pull request #50 from companieshouse/feature/lp-284-patch-email
Feature/lp 284 patch email
2 parents 78d64d9 + c6b1c23 commit 16417da

File tree

10 files changed

+251
-1
lines changed

10 files changed

+251
-1
lines changed

spec/schema.json

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,50 @@
5656
}
5757
}
5858
},
59+
"/transactions/{transactionId}/limited-partnership/partnership/{submissionId}": {
60+
"patch": {
61+
"tags": [
62+
"Limited Partnerships"
63+
],
64+
"summary": "Update a Limited Partnership submission",
65+
"parameters": [
66+
{
67+
"name": "transactionId",
68+
"in": "path",
69+
"required": true,
70+
"type": "string"
71+
},
72+
{
73+
"name": "submissionId",
74+
"in": "path",
75+
"required": true,
76+
"type": "string"
77+
},
78+
{
79+
"name": "body",
80+
"in": "body",
81+
"required": true,
82+
"schema": {
83+
"$ref": "#/definitions/LimitedPartnershipSubmissionUpdate"
84+
}
85+
}
86+
],
87+
"responses": {
88+
"200": {
89+
"description": "Limited Partnership Submission has been successfully updated."
90+
},
91+
"400": {
92+
"description": "Bad Request"
93+
},
94+
"401": {
95+
"description": "Unauthorised"
96+
},
97+
"500": {
98+
"description": "Internal Server Error"
99+
}
100+
}
101+
}
102+
},
59103
"/limited-partnership/healthcheck": {
60104
"get": {
61105
"summary": "Health check URL returns 200 if service is running",
@@ -86,6 +130,21 @@
86130
}
87131
}
88132
},
133+
"LimitedPartnershipSubmissionUpdate": {
134+
"type": "object",
135+
"required": [
136+
"type",
137+
"data"
138+
],
139+
"properties": {
140+
"type": {
141+
"type": "string"
142+
},
143+
"data": {
144+
"type": "object"
145+
}
146+
}
147+
},
89148
"Data": {
90149
"type": "object",
91150
"properties": {

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package uk.gov.companieshouse.limitedpartnershipsapi.controller;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.ObjectWriter;
36
import org.springframework.beans.factory.annotation.Autowired;
47
import org.springframework.http.HttpStatus;
58
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.PatchMapping;
10+
import org.springframework.web.bind.annotation.PathVariable;
611
import org.springframework.web.bind.annotation.PostMapping;
712
import org.springframework.web.bind.annotation.RequestAttribute;
813
import org.springframework.web.bind.annotation.RequestBody;
@@ -11,17 +16,20 @@
1116
import org.springframework.web.bind.annotation.RestController;
1217
import uk.gov.companieshouse.api.model.transaction.Transaction;
1318
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
19+
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
1420
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionCreatedResponseDto;
1521
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
1622
import uk.gov.companieshouse.limitedpartnershipsapi.service.LimitedPartnershipService;
1723
import uk.gov.companieshouse.limitedpartnershipsapi.utils.ApiLogger;
1824

1925
import java.net.URI;
2026
import java.util.HashMap;
27+
import java.util.Map;
2128

2229
import static uk.gov.companieshouse.api.util.security.EricConstants.ERIC_IDENTITY;
2330
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.ERIC_REQUEST_ID_KEY;
2431
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.TRANSACTION_KEY;
32+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_PARAM_SUBMISSION_ID;
2533
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.URL_PARAM_TRANSACTION_ID;
2634

2735
@RestController
@@ -62,4 +70,39 @@ public ResponseEntity<Object> createPartnership(
6270
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
6371
}
6472
}
73+
74+
@PatchMapping("/{" + URL_PARAM_SUBMISSION_ID + "}")
75+
public ResponseEntity<Object> updatePartnership(
76+
@RequestAttribute(TRANSACTION_KEY) Transaction transaction,
77+
@PathVariable(URL_PARAM_SUBMISSION_ID) String submissionId,
78+
@RequestBody Map<String, Object> body,
79+
@RequestHeader(value = ERIC_REQUEST_ID_KEY) String requestId,
80+
@RequestHeader(value = ERIC_IDENTITY) String userId
81+
) {
82+
83+
String transactionId = transaction.getId();
84+
HashMap<String, Object> logMap = new HashMap<>();
85+
logMap.put(URL_PARAM_TRANSACTION_ID, transactionId);
86+
87+
try {
88+
String type = (String) body.get("type");
89+
var dataType = DataType.valueOf(type.toUpperCase());
90+
final Map<String, Object> data = extractData(body);
91+
92+
limitedPartnershipService.updateLimitedPartnership(submissionId, dataType, data);
93+
94+
return new ResponseEntity<>(HttpStatus.OK);
95+
} catch (JsonProcessingException | ServiceException e) {
96+
ApiLogger.errorContext(requestId, "Error updating Limited Partnership submission", e, logMap);
97+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
98+
}
99+
}
100+
101+
private static Map<String, Object> extractData(Map<String, Object> body) throws JsonProcessingException {
102+
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
103+
var json = ow.writeValueAsString(body.get("data"));
104+
105+
return new ObjectMapper().readValue(json, Map.class);
106+
}
107+
65108
}

src/main/java/uk/gov/companieshouse/limitedpartnershipsapi/mapper/LimitedPartnershipMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public interface LimitedPartnershipMapper {
1515

1616
LimitedPartnershipSubmissionDao dtoToDao(LimitedPartnershipSubmissionDto dto);
1717

18+
LimitedPartnershipSubmissionDto daoToDto(LimitedPartnershipSubmissionDao dao);
19+
1820
default String mapPartnershipNameEndingToString(PartnershipNameEnding nameEnding){
1921
return nameEnding.getDescription();
2022
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package uk.gov.companieshouse.limitedpartnershipsapi.model;
2+
3+
public enum DataType {
4+
EMAIL("email");
5+
6+
private final String description;
7+
8+
DataType(String description) {
9+
this.description = description;
10+
}
11+
12+
public String getDescription() {
13+
return description;
14+
}
15+
16+
}

src/main/java/uk/gov/companieshouse/limitedpartnershipsapi/model/dao/DataDao.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ public class DataDao {
1010
@Field("name_ending")
1111
private String nameEnding;
1212

13+
@Field("registered_email_address")
14+
private String email;
15+
1316
public String getPartnershipName() {
1417
return partnershipName;
1518
}
@@ -25,4 +28,12 @@ public String getNameEnding() {
2528
public void setNameEnding(String nameEnding) {
2629
this.nameEnding = nameEnding;
2730
}
31+
32+
public String getEmail() {
33+
return email;
34+
}
35+
36+
public void setEmail(String email) {
37+
this.email = email;
38+
}
2839
}

src/main/java/uk/gov/companieshouse/limitedpartnershipsapi/model/dto/DataDto.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ public class DataDto {
1515
@JsonProperty("name_ending")
1616
private PartnershipNameEnding nameEnding;
1717

18+
@JsonProperty("email")
19+
private String email;
20+
1821
public String getPartnershipName() {
1922
return partnershipName;
2023
}
@@ -30,4 +33,12 @@ public PartnershipNameEnding getNameEnding() {
3033
public void setNameEnding(PartnershipNameEnding nameEnding) {
3134
this.nameEnding = nameEnding;
3235
}
36+
37+
public String getEmail() {
38+
return email;
39+
}
40+
41+
public void setEmail(String email) {
42+
this.email = email;
43+
}
3344
}

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import uk.gov.companieshouse.api.model.transaction.Transaction;
77
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
88
import uk.gov.companieshouse.limitedpartnershipsapi.mapper.LimitedPartnershipMapper;
9+
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
910
import uk.gov.companieshouse.limitedpartnershipsapi.model.dao.LimitedPartnershipSubmissionDao;
1011
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
1112
import uk.gov.companieshouse.limitedpartnershipsapi.repository.LimitedPartnershipSubmissionsRepository;
@@ -17,8 +18,8 @@
1718
import java.util.Map;
1819

1920
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.FILING_KIND_LIMITED_PARTNERSHIP;
20-
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.SUBMISSION_URI_PATTERN;
2121
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.LINK_SELF;
22+
import static uk.gov.companieshouse.limitedpartnershipsapi.utils.Constants.SUBMISSION_URI_PATTERN;
2223

2324
@Service
2425
public class LimitedPartnershipService {
@@ -69,6 +70,27 @@ public String createLimitedPartnership(Transaction transaction,
6970
return insertedSubmission.getId();
7071
}
7172

73+
public void updateLimitedPartnership(String submissionId,
74+
DataType type,
75+
Map<String, Object> data) throws ServiceException {
76+
77+
var limitedPartnershipSubmissionDao = repository.findById(submissionId);
78+
79+
if (limitedPartnershipSubmissionDao.isEmpty()) {
80+
throw new ServiceException(String.format(
81+
"Submission with id %s not found", submissionId));
82+
}
83+
84+
if (type == DataType.EMAIL) {
85+
var dataDao = limitedPartnershipSubmissionDao.get().getData();
86+
87+
String email = (String) data.get("email");
88+
dataDao.setEmail(email);
89+
90+
repository.save(limitedPartnershipSubmissionDao.get());
91+
}
92+
}
93+
7294
private Resource createLimitedPartnershipTransactionResource(String submissionUri) {
7395
var limitedPartnershipResource = new Resource();
7496

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ private Constants() {
1010

1111
// URL path parameters
1212
public static final String URL_PARAM_TRANSACTION_ID = "transactionId";
13+
public static final String URL_PARAM_SUBMISSION_ID = "submissionId";
1314

1415
public static final String TRANSACTION_KEY = "transaction";
1516

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package uk.gov.companieshouse.limitedpartnershipsapi.controller;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import org.junit.jupiter.api.BeforeEach;
45
import org.junit.jupiter.api.Test;
56
import org.junit.jupiter.api.extension.ExtendWith;
@@ -10,16 +11,19 @@
1011
import org.springframework.http.HttpStatus;
1112
import uk.gov.companieshouse.api.model.transaction.Transaction;
1213
import uk.gov.companieshouse.limitedpartnershipsapi.exception.ServiceException;
14+
import uk.gov.companieshouse.limitedpartnershipsapi.model.DataType;
1315
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.DataDto;
1416
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionCreatedResponseDto;
1517
import uk.gov.companieshouse.limitedpartnershipsapi.model.dto.LimitedPartnershipSubmissionDto;
1618
import uk.gov.companieshouse.limitedpartnershipsapi.service.LimitedPartnershipService;
1719

20+
import java.util.HashMap;
1821
import java.util.Objects;
1922

2023
import static org.junit.jupiter.api.Assertions.assertEquals;
2124
import static org.mockito.ArgumentMatchers.any;
2225
import static org.mockito.ArgumentMatchers.eq;
26+
import static org.mockito.Mockito.doThrow;
2327
import static org.mockito.Mockito.when;
2428
import static uk.gov.companieshouse.limitedpartnershipsapi.controller.PartnershipController.URL_GET_PARTNERSHIP;
2529

@@ -93,4 +97,48 @@ void testCreatePartnershipInternalServerError() throws ServiceException {
9397

9498
assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), response.getStatusCode().value());
9599
}
100+
101+
@Test
102+
void testUpdatePartnership() throws JsonProcessingException {
103+
HashMap<String, Object> body = new HashMap<String, Object>();
104+
body.put("type", "email");
105+
HashMap<String, Object> data = new HashMap<String, Object>();
106+
data.put("email", "[email protected]");
107+
body.put("data", data);
108+
109+
when(transaction.getId()).thenReturn(TRANSACTION_ID);
110+
111+
var response = partnershipController.updatePartnership(
112+
transaction,
113+
SUBMISSION_ID,
114+
body,
115+
REQUEST_ID,
116+
USER_ID);
117+
118+
assertEquals(HttpStatus.OK.value(), response.getStatusCode().value());
119+
}
120+
121+
@Test
122+
void testUpdatePartnershipInternalServerError() throws ServiceException, JsonProcessingException {
123+
HashMap<String, Object> body = new HashMap<String, Object>();
124+
body.put("type", "email");
125+
HashMap<String, Object> data = new HashMap<String, Object>();
126+
data.put("email", "[email protected]");
127+
body.put("data", data);
128+
129+
doThrow(new ServiceException(String.format(
130+
"Submission with id %s not found", SUBMISSION_ID))).when(limitedPartnershipService).updateLimitedPartnership(
131+
SUBMISSION_ID,
132+
DataType.EMAIL,
133+
data);
134+
135+
var response = partnershipController.updatePartnership(
136+
transaction,
137+
SUBMISSION_ID,
138+
body,
139+
REQUEST_ID,
140+
USER_ID);
141+
142+
assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), response.getStatusCode().value());
143+
}
96144
}

0 commit comments

Comments
 (0)