Skip to content

Commit 9d39c39

Browse files
committed
Added name duplication check in REST API
Signed-off-by: Stef3st <[email protected]>
1 parent 5655580 commit 9d39c39

File tree

10 files changed

+152
-15
lines changed

10 files changed

+152
-15
lines changed

app/src/main/java/org/lfenergy/compas/scl/data/rest/v1/CompasSclDataResource.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,17 @@ public Uni<Void> deleteVersion(@PathParam(TYPE_PATH_PARAM) SclFileType type,
143143
compasSclDataService.delete(type, id, version);
144144
return Uni.createFrom().nullItem();
145145
}
146+
147+
@POST
148+
@Path("/checkname")
149+
@Consumes(MediaType.APPLICATION_XML)
150+
@Produces(MediaType.APPLICATION_XML)
151+
public Uni<DuplicateNameCheckResponse> checkDuplicateName(@PathParam(TYPE_PATH_PARAM) SclFileType type,
152+
@Valid DuplicateNameCheckRequest request) {
153+
LOGGER.info("Checking for duplicate SCL File name.");
154+
155+
var response = new DuplicateNameCheckResponse();
156+
response.setDuplicate(compasSclDataService.hasDuplicateSclName(type, request.getName()));
157+
return Uni.createFrom().item(response);
158+
}
146159
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.lfenergy.compas.scl.data.rest.v1.model;
2+
3+
import org.eclipse.microprofile.openapi.annotations.media.Schema;
4+
import org.lfenergy.compas.core.commons.constraint.FilenameValid;
5+
6+
import javax.xml.bind.annotation.XmlAccessType;
7+
import javax.xml.bind.annotation.XmlAccessorType;
8+
import javax.xml.bind.annotation.XmlElement;
9+
import javax.xml.bind.annotation.XmlRootElement;
10+
11+
import static org.lfenergy.compas.scl.data.SclDataServiceConstants.SCL_DATA_SERVICE_V1_NS_URI;
12+
13+
@Schema(description = "Request to check for duplicate names.")
14+
@XmlRootElement(name = "DuplicateNameCheckRequest", namespace = SCL_DATA_SERVICE_V1_NS_URI)
15+
@XmlAccessorType(XmlAccessType.FIELD)
16+
public class DuplicateNameCheckRequest {
17+
@FilenameValid
18+
@Schema(description = "The name that will be stored as Private Element and can later be used to determine the filename.",
19+
example = "STATION-0012312")
20+
@XmlElement(name = "Name", namespace = SCL_DATA_SERVICE_V1_NS_URI, required = true)
21+
private String name;
22+
23+
public String getName() {
24+
return name;
25+
}
26+
27+
public void setName(String name) {
28+
this.name = name;
29+
}
30+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.lfenergy.compas.scl.data.rest.v1.model;
2+
3+
import org.eclipse.microprofile.openapi.annotations.media.Schema;
4+
5+
import javax.xml.bind.annotation.XmlAccessType;
6+
import javax.xml.bind.annotation.XmlAccessorType;
7+
import javax.xml.bind.annotation.XmlElement;
8+
import javax.xml.bind.annotation.XmlRootElement;
9+
10+
import static org.lfenergy.compas.scl.data.SclDataServiceConstants.SCL_DATA_SERVICE_V1_NS_URI;
11+
12+
@Schema(description = "Response from duplicate name check in the database.")
13+
@XmlRootElement(name = "DuplicateNameCheckResponse", namespace = SCL_DATA_SERVICE_V1_NS_URI)
14+
@XmlAccessorType(XmlAccessType.FIELD)
15+
public class DuplicateNameCheckResponse {
16+
@Schema(description = "Boolean result for duplicate name check.")
17+
@XmlElement(name = "Duplicate", namespace = SCL_DATA_SERVICE_V1_NS_URI)
18+
private boolean duplicate;
19+
20+
public boolean isDuplicate() {
21+
return duplicate;
22+
}
23+
24+
public void setDuplicate(boolean duplicate) {
25+
this.duplicate = duplicate;
26+
}
27+
}

app/src/main/resources/application.properties

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ quarkus.http.auth.permission.SSD_READ_GET.paths=/compas-scl-data-service/scl/v1/
4848
quarkus.http.auth.permission.SSD_READ_GET.policy=SSD_READ
4949
quarkus.http.auth.permission.SSD_READ_GET.methods=GET
5050
quarkus.http.auth.policy.SSD_CREATE.roles-allowed=SSD_CREATE
51-
quarkus.http.auth.permission.SSD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SSD
51+
quarkus.http.auth.permission.SSD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SSD/*
5252
quarkus.http.auth.permission.SSD_CREATE_POST.policy=SSD_CREATE
5353
quarkus.http.auth.permission.SSD_CREATE_POST.methods=POST
5454
quarkus.http.auth.policy.SSD_UPDATE.roles-allowed=SSD_UPDATE
@@ -74,7 +74,7 @@ quarkus.http.auth.permission.IID_READ_GET.paths=/compas-scl-data-service/scl/v1/
7474
quarkus.http.auth.permission.IID_READ_GET.policy=IID_READ
7575
quarkus.http.auth.permission.IID_READ_GET.methods=GET
7676
quarkus.http.auth.policy.IID_CREATE.roles-allowed=IID_CREATE
77-
quarkus.http.auth.permission.IID_CREATE_POST.paths=/compas-scl-data-service/scl/v1/IID
77+
quarkus.http.auth.permission.IID_CREATE_POST.paths=/compas-scl-data-service/scl/v1/IID/*
7878
quarkus.http.auth.permission.IID_CREATE_POST.policy=IID_CREATE
7979
quarkus.http.auth.permission.IID_CREATE_POST.methods=POST
8080
quarkus.http.auth.policy.IID_UPDATE.roles-allowed=IID_UPDATE
@@ -100,7 +100,7 @@ quarkus.http.auth.permission.ICD_READ_GET.paths=/compas-scl-data-service/scl/v1/
100100
quarkus.http.auth.permission.ICD_READ_GET.policy=ICD_READ
101101
quarkus.http.auth.permission.ICD_READ_GET.methods=GET
102102
quarkus.http.auth.policy.ICD_CREATE.roles-allowed=ICD_CREATE
103-
quarkus.http.auth.permission.ICD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/ICD
103+
quarkus.http.auth.permission.ICD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/ICD/*
104104
quarkus.http.auth.permission.ICD_CREATE_POST.policy=ICD_CREATE
105105
quarkus.http.auth.permission.ICD_CREATE_POST.methods=POST
106106
quarkus.http.auth.policy.ICD_UPDATE.roles-allowed=ICD_UPDATE
@@ -126,7 +126,7 @@ quarkus.http.auth.permission.SCD_READ_GET.paths=/compas-scl-data-service/scl/v1/
126126
quarkus.http.auth.permission.SCD_READ_GET.policy=SCD_READ
127127
quarkus.http.auth.permission.SCD_READ_GET.methods=GET
128128
quarkus.http.auth.policy.SCD_CREATE.roles-allowed=SCD_CREATE
129-
quarkus.http.auth.permission.SCD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SCD
129+
quarkus.http.auth.permission.SCD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SCD/*
130130
quarkus.http.auth.permission.SCD_CREATE_POST.policy=SCD_CREATE
131131
quarkus.http.auth.permission.SCD_CREATE_POST.methods=POST
132132
quarkus.http.auth.policy.SCD_UPDATE.roles-allowed=SCD_UPDATE
@@ -152,7 +152,7 @@ quarkus.http.auth.permission.CID_READ_GET.paths=/compas-scl-data-service/scl/v1/
152152
quarkus.http.auth.permission.CID_READ_GET.policy=CID_READ
153153
quarkus.http.auth.permission.CID_READ_GET.methods=GET
154154
quarkus.http.auth.policy.CID_CREATE.roles-allowed=CID_CREATE
155-
quarkus.http.auth.permission.CID_CREATE_POST.paths=/compas-scl-data-service/scl/v1/CID
155+
quarkus.http.auth.permission.CID_CREATE_POST.paths=/compas-scl-data-service/scl/v1/CID/*
156156
quarkus.http.auth.permission.CID_CREATE_POST.policy=CID_CREATE
157157
quarkus.http.auth.permission.CID_CREATE_POST.methods=POST
158158
quarkus.http.auth.policy.CID_UPDATE.roles-allowed=CID_UPDATE
@@ -178,7 +178,7 @@ quarkus.http.auth.permission.SED_READ_GET.paths=/compas-scl-data-service/scl/v1/
178178
quarkus.http.auth.permission.SED_READ_GET.policy=SED_READ
179179
quarkus.http.auth.permission.SED_READ_GET.methods=GET
180180
quarkus.http.auth.policy.SED_CREATE.roles-allowed=SED_CREATE
181-
quarkus.http.auth.permission.SED_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SED
181+
quarkus.http.auth.permission.SED_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SED/*
182182
quarkus.http.auth.permission.SED_CREATE_POST.policy=SED_CREATE
183183
quarkus.http.auth.permission.SED_CREATE_POST.methods=POST
184184
quarkus.http.auth.policy.SED_UPDATE.roles-allowed=SED_UPDATE
@@ -204,7 +204,7 @@ quarkus.http.auth.permission.ISD_READ_GET.paths=/compas-scl-data-service/scl/v1/
204204
quarkus.http.auth.permission.ISD_READ_GET.policy=ISD_READ
205205
quarkus.http.auth.permission.ISD_READ_GET.methods=GET
206206
quarkus.http.auth.policy.ISD_CREATE.roles-allowed=ISD_CREATE
207-
quarkus.http.auth.permission.ISD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/ISD
207+
quarkus.http.auth.permission.ISD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/ISD/*
208208
quarkus.http.auth.permission.ISD_CREATE_POST.policy=ISD_CREATE
209209
quarkus.http.auth.permission.ISD_CREATE_POST.methods=POST
210210
quarkus.http.auth.policy.ISD_UPDATE.roles-allowed=ISD_UPDATE
@@ -230,7 +230,7 @@ quarkus.http.auth.permission.STD_READ_GET.paths=/compas-scl-data-service/scl/v1/
230230
quarkus.http.auth.permission.STD_READ_GET.policy=STD_READ
231231
quarkus.http.auth.permission.STD_READ_GET.methods=GET
232232
quarkus.http.auth.policy.STD_CREATE.roles-allowed=STD_CREATE
233-
quarkus.http.auth.permission.STD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/STD
233+
quarkus.http.auth.permission.STD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/STD/*
234234
quarkus.http.auth.permission.STD_CREATE_POST.policy=STD_CREATE
235235
quarkus.http.auth.permission.STD_CREATE_POST.methods=POST
236236
quarkus.http.auth.policy.STD_UPDATE.roles-allowed=STD_UPDATE
@@ -249,4 +249,4 @@ quarkus.http.auth.permission.STD_READ_GET_VERSION_WS.policy=STD_READ
249249
quarkus.http.auth.permission.STD_CREATE_POST_WS.paths=/compas-scl-data-service/scl-ws/v1/STD/create
250250
quarkus.http.auth.permission.STD_CREATE_POST_WS.policy=STD_CREATE
251251
quarkus.http.auth.permission.STD_UPDATE_PUT_WS.paths=/compas-scl-data-service/scl-ws/v1/STD/update
252-
quarkus.http.auth.permission.STD_UPDATE_PUT_WS.policy=STD_UPDATE
252+
quarkus.http.auth.permission.STD_UPDATE_PUT_WS.policy=STD_UPDATE

app/src/test/java/org/lfenergy/compas/scl/data/rest/v1/CompasSclDataResourceAsEditorTest.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.lfenergy.compas.scl.data.model.Item;
1717
import org.lfenergy.compas.scl.data.model.Version;
1818
import org.lfenergy.compas.scl.data.rest.v1.model.CreateRequest;
19+
import org.lfenergy.compas.scl.data.rest.v1.model.DuplicateNameCheckRequest;
1920
import org.lfenergy.compas.scl.data.rest.v1.model.UpdateRequest;
2021
import org.lfenergy.compas.scl.data.service.CompasSclDataService;
2122
import org.lfenergy.compas.scl.extensions.model.SclFileType;
@@ -27,7 +28,7 @@
2728

2829
import static io.restassured.RestAssured.given;
2930
import static io.restassured.path.xml.config.XmlPathConfig.xmlPathConfig;
30-
import static org.junit.jupiter.api.Assertions.assertEquals;
31+
import static org.junit.jupiter.api.Assertions.*;
3132
import static org.lfenergy.compas.scl.data.SclDataServiceConstants.SCL_NS_URI;
3233
import static org.lfenergy.compas.scl.data.rest.Constants.*;
3334
import static org.mockito.Mockito.*;
@@ -267,6 +268,54 @@ void deleteVersion_WhenCalled_ThenServiceCalled() {
267268
verify(compasSclDataService).delete(type, uuid, version);
268269
}
269270

271+
@Test
272+
void checkNameForDuplication_WhenCalled_WithDuplicateName_ThenServiceCalled() {
273+
var type = SclFileType.SCD;
274+
var name = "STATION-0012312";
275+
276+
when(compasSclDataService.hasDuplicateSclName(type, name)).thenReturn(true);
277+
278+
var request = new DuplicateNameCheckRequest();
279+
request.setName(name);
280+
281+
var response = given()
282+
.pathParam(TYPE_PATH_PARAM, type)
283+
.contentType(ContentType.XML)
284+
.body(request)
285+
.when().post("/checkname")
286+
.then()
287+
.statusCode(200)
288+
.extract()
289+
.response();
290+
291+
verify(compasSclDataService).hasDuplicateSclName(type, name);
292+
assertTrue(response.xmlPath().getBoolean("DuplicateNameCheckResponse.Duplicate"));
293+
}
294+
295+
@Test
296+
void checkNameForDuplication_WhenCalled_WithUniqueName_ThenServiceCalled() {
297+
var type = SclFileType.SCD;
298+
var name = "STATION-0012312";
299+
300+
when(compasSclDataService.hasDuplicateSclName(type, name)).thenReturn(false);
301+
302+
var request = new DuplicateNameCheckRequest();
303+
request.setName(name);
304+
305+
var response = given()
306+
.pathParam(TYPE_PATH_PARAM, type)
307+
.contentType(ContentType.XML)
308+
.body(request)
309+
.when().post("/checkname")
310+
.then()
311+
.statusCode(200)
312+
.extract()
313+
.response();
314+
315+
verify(compasSclDataService).hasDuplicateSclName(type, name);
316+
assertFalse(response.xmlPath().getBoolean("DuplicateNameCheckResponse.Duplicate"));
317+
}
318+
270319
private String readSCL() throws IOException {
271320
try (var inputStream = getClass().getResourceAsStream("/scl/icd_import_ied_test.scd")) {
272321
assert inputStream != null;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.lfenergy.compas.scl.data.rest.v1.model;
2+
3+
class DuplicateNameCheckRequestTest extends AbstractPojoTester {
4+
@Override
5+
protected Class<?> getClassToBeTested() {
6+
return DuplicateNameCheckRequest.class;
7+
}
8+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.lfenergy.compas.scl.data.rest.v1.model;
2+
3+
class DuplicateNameCheckResponseTest extends AbstractPojoTester{
4+
5+
@Override
6+
protected Class<?> getClassToBeTested() {
7+
return DuplicateNameCheckResponse.class;
8+
}
9+
}

repository-postgresql/src/main/java/org/lfenergy/compas/scl/data/repository/postgresql/CompasSclDataPostgreSQLRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public String findByUUID(SclFileType type, UUID id, Version version) {
191191
@Transactional(SUPPORTS)
192192
public boolean hasDuplicateSclName(SclFileType type, String name) {
193193
var sql = """
194-
select distinct on (scl_file.id) *
194+
select distinct on (scl_file.id) scl_file.name
195195
from scl_file
196196
where scl_file.type = ?
197197
order by scl_file.id

repository-postgresql/src/test/java/org/lfenergy/compas/scl/data/repository/postgresql/CompasSclDataPostgreSQLRepositoryTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ void beforeEach() {
2929
repository = new CompasSclDataPostgreSQLRepository(PostgreSQLServerJUnitExtension.getDataSource());
3030
}
3131

32-
/*
33-
* TODO: Method beneath needs to be moved to AbstractCompasSclDataRepositoryTest
34-
* when hasDuplicateSclName has been implemented by CompasSclDataBaseXRepository. */
3532
@Test
3633
void hasDuplicateSclName_WhenUsingSclNameThatHasBeenUsedYet_ThenDuplicateIsFound() {
3734
var expectedVersion = new Version(1, 0, 0);

service/src/main/java/org/lfenergy/compas/scl/data/service/CompasSclDataService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public String create(SclFileType type, String name, String who, String comment,
122122
throw new CompasException(NO_SCL_ELEMENT_FOUND_ERROR_CODE, "No valid SCL found in the passed SCL Data.");
123123
}
124124

125-
if (repository.hasDuplicateSclName(type, name)) {
125+
if (hasDuplicateSclName(type, name)) {
126126
throw new CompasException(DUPLICATE_SCL_NAME_ERROR_CODE, "Given name of SCL File already used.");
127127
}
128128

@@ -147,6 +147,10 @@ public String create(SclFileType type, String name, String who, String comment,
147147
return newSclData;
148148
}
149149

150+
public boolean hasDuplicateSclName(SclFileType type, String name){
151+
return repository.hasDuplicateSclName(type, name);
152+
}
153+
150154
/**
151155
* Create a new version of a specific SCL XML File. The content will be the passed SCL XML File.
152156
* The UUID and new version (depending on the passed ChangeSetType) are set and

0 commit comments

Comments
 (0)