package eu.eudat.controllers.publicapi; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.enums.IsActive; import eu.eudat.controllers.publicapi.request.dataset.DatasetPublicTableRequest; import eu.eudat.controllers.publicapi.response.DataTableData; import eu.eudat.data.DescriptionEntity; import eu.eudat.model.*; import eu.eudat.model.builder.DescriptionBuilder; import eu.eudat.model.builder.DmpBuilder; import eu.eudat.model.descriptiontemplatedefinition.*; import eu.eudat.model.descriptiontemplatedefinition.fielddata.BaseFieldData; import eu.eudat.model.mapper.publicapi.DescriptionToPublicApiDatasetListingMapper; import eu.eudat.model.mapper.publicapi.DescriptionToPublicApiDatasetMapper; import eu.eudat.model.mapper.publicapi.DmpToPublicApiDmpListingMapper; import eu.eudat.model.publicapi.listingmodels.DatasetPublicListingModel; import eu.eudat.model.publicapi.overviewmodels.DatasetPublicModel; import eu.eudat.controllers.publicapi.types.ResponseItem; import eu.eudat.query.DescriptionQuery; import eu.eudat.query.DmpQuery; import eu.eudat.query.lookup.DescriptionLookup; import eu.eudat.query.lookup.DmpLookup; import eu.eudat.service.publicapi.PublicApiProperties; import eu.eudat.controllers.publicapi.types.ApiMessageCode; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyNotFoundException; import gr.cite.tools.fieldset.BaseFieldSet; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.UUID; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @Tag(name = "Datasets Description", description = "Provides Dataset description public API's.") @RestController @CrossOrigin @RequestMapping(value = {"/api/public/datasets/"}) public class PublicDatasetsDescriptionDocumentation { private static final Logger logger = LoggerFactory.getLogger(PublicDatasetsDescriptionDocumentation.class); private final QueryFactory queryFactory; private final BuilderFactory builderFactory; private final MessageSource messageSource; private final DescriptionToPublicApiDatasetMapper descriptionToPublicApiDatasetMapper; private final DescriptionToPublicApiDatasetListingMapper descriptionToPublicApiDatasetListingMapper; private final PublicApiProperties config; private final DmpToPublicApiDmpListingMapper dmpToPublicApiDmpListingMapper; @Autowired public PublicDatasetsDescriptionDocumentation( QueryFactory queryFactory, BuilderFactory builderFactory, MessageSource messageSource, DescriptionToPublicApiDatasetMapper descriptionToPublicApiDatasetMapper, DescriptionToPublicApiDatasetListingMapper descriptionToPublicApiDatasetListingMapper, PublicApiProperties config, DmpToPublicApiDmpListingMapper dmpToPublicApiDmpListingMapper) { this.queryFactory = queryFactory; this.builderFactory = builderFactory; this.messageSource = messageSource; this.descriptionToPublicApiDatasetMapper = descriptionToPublicApiDatasetMapper; this.descriptionToPublicApiDatasetListingMapper = descriptionToPublicApiDatasetListingMapper; this.config = config; this.dmpToPublicApiDmpListingMapper = dmpToPublicApiDmpListingMapper; } @Operation(summary = "This method is used to get a listing of public datasets.", description = PublicApiStaticHelpers.Description.getPagedNotes) @io.swagger.v3.oas.annotations.responses.ApiResponses(value = {@io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "200", description = "The following example is generated using body: *{\"criteria\": {},\"length\": 2,\"offset\": 0,\"orderings\": {\"fields\": []} }*", content = @Content(mediaType = APPLICATION_JSON_VALUE, examples = {@ExampleObject( value = PublicApiStaticHelpers.Description.getPagedResponseExample )}) )}) @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity>> getPaged( @Valid @RequestBody @io.swagger.v3.oas.annotations.parameters.RequestBody(description = PublicApiStaticHelpers.Description.getPagedRequestBodyDescription) DatasetPublicTableRequest datasetTableRequest ) throws Exception { DescriptionLookup lookup = getDescriptionLookup(); DescriptionQuery query = lookup.enrich(this.queryFactory).authorize(EnumSet.of(AuthorizationFlags.Public)).isActive(IsActive.Active); long count = this.queryFactory.query(DescriptionQuery.class).authorize(EnumSet.of(AuthorizationFlags.Public)).isActive(IsActive.Active).count(); List data = query.collectAs(lookup.getProject()); List models = this.builderFactory.builder(DescriptionBuilder.class).build(lookup.getProject(), data); DataTableData dataTableData = new DataTableData<>(); dataTableData.setData(models.stream().map(x-> this.descriptionToPublicApiDatasetListingMapper.toPublicListingModel(x, this.config.getReferenceTypeMap())).toList()); dataTableData.setTotalCount(count); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTableData)); } @Operation(summary = "This method is used to get the overview of a public dataset.", description = PublicApiStaticHelpers.Description.getOverviewSinglePublicNotes) @io.swagger.v3.oas.annotations.responses.ApiResponses(value = {@ApiResponse( responseCode = "200", description = "The following example is generated using id: *ef7dfbdc-c5c1-46a7-a37b-c8d8692f1c0e*", content = @Content(mediaType = APPLICATION_JSON_VALUE, examples = {@ExampleObject( value = PublicApiStaticHelpers.Description.getOverviewSinglePublicResponseExample )}) )}) @RequestMapping(method = RequestMethod.GET, value = {"/{id}"}, produces = "application/json") public @ResponseBody ResponseEntity> getOverviewSinglePublic( @PathVariable @Parameter(description = "fetch the dataset with the given id", example = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") String id ) { DescriptionLookup lookup = getDescriptionLookup(); DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(EnumSet.of(AuthorizationFlags.Public)).ids(UUID.fromString(id)).isActive(IsActive.Active); Description model = this.builderFactory.builder(DescriptionBuilder.class).build(lookup.getProject(), query.firstAs(lookup.getProject())); if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).ids(model.getDmp().getId()).isActive(IsActive.Active); DmpLookup dmpLookup = getDmpLookup(); Dmp dmp = this.builderFactory.builder(DmpBuilder.class).build(dmpLookup.getProject(), dmpQuery.firstAs(dmpLookup.getProject())); DatasetPublicModel dataset = this.descriptionToPublicApiDatasetMapper.toPublicModel(model, this.dmpToPublicApiDmpListingMapper.toPublicListingModel(dmp, this.config.getReferenceTypeMap()), this.config.getReferenceTypeMap()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); } @NotNull private static DescriptionLookup getDescriptionLookup() { BaseFieldSet descriptionFieldSet = new BaseFieldSet(); Set descriptionFields = Set.of( Description._id, Description._label, Description._description, Description._status, String.join(".", Description._dmp, Dmp._id), String.join(".", Description._dmp, Dmp._label), String.join(".", Description._createdBy, User._id), String.join(".", Description._createdBy, User._name), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._id), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._type), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._type, Reference._id), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._reference), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._label), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._abbreviation), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._description), String.join(".", Description._descriptionReferences, DescriptionReference._reference, Reference._definition), String.join(".", Description._descriptionTemplate, DescriptionTemplate._status), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._id), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._ordinal), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._title), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._id), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._description), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._extendedDescription), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._title), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._multiplicity), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._numbering), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._ordinal), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._sections), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._id), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._description), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._extendedDescription), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._ordinal), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._additionalInformation), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._multiplicity, Multiplicity._min), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._multiplicity, Multiplicity._max), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._multiplicity, Multiplicity._placeholder), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._multiplicity, Multiplicity._tableView), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._numbering), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._title), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._id), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._numbering), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._ordinal), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._data, BaseFieldData._label), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._data, BaseFieldData._fieldType), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._schematics), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._defaultValue), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._includeInExport), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._validations), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._visibilityRules, Rule._target), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._visibilityRules, Rule._dateValue), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._visibilityRules, Rule._textListValue), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._visibilityRules, Rule._textValue), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._visibilityRules, Rule._externalIdentifier), String.join(".", Description._descriptionTemplate, DescriptionTemplate._definition, Definition._pages, Page._sections, Section._fieldSets, FieldSet._fields, Field._visibilityRules, Rule._references), Description._createdAt, Description._updatedAt, Description._finalizedAt ); descriptionFieldSet.setFields(descriptionFields); DescriptionLookup lookup = new DescriptionLookup(); lookup.setProject(descriptionFieldSet); return lookup; } @NotNull private static DmpLookup getDmpLookup() { BaseFieldSet fieldSet = new BaseFieldSet(); Set fields = Set.of( Dmp._id, Dmp._label, Dmp._description, Dmp._version, Dmp._groupId, String.join(".", Dmp._dmpUsers, String.join(".", DmpUser._user, User._id)), String.join(".", Dmp._dmpUsers, String.join(".", DmpUser._user, User._name)), String.join(".", Dmp._dmpUsers, DmpUser._role), String.join(".", Dmp._dmpReferences, String.join(".", DmpReference._reference, Reference._id)), String.join(".", Dmp._dmpReferences, String.join(".", DmpReference._reference, Reference._reference)), String.join(".", Dmp._dmpReferences, String.join(".", DmpReference._reference, Reference._label)), Dmp._dmpReferences, Dmp._createdAt, Dmp._updatedAt, Dmp._finalizedAt ); fieldSet.setFields(fields); DmpLookup lookup = new DmpLookup(); lookup.setProject(fieldSet); return lookup; } }