From fe3a9f7b4e017d8fbd008b595d8cf9acd3427e7b Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 19 Aug 2022 09:42:55 +0200 Subject: [PATCH] new api to add ds and apis --- .../openaire/dsm/DsmApiController.java | 18 +++++++++ .../java/eu/dnetlib/openaire/dsm/DsmCore.java | 24 +++++++++++ .../dsm/domain/DatasourceDetailsWithApis.java | 40 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/domain/DatasourceDetailsWithApis.java diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmApiController.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmApiController.java index 460a9970..5c0451c6 100755 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmApiController.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmApiController.java @@ -34,6 +34,7 @@ import eu.dnetlib.openaire.dsm.domain.ApiDetailsResponse; import eu.dnetlib.openaire.dsm.domain.DatasourceDetailResponse; import eu.dnetlib.openaire.dsm.domain.DatasourceDetails; import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsUpdate; +import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsWithApis; import eu.dnetlib.openaire.dsm.domain.DatasourceResponse; import eu.dnetlib.openaire.dsm.domain.DatasourceSnippetResponse; import eu.dnetlib.openaire.dsm.domain.RequestFilter; @@ -279,6 +280,23 @@ public class DsmApiController extends AbstractExporterController { dsmCore.save(datasource); } + @RequestMapping(value = "/ds/addWithApis", method = RequestMethod.POST) + @ApiOperation(value = "add a new Datasource and its apis", notes = "add a new Datasource and its apis", tags = { + DS, W + }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Malformed request", response = ErrorMessage[].class), + @ApiResponse(code = 500, message = "Unexpected error", response = ErrorMessage.class) + }) + public void saveDsWithApis(@Valid @RequestBody final DatasourceDetailsWithApis d) throws DsmException { + if (d.getDatasource() == null) { throw new DsmException(HttpStatus.SC_BAD_REQUEST, "Datasource field is null"); } + if (dsmCore.exist(d.getDatasource())) { // TODO further check that the DS doesn't have any API + throw new DsmException(HttpStatus.SC_CONFLICT, String.format("cannot register, datasource already defined '%s'", d.getDatasource().getId())); + } + dsmCore.save(d); + } + @RequestMapping(value = "/ds/update", method = RequestMethod.POST) @ApiOperation(value = "update Datasource details", notes = "update Datasource details", tags = { DS, W diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmCore.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmCore.java index b94bcad7..13782b8c 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmCore.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/DsmCore.java @@ -14,6 +14,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.transaction.Transactional; + import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; @@ -43,6 +45,7 @@ import eu.dnetlib.openaire.dsm.domain.ApiDetailsResponse; import eu.dnetlib.openaire.dsm.domain.DatasourceDetailResponse; import eu.dnetlib.openaire.dsm.domain.DatasourceDetails; import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsUpdate; +import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsWithApis; import eu.dnetlib.openaire.dsm.domain.DatasourceSnippetResponse; import eu.dnetlib.openaire.dsm.domain.RegisteredDatasourceInfo; import eu.dnetlib.openaire.dsm.domain.RequestFilter; @@ -174,12 +177,32 @@ public class DsmCore { public void save(final DatasourceDetails d) throws DsmException { try { dsDao.saveDs(asDbEntry(d)); + log.info("DS saved, " + d.getId()); } catch (final Throwable e) { log.error(ExceptionUtils.getStackTrace(e)); throw e; } } + @Transactional + public void save(final DatasourceDetailsWithApis d) throws DsmException { + try { + dsDao.saveDs(asDbEntry(d.getDatasource())); + final List apis = d.getApis(); + if (apis != null) { + for (final ApiDetails api : apis) { + api.setDatasource(d.getDatasource().getId()); + addApi(api); + } + } + } catch ( + + final Throwable e) { + log.error(ExceptionUtils.getStackTrace(e)); + throw e; + } + } + public void updateDatasource(final DatasourceDetailsUpdate d) throws DsmException, DsmNotFoundException { try { // initialize with current values from DB @@ -235,6 +258,7 @@ public class DsmCore { log.info(String.format("missing api id, created '%s'", api.getId())); } dsDao.addApi(asDbEntry(api)); + log.info("API saved, id: " + api.getId()); } public void deleteApi(final String apiId) throws DsmForbiddenException, DsmNotFoundException { diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/domain/DatasourceDetailsWithApis.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/domain/DatasourceDetailsWithApis.java new file mode 100644 index 00000000..a306e0ae --- /dev/null +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/dsm/domain/DatasourceDetailsWithApis.java @@ -0,0 +1,40 @@ +package eu.dnetlib.openaire.dsm.domain; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Created by claudio on 12/09/16. + */ +@JsonAutoDetect +@ApiModel(value = "Datasource model with apis", description = "provides information about the datasource and its apis") +public class DatasourceDetailsWithApis { + + @ApiModelProperty(position = 1) + private DatasourceDetails datasource; + + public DatasourceDetails getDatasource() { + return datasource; + } + + public void setDatasource(final DatasourceDetails datasource) { + this.datasource = datasource; + } + + @ApiModelProperty(position = 2) + private List apis = new ArrayList<>(); + + public List getApis() { + return apis; + } + + public void setApis(final List apis) { + this.apis = apis; + } + +}