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 10:30:38 +01:00
import eu.eudat.model.Description ;
import eu.eudat.model.builder.DescriptionBuilder ;
import eu.eudat.model.mapper.publicapi.DescriptionToPublicApiDatasetListingMapper ;
import eu.eudat.model.mapper.publicapi.DescriptionToPublicApiDatasetMapper ;
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 ;
import eu.eudat.query.lookup.DescriptionLookup ;
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 ;
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-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 ,
DescriptionToPublicApiDatasetListingMapper descriptionToPublicApiDatasetListingMapper ) {
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-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 ) ) ;
}
private static DescriptionLookup getDescriptionLookup ( ) {
BaseFieldSet fieldSet = new BaseFieldSet ( ) ;
Set < String > fields ;
fields = Set . of (
) ;
fieldSet . setFields ( fields ) ;
DescriptionLookup lookup = new DescriptionLookup ( ) ;
lookup . setProject ( fieldSet ) ;
return lookup ;
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 10:30:38 +01:00
BaseFieldSet descriptionFieldSet = new BaseFieldSet ( ) ;
Set < String > descriptionFields = Set . of (
) ;
descriptionFieldSet . setFields ( descriptionFields ) ;
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 ( descriptionFieldSet , query . firstAs ( descriptionFieldSet ) ) ;
if ( model = = null )
throw new MyNotFoundException ( messageSource . getMessage ( " General_ItemNotFound " , new Object [ ] { id , Description . class . getSimpleName ( ) } , LocaleContextHolder . getLocale ( ) ) ) ;
DatasetPublicModel dataset = this . descriptionToPublicApiDatasetMapper . toPublicModel ( model ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DatasetPublicModel > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataset ) ) ;
2023-11-27 16:33:24 +01:00
}
}