Skip to content

Commit afc4cd0

Browse files
duffizipierluigiPierluigi D'Uffizi
andauthored
[SELC-6515] feat: add address, zipCode, onboardings in updateInstitution (#78)
Co-authored-by: Pierluigi D'Uffizi <DFFPLG91T09H501X@sogeiesterni.it>
1 parent 54b946b commit afc4cd0

File tree

21 files changed

+360
-48
lines changed

21 files changed

+360
-48
lines changed

apps/institution-ms/README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,19 @@ To use the API, refer to the Swagger UI documentation (if available) at `http://
4949
A new suite of integration tests written with cucumber was added in `it.pagopa.selfcare.mscore.integration_test` package.
5050
The tests are currently disabled by default, to run the tests locally:
5151

52-
1. Start mongodb, azurite and mockserver using the docker-compose.yml in this folder:
52+
1. Open the docker-compose.yml file located in the root of institution-ms and replace the placeholder REPLACE_WITH_TOKEN with a valid GitHub PAT.
53+
2. Start mongodb, azurite and mockserver using the docker-compose.yml in this folder:
5354
```shell script
5455
docker-compose up mongodb
5556
docker-compose up azurite
5657
docker-compose up mockserver
5758
```
5859

59-
2. Run user-ms at port 8082 using the test public key in `src/test/resources/key/public-key.pub`
60+
3. Run user-ms at port 8082 using the test public key in `src/test/resources/key/public-key.pub`
6061
(by setting the value in a single line of the env var JWT-PUBLIC-KEY).
6162
The institution-ms microservice is started automatically with the CucumberSuite
6263

63-
3. Comment the line starting with @ExcludeTags inside the CucumberSuite file and run the test with maven:
64+
4. Comment the line starting with @ExcludeTags inside the CucumberSuite file and run the test with maven:
6465
```shell script
6566
mvn test -DfailIfNoTests=false -Dtest=it.pagopa.selfcare.mscore.integration_test.CucumberSuite
6667
```

apps/institution-ms/app/src/main/docs/openapi.json

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3166,6 +3166,9 @@
31663166
"title" : "InstitutionPut",
31673167
"type" : "object",
31683168
"properties" : {
3169+
"address" : {
3170+
"type" : "string"
3171+
},
31693172
"description" : {
31703173
"type" : "string"
31713174
},
@@ -3178,8 +3181,17 @@
31783181
"type" : "string"
31793182
}
31803183
},
3184+
"onboardings" : {
3185+
"type" : "array",
3186+
"items" : {
3187+
"$ref" : "#/components/schemas/OnboardingPut"
3188+
}
3189+
},
31813190
"parentDescription" : {
31823191
"type" : "string"
3192+
},
3193+
"zipCode" : {
3194+
"type" : "string"
31833195
}
31843196
}
31853197
},
@@ -3466,6 +3478,12 @@
34663478
"ivassCode" : {
34673479
"type" : "string"
34683480
},
3481+
"onboardings" : {
3482+
"type" : "array",
3483+
"items" : {
3484+
"$ref" : "#/components/schemas/Onboarding"
3485+
}
3486+
},
34693487
"parentDescription" : {
34703488
"type" : "string"
34713489
},
@@ -3561,6 +3579,58 @@
35613579
}
35623580
}
35633581
},
3582+
"Onboarding" : {
3583+
"title" : "Onboarding",
3584+
"type" : "object",
3585+
"properties" : {
3586+
"billing" : {
3587+
"$ref" : "#/components/schemas/Billing"
3588+
},
3589+
"closedAt" : {
3590+
"type" : "string",
3591+
"format" : "date-time"
3592+
},
3593+
"contract" : {
3594+
"type" : "string"
3595+
},
3596+
"createdAt" : {
3597+
"type" : "string",
3598+
"format" : "date-time"
3599+
},
3600+
"isAggregator" : {
3601+
"type" : "boolean"
3602+
},
3603+
"pricingPlan" : {
3604+
"type" : "string"
3605+
},
3606+
"productId" : {
3607+
"type" : "string"
3608+
},
3609+
"status" : {
3610+
"type" : "string",
3611+
"enum" : [ "ACTIVE", "DELETED", "PENDING", "REJECTED", "SUSPENDED", "TOBEVALIDATED" ]
3612+
},
3613+
"tokenId" : {
3614+
"type" : "string"
3615+
},
3616+
"updatedAt" : {
3617+
"type" : "string",
3618+
"format" : "date-time"
3619+
}
3620+
}
3621+
},
3622+
"OnboardingPut" : {
3623+
"title" : "OnboardingPut",
3624+
"type" : "object",
3625+
"properties" : {
3626+
"productId" : {
3627+
"type" : "string"
3628+
},
3629+
"vatNumber" : {
3630+
"type" : "string"
3631+
}
3632+
}
3633+
},
35643634
"OnboardingRequest" : {
35653635
"title" : "OnboardingRequest",
35663636
"type" : "object",

apps/institution-ms/app/src/test/resources/features/institution.feature

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,18 +1051,67 @@ Feature: Institution
10511051
{
10521052
"geographicTaxonomyCodes": ["058091"],
10531053
"digitalAddress": "updated.digital.address@test.com",
1054-
"description": "Updated institution description"
1054+
"description": "Updated institution description",
1055+
"address" : "Updated address",
1056+
"zipCode" : "Updated zipCode",
1057+
"onboardings" : [
1058+
{
1059+
"vatNumber":"Updated vatNumber",
1060+
"productId" : "prod-io"
1061+
}
1062+
]
10551063
}
10561064
"""
10571065
When I send a PUT request to "/institutions/{id}"
10581066
Then The status code is 200
10591067
And The response body contains:
1060-
| id | 123 |
1061-
| digitalAddress | updated.digital.address@test.com |
1062-
| description | Updated institution description |
1063-
| delegation | false |
1064-
| geographicTaxonomies[0].code | 058091 |
1065-
| geographicTaxonomies[0].desc | ROMA - COMUNE |
1068+
| id | 123 |
1069+
| digitalAddress | updated.digital.address@test.com |
1070+
| description | Updated institution description |
1071+
| delegation | false |
1072+
| geographicTaxonomies[0].code | 058091 |
1073+
| geographicTaxonomies[0].desc | ROMA - COMUNE |
1074+
| address | Updated address |
1075+
| zipCode | Updated zipCode |
1076+
| onboarding[0].billing.vatNumber | Updated vatNumber |
1077+
1078+
Scenario Outline: Bad request while updating institution with invalid onboarding fields
1079+
Given User login with username "j.doe" and password "test"
1080+
And A mock institution with id "123"
1081+
And The following path params:
1082+
| id | 123 |
1083+
And The following request body:
1084+
"""
1085+
{
1086+
"geographicTaxonomyCodes": ["058091"],
1087+
"digitalAddress": "updated.digital.address@test.com",
1088+
"description": "Updated institution description",
1089+
"address" : "Updated address",
1090+
"zipCode" : "Updated zipCode",
1091+
"onboardings" : [
1092+
{
1093+
"vatNumber": <vatNumber>,
1094+
"productId" : <productId>
1095+
}
1096+
]
1097+
}
1098+
"""
1099+
When I send a PUT request to "/institutions/{id}"
1100+
Then The status code is 400
1101+
And The response body contains:
1102+
| status | 400 |
1103+
| detail | INVALID ARGUMENT |
1104+
Examples:
1105+
| vatNumber | productId |
1106+
| null | null |
1107+
| "" | "" |
1108+
| " " | " " |
1109+
| "valid" | null |
1110+
| null | "valid" |
1111+
| "valid" | "" |
1112+
| "" | "valid" |
1113+
| "valid" | " " |
1114+
| " " | "valid" |
10661115

10671116
Scenario: Not found institutionId while updating institution
10681117
Given User login with username "j.doe" and password "test"

apps/institution-ms/connector-api/src/main/java/it/pagopa/selfcare/mscore/api/InstitutionConnector.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public interface InstitutionConnector {
3232

3333
Institution findAndUpdateStatus(String id, String tokenId, RelationshipState state);
3434

35-
Institution findAndUpdate(String id, Onboarding onboarding, List<InstitutionGeographicTaxonomies> geographicTaxonomies, InstitutionUpdate institutionUpdate);
35+
Institution findAndAddOnboarding(String id, Onboarding onboarding);
36+
37+
Institution findAndUpdate(String id, List<InstitutionGeographicTaxonomies> geographicTaxonomies, InstitutionUpdate institutionUpdate);
3638

3739
Institution findByExternalIdAndProductId(String externalId, String productId);
3840

apps/institution-ms/connector-api/src/main/java/it/pagopa/selfcare/mscore/model/institution/InstitutionUpdate.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class InstitutionUpdate {
2323
private PaymentServiceProvider paymentServiceProvider;
2424
private DataProtectionOfficer dataProtectionOfficer;
2525
private List<InstitutionGeographicTaxonomies> geographicTaxonomies;
26+
private List<Onboarding> onboardings;
2627
private String rea;
2728
private String shareCapital;
2829
private String businessRegisterPlace;

apps/institution-ms/connector/dao/src/main/java/it/pagopa/selfcare/mscore/connector/dao/InstitutionConnectorImpl.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.stream.Collectors;
3131

3232
import static it.pagopa.selfcare.mscore.connector.dao.model.mapper.InstitutionMapperHelper.addGeographicTaxonomies;
33+
import static it.pagopa.selfcare.mscore.connector.dao.model.mapper.InstitutionMapperHelper.updateOnboarding;
3334
import static it.pagopa.selfcare.mscore.constant.CustomError.GET_INSTITUTION_BILLING_ERROR;
3435
import static it.pagopa.selfcare.mscore.constant.CustomError.INSTITUTION_NOT_FOUND;
3536

@@ -109,16 +110,28 @@ public Institution findAndUpdateStatus(String institutionId, String tokenId, Rel
109110
}
110111

111112
@Override
112-
public Institution findAndUpdate(String institutionId, Onboarding onboarding, List<InstitutionGeographicTaxonomies> geographicTaxonomiesList, InstitutionUpdate institutionUpdate) {
113+
public Institution findAndAddOnboarding(String institutionId, Onboarding onboarding) {
113114
Query query = Query.query(Criteria.where(InstitutionEntity.Fields.id.name()).is(institutionId));
114115
Update update = new Update();
115116
update.set(InstitutionEntity.Fields.updatedAt.name(), OffsetDateTime.now());
116117
if (onboarding != null) {
117118
update.addToSet(InstitutionEntity.Fields.onboarding.name(), onboarding);
118119
}
120+
121+
FindAndModifyOptions findAndModifyOptions = FindAndModifyOptions.options().upsert(false).returnNew(true);
122+
return institutionMapper.convertToInstitution(repository.findAndModify(query, update, findAndModifyOptions, InstitutionEntity.class));
123+
}
124+
125+
@Override
126+
public Institution findAndUpdate(String institutionId, List<InstitutionGeographicTaxonomies> geographicTaxonomiesList, InstitutionUpdate institutionUpdate) {
127+
Query query = Query.query(Criteria.where(InstitutionEntity.Fields.id.name()).is(institutionId));
128+
Update update = new Update();
129+
update.set(InstitutionEntity.Fields.updatedAt.name(), OffsetDateTime.now());
130+
119131
if (institutionUpdate != null) {
120132
Map<String, Object> map = InstitutionMapperHelper.getNotNullField(institutionUpdate);
121133
map.forEach(update::set);
134+
updateOnboarding(institutionUpdate, update);
122135
}
123136
addGeographicTaxonomies(geographicTaxonomiesList, update);
124137
FindAndModifyOptions findAndModifyOptions = FindAndModifyOptions.options().upsert(false).returnNew(true);

apps/institution-ms/connector/dao/src/main/java/it/pagopa/selfcare/mscore/connector/dao/model/mapper/InstitutionMapperHelper.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,17 @@
22

33
import it.pagopa.selfcare.mscore.connector.dao.model.InstitutionEntity;
44
import it.pagopa.selfcare.mscore.connector.dao.model.inner.GeoTaxonomyEntity;
5-
import it.pagopa.selfcare.mscore.model.institution.DataProtectionOfficer;
6-
import it.pagopa.selfcare.mscore.model.institution.InstitutionGeographicTaxonomies;
7-
import it.pagopa.selfcare.mscore.model.institution.InstitutionUpdate;
8-
import it.pagopa.selfcare.mscore.model.institution.PaymentServiceProvider;
5+
import it.pagopa.selfcare.mscore.model.institution.*;
96
import lombok.AccessLevel;
107
import lombok.NoArgsConstructor;
8+
import org.springframework.data.mongodb.core.query.Criteria;
119
import org.springframework.data.mongodb.core.query.Update;
10+
import org.springframework.util.StringUtils;
1211

13-
import java.util.HashMap;
14-
import java.util.List;
15-
import java.util.Map;
16-
import java.util.Objects;
12+
import java.time.OffsetDateTime;
13+
import java.util.*;
1714
import java.util.stream.Collectors;
15+
import java.util.stream.IntStream;
1816

1917
@NoArgsConstructor(access = AccessLevel.NONE)
2018
public class InstitutionMapperHelper {
@@ -32,6 +30,28 @@ public static void addGeographicTaxonomies(List<InstitutionGeographicTaxonomies>
3230
}
3331
}
3432

33+
public static void updateOnboarding(InstitutionUpdate institutionUpdate, Update update) {
34+
if (institutionUpdate.getOnboardings() != null && !institutionUpdate.getOnboardings().isEmpty()) {
35+
IntStream.range(0, institutionUpdate.getOnboardings().size())
36+
.boxed()
37+
.collect(Collectors.toMap(
38+
index -> index,
39+
index -> institutionUpdate.getOnboardings().get(index)
40+
))
41+
.entrySet().stream()
42+
.filter(entry -> StringUtils.hasText(entry.getValue().getProductId()))
43+
.forEach(entry -> {
44+
int index = entry.getKey();
45+
Onboarding onboarding = entry.getValue();
46+
String identifier = "elem" + index;
47+
48+
update.filterArray(Criteria.where(identifier + ".productId").is(onboarding.getProductId()));
49+
update.set("onboarding.$[" + identifier + "].billing.vatNumber", onboarding.getBilling().getVatNumber());
50+
update.set("onboarding.$[" + identifier + "].updatedAt", OffsetDateTime.now());
51+
});
52+
}
53+
}
54+
3555
public static Map<String, Object> getNotNullField(InstitutionUpdate institutionUpdate) {
3656
Map<String, Object> response = new HashMap<>();
3757
if(institutionUpdate.getInstitutionType() != null) {

apps/institution-ms/connector/dao/src/test/java/it/pagopa/selfcare/mscore/connector/dao/InstitutionConnectorImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void testFindAndUpdate() {
243243
geographicTaxonomies1.setCode("code");
244244
geographicTaxonomies1.setDesc("desc");
245245
geographicTaxonomies.add(geographicTaxonomies1);
246-
Institution response = institutionConnectorImpl.findAndUpdate("institutionId", new Onboarding(), geographicTaxonomies, new InstitutionUpdate());
246+
Institution response = institutionConnectorImpl.findAndUpdate("institutionId", geographicTaxonomies, new InstitutionUpdate());
247247
assertNotNull(response);
248248
}
249249

apps/institution-ms/core/src/main/java/it/pagopa/selfcare/mscore/core/InstitutionServiceImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ public Institution updateInstitution(String institutionId, InstitutionUpdate ins
303303
Institution outdatedInstitution = institutionConnector.findById(institutionId);
304304

305305
List<InstitutionGeographicTaxonomies> geographicTaxonomies = retrieveGeographicTaxonomies(institutionUpdate);
306-
Institution updatedInstitution = institutionConnector.findAndUpdate(institutionId, null, geographicTaxonomies, institutionUpdate);
306+
Institution updatedInstitution = institutionConnector.findAndUpdate(institutionId, geographicTaxonomies, institutionUpdate);
307307

308308
if(Objects.nonNull(institutionUpdate.getDescription())) {
309309
try {
@@ -329,15 +329,15 @@ private void rollbackInstitution(Institution institution) {
329329
InstitutionUpdate institutionUpdate = new InstitutionUpdate();
330330
institutionUpdate.setDescription(institution.getDescription());
331331
institutionUpdate.setParentDescription(institution.getParentDescription());
332-
institutionConnector.findAndUpdate(institution.getId(), null, null, institutionUpdate);
332+
institutionConnector.findAndUpdate(institution.getId(), null, institutionUpdate);
333333
}
334334

335335

336336
@Override
337337
public void updateInstitutionDelegation(String institutionId, boolean delegation) {
338338
InstitutionUpdate institutionUpdate = new InstitutionUpdate();
339339
institutionUpdate.setDelegation(delegation);
340-
institutionConnector.findAndUpdate(institutionId, null, null, institutionUpdate);
340+
institutionConnector.findAndUpdate(institutionId, null, institutionUpdate);
341341
}
342342

343343
private List<InstitutionGeographicTaxonomies> retrieveGeographicTaxonomies(InstitutionUpdate institutionUpdate) {

apps/institution-ms/core/src/main/java/it/pagopa/selfcare/mscore/core/OnboardingServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ private Institution persistAndGetInstitution(String institutionId, String produc
118118

119119
try {
120120
//If not exists, persist a new onboarding for product
121-
final Institution institutionUpdated = institutionConnector.findAndUpdate(institutionId, onboarding, List.of(), null);
121+
final Institution institutionUpdated = institutionConnector.findAndAddOnboarding(institutionId, onboarding);
122122

123123
log.trace("persistForUpdate end");
124124
httpStatus.append(HttpStatus.CREATED.value());

0 commit comments

Comments
 (0)