2023-11-27 16:33:24 +01:00
package eu.eudat.controllers.publicapi ;
2023-11-29 10:30:38 +01:00
import eu.eudat.authorization.AuthorizationFlags ;
import eu.eudat.commons.enums.IsActive ;
2023-11-27 16:33:24 +01:00
import eu.eudat.controllers.BaseController ;
2023-11-29 10:30:38 +01:00
import eu.eudat.controllers.publicapi.request.dataset.DatasetPublicTableRequest ;
2023-11-27 16:33:24 +01:00
import eu.eudat.controllers.publicapi.response.DataTableData ;
2023-11-29 10:30:38 +01:00
import eu.eudat.data.DescriptionEntity ;
2023-11-27 16:33:24 +01:00
import eu.eudat.logic.services.ApiContext ;
2023-11-29 12:45:35 +01:00
import eu.eudat.model.* ;
2023-11-29 10:30:38 +01:00
import eu.eudat.model.builder.DescriptionBuilder ;
2023-11-29 12:45:35 +01:00
import eu.eudat.model.builder.DmpBuilder ;
2023-11-29 10:30:38 +01:00
import eu.eudat.model.mapper.publicapi.DescriptionToPublicApiDatasetListingMapper ;
import eu.eudat.model.mapper.publicapi.DescriptionToPublicApiDatasetMapper ;
2023-11-29 12:45:35 +01:00
import eu.eudat.model.mapper.publicapi.DmpToPublicApiDmpListingMapper ;
2023-11-29 10:30:38 +01:00
import eu.eudat.model.publicapi.listingmodels.DatasetPublicListingModel ;
2023-11-28 11:54:08 +01:00
import eu.eudat.model.publicapi.overviewmodels.DatasetPublicModel ;
2023-11-29 10:30:38 +01:00
import eu.eudat.models.data.helpers.responses.ResponseItem ;
import eu.eudat.query.DescriptionQuery ;
2023-11-29 12:45:35 +01:00
import eu.eudat.query.DmpQuery ;
2023-11-29 10:30:38 +01:00
import eu.eudat.query.lookup.DescriptionLookup ;
2023-11-29 12:45:35 +01:00
import eu.eudat.query.lookup.DmpLookup ;
2023-11-27 16:33:24 +01:00
import eu.eudat.types.ApiMessageCode ;
2023-11-29 10:30:38 +01:00
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 ;
2023-11-27 16:33:24 +01:00
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 ;
2023-11-29 12:45:35 +01:00
import org.jetbrains.annotations.NotNull ;
2023-11-27 16:33:24 +01:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import org.springframework.beans.factory.annotation.Autowired ;
2023-11-29 10:30:38 +01:00
import org.springframework.context.MessageSource ;
import org.springframework.context.i18n.LocaleContextHolder ;
2023-11-27 16:33:24 +01:00
import org.springframework.http.HttpStatus ;
import org.springframework.http.ResponseEntity ;
import org.springframework.web.bind.annotation.* ;
2023-11-29 10:30:38 +01:00
import java.util.EnumSet ;
import java.util.List ;
import java.util.Set ;
import java.util.UUID ;
2023-11-27 16:33:24 +01:00
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 extends BaseController {
private static final Logger logger = LoggerFactory . getLogger ( PublicDatasetsDescriptionDocumentation . class ) ;
2023-11-29 10:30:38 +01:00
private final QueryFactory queryFactory ;
private final BuilderFactory builderFactory ;
private final MessageSource messageSource ;
private final DescriptionToPublicApiDatasetMapper descriptionToPublicApiDatasetMapper ;
private final DescriptionToPublicApiDatasetListingMapper descriptionToPublicApiDatasetListingMapper ;
2023-11-29 12:45:35 +01:00
private final DmpToPublicApiDmpListingMapper dmpToPublicApiDmpListingMapper ;
2023-11-27 16:33:24 +01:00
@Autowired
2023-11-29 10:30:38 +01:00
public PublicDatasetsDescriptionDocumentation (
ApiContext apiContext ,
QueryFactory queryFactory ,
BuilderFactory builderFactory ,
MessageSource messageSource ,
DescriptionToPublicApiDatasetMapper descriptionToPublicApiDatasetMapper ,
2023-11-29 12:45:35 +01:00
DescriptionToPublicApiDatasetListingMapper descriptionToPublicApiDatasetListingMapper , DmpToPublicApiDmpListingMapper dmpToPublicApiDmpListingMapper ) {
2023-11-27 16:33:24 +01:00
super ( apiContext ) ;
2023-11-29 10:30:38 +01:00
this . queryFactory = queryFactory ;
this . builderFactory = builderFactory ;
this . messageSource = messageSource ;
this . descriptionToPublicApiDatasetMapper = descriptionToPublicApiDatasetMapper ;
this . descriptionToPublicApiDatasetListingMapper = descriptionToPublicApiDatasetListingMapper ;
2023-11-29 12:45:35 +01:00
this . dmpToPublicApiDmpListingMapper = dmpToPublicApiDmpListingMapper ;
2023-11-27 16:33:24 +01:00
}
@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 " )
2023-11-28 11:54:08 +01:00
public @ResponseBody ResponseEntity < ResponseItem < DataTableData < DatasetPublicListingModel > > > getPaged (
@Valid @RequestBody @io.swagger.v3.oas.annotations.parameters.RequestBody ( description = PublicApiStaticHelpers . Description . getPagedRequestBodyDescription ) DatasetPublicTableRequest datasetTableRequest
) throws Exception {
2023-11-29 10:30:38 +01:00
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 < DescriptionEntity > data = query . collectAs ( lookup . getProject ( ) ) ;
List < Description > models = this . builderFactory . builder ( DescriptionBuilder . class ) . build ( lookup . getProject ( ) , data ) ;
DataTableData < DatasetPublicListingModel > dataTableData = new DataTableData < > ( ) ;
dataTableData . setData ( models . stream ( ) . map ( this . descriptionToPublicApiDatasetListingMapper : : toPublicListingModel ) . toList ( ) ) ;
dataTableData . setTotalCount ( count ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataTableData < DatasetPublicListingModel > > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataTableData ) ) ;
}
2023-11-27 16:33:24 +01:00
@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 " )
2023-11-28 11:54:08 +01:00
public @ResponseBody ResponseEntity < ResponseItem < DatasetPublicModel > > getOverviewSinglePublic (
@PathVariable @Parameter ( description = " fetch the dataset with the given id " , example = " xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx " ) String id
) {
2023-11-29 13:34:37 +01:00
DescriptionLookup lookup = getDescriptionLookup ( ) ;
2023-11-29 10:30:38 +01:00
DescriptionQuery query = this . queryFactory . query ( DescriptionQuery . class ) . authorize ( EnumSet . of ( AuthorizationFlags . Public ) ) . ids ( UUID . fromString ( id ) ) . isActive ( IsActive . Active ) ;
2023-11-29 13:34:37 +01:00
Description model = this . builderFactory . builder ( DescriptionBuilder . class ) . build ( lookup . getProject ( ) , query . firstAs ( lookup . getProject ( ) ) ) ;
2023-11-29 10:30:38 +01:00
if ( model = = null )
throw new MyNotFoundException ( messageSource . getMessage ( " General_ItemNotFound " , new Object [ ] { id , Description . class . getSimpleName ( ) } , LocaleContextHolder . getLocale ( ) ) ) ;
2023-11-29 12:45:35 +01:00
DmpQuery dmpQuery = this . queryFactory . query ( DmpQuery . class ) . authorize ( EnumSet . of ( AuthorizationFlags . Public ) ) . 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 ) ) ;
2023-11-29 10:30:38 +01:00
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DatasetPublicModel > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataset ) ) ;
2023-11-27 16:33:24 +01:00
}
2023-11-29 12:45:35 +01:00
2023-11-29 13:34:37 +01:00
@NotNull
private static DescriptionLookup getDescriptionLookup ( ) {
BaseFieldSet descriptionFieldSet = new BaseFieldSet ( ) ;
Set < String > descriptionFields = Set . of (
Description . _id ,
Description . _label ,
Description . _description ,
Description . _status ,
String . join ( " . " , Description . _createdBy , User . _id ) ,
String . join ( " . " , Description . _createdBy , User . _name ) ,
String . join ( " . " , Description . _descriptionReferences , String . join ( " . " , DescriptionReference . _reference , Reference . _id ) ) ,
String . join ( " . " , Description . _descriptionReferences , String . join ( " . " , DescriptionReference . _reference , Reference . _reference ) ) ,
String . join ( " . " , Description . _descriptionReferences , String . join ( " . " , DescriptionReference . _reference , Reference . _label ) ) ,
String . join ( " . " , Description . _descriptionReferences , String . join ( " . " , DescriptionReference . _reference , Reference . _abbreviation ) ) ,
String . join ( " . " , Description . _descriptionReferences , String . join ( " . " , DescriptionReference . _reference , Reference . _description ) ) ,
String . join ( " . " , Description . _descriptionReferences , String . join ( " . " , DescriptionReference . _reference , Reference . _definition ) ) ,
Description . _createdAt ,
Description . _updatedAt ,
Description . _finalizedAt
) ;
descriptionFieldSet . setFields ( descriptionFields ) ;
DescriptionLookup lookup = new DescriptionLookup ( ) ;
lookup . setProject ( descriptionFieldSet ) ;
return lookup ;
}
2023-11-29 12:45:35 +01:00
@NotNull
private static DmpLookup getDmpLookup ( ) {
BaseFieldSet fieldSet = new BaseFieldSet ( ) ;
Set < String > 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 ;
}
2023-11-27 16:33:24 +01:00
}