Skip to content
Merged
4 changes: 4 additions & 0 deletions doc/release-notes/11588-search-api-doesnt-return-image-url.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## BUG ##
Search API doesn't return image_url after newly created dataset is published.

The Dataset thumbnail will be created automatically when a Dataset is published under the following conditions: The Dataset has no existing thumbnail; The Dataset has image files that can be converted to a thumbnail; The Feature Flag "disable-dataset-thumbnail-autoselect" is not enabled;
4 changes: 4 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/Dataset.java
Original file line number Diff line number Diff line change
Expand Up @@ -763,6 +763,10 @@ public void setThumbnailFile(DataFile thumbnailFile) {
this.thumbnailFile = thumbnailFile;
}

public String getThumbnailUrl() {
return thumbnailFile != null ? SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/" + this.getId() + "/logo" : null;
}

public boolean isUseGenericThumbnail() {
return useGenericThumbnail;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import jakarta.json.JsonObjectBuilder;
import jakarta.persistence.EntityManager;
import jakarta.persistence.NoResultException;
import jakarta.persistence.OptimisticLockException;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import jakarta.persistence.TypedQuery;
Expand Down Expand Up @@ -892,7 +891,7 @@ public Long getThumbnailByVersionId(Long versionId) {

if (thumbnailFileId != null) {
logger.fine("obtained file id: " + thumbnailFileId);
DataFile thumbnailFile = datafileService.find(thumbnailFileId);
DataFile thumbnailFile = getDataFileById(thumbnailFileId);
if (thumbnailFile != null) {
if (datafileService.isThumbnailAvailable(thumbnailFile)) {
assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
Expand Down Expand Up @@ -925,7 +924,7 @@ public Long getThumbnailByVersionId(Long versionId) {
}

if (thumbnailFileId != null) {
DataFile thumbnailFile = datafileService.find(thumbnailFileId);
DataFile thumbnailFile = getDataFileById(thumbnailFileId);
if (thumbnailFile != null) {
if (datafileService.isThumbnailAvailable(thumbnailFile)) {
assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
Expand All @@ -937,7 +936,11 @@ public Long getThumbnailByVersionId(Long versionId) {
}
return null;
}


public DataFile getDataFileById(Long id) {
return datafileService.find(id);
}

private void assignDatasetThumbnailByNativeQuery(Long versionId, Long dataFileId) {
try {
em.createNativeQuery("UPDATE dataset SET thumbnailfile_id=" + dataFileId + " WHERE id in (SELECT dataset_id FROM datasetversion WHERE id=" + versionId + ")").executeUpdate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,11 @@ public String getDatasetCardImageAsUrl(Dataset dataset, Long versionId, boolean
// If no other logo we attempt to auto-select via the optimized, native
// query-based method
// from the DatasetVersionService:
if (!hasDatasetLogo && datasetVersionService.getThumbnailByVersionId(versionId) == null) {
if (!hasDatasetLogo && (!autoselect || datasetVersionService.getThumbnailByVersionId(versionId) == null)) {
return null;
}
}
String url = SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/" + dataset.getId() + "/logo";
String url = dataset.getThumbnailUrl();
logger.fine("getDatasetCardImageAsUrl: " + url);
this.dvobjectThumbnailsMap.put(datasetId,url);
return url;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,16 @@ public Dataset execute(CommandContext ctxt) throws CommandException {

//Use dataset pub date (which may not be the current date for migrated datasets)
updateFiles(new Timestamp(version.getReleaseTime().getTime()), ctxt);


// Populate thumbnail if needed and allowed
if (theDataset.getThumbnailFile() == null && !theDataset.isUseGenericThumbnail()) {
Comment thread
landreev marked this conversation as resolved.
Long thumbnailFileId = ctxt.datasetVersion().getThumbnailByVersionId(version.getId());
if (thumbnailFileId != null) {
theDataset.setThumbnailFile(ctxt.datasetVersion().getDataFileById(thumbnailFileId));
logger.info("Setting default thumbnail " + theDataset.getThumbnailUrl());
}
}

//
// TODO: Not sure if this .merge() is necessary here - ?
// I'm moving a bunch of code from PublishDatasetCommand here; and this .merge()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,7 @@ public static JsonObjectBuilder json(Dataset ds, Boolean returnOwners) {
.add("separator", ds.getSeparator())
.add("publisher", BrandingUtil.getInstallationBrandName())
.add("publicationDate", ds.getPublicationDateFormattedYYYYMMDD())
.add("image_url", ds.getThumbnailUrl())
.add("storageIdentifier", ds.getStorageIdentifier());
if (ds.getGuestbook() != null) {
bld.add("guestbookId", ds.getGuestbook().getId());
Expand Down
23 changes: 11 additions & 12 deletions src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Disabled;

public class DataRetrieverApiIT {

Expand Down Expand Up @@ -78,7 +77,7 @@ public void testRetrieveMyDataAsJsonString() throws InterruptedException {
Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, normalUserApiToken);
createDatasetResponse.prettyPrint();
Integer datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse);
UtilIT.sleepForReindex(datasetId.toString(), normalUserApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetId.toString(), normalUserApiToken);
Response oneDatasetResponse = UtilIT.retrieveMyDataAsJsonString(normalUserApiToken, "", new ArrayList<>(Arrays.asList(6L)));
assertEquals(OK.getStatusCode(), oneDatasetResponse.getStatusCode());
JsonPath jsonPathOneDataset = oneDatasetResponse.getBody().jsonPath();
Expand Down Expand Up @@ -277,13 +276,13 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
createDatasetOneResponse.prettyPrint();
Integer datasetOneId = UtilIT.getDatasetIdFromResponse(createDatasetOneResponse);
String datasetOnePid = UtilIT.getDatasetPersistentIdFromResponse(createDatasetOneResponse);
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);

Response createDatasetTwoResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, userApiToken);
createDatasetTwoResponse.prettyPrint();
Integer datasetTwoId = UtilIT.getDatasetIdFromResponse(createDatasetTwoResponse);
String datasetTwoPid = UtilIT.getDatasetPersistentIdFromResponse(createDatasetTwoResponse);
UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken);

// Request datasets belonging to user
Response twoDatasetsInReviewResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
Expand All @@ -301,13 +300,13 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
Response publishDatasetOne = UtilIT.publishDatasetViaNativeApi(datasetOneId, "major", superUserApiToken);
publishDatasetOne.prettyPrint();
publishDatasetOne.then().assertThat().statusCode(OK.getStatusCode());
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);

// Publish dataset 2
Response publishDatasetTwo = UtilIT.publishDatasetViaNativeApi(datasetTwoId, "major", superUserApiToken);
publishDatasetTwo.prettyPrint();
publishDatasetTwo.then().assertThat().statusCode(OK.getStatusCode());
UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken);

// Request datasets belonging to user
Response twoPublishedDatasetsResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
Expand All @@ -326,7 +325,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
Response addDataToPublishedVersion = UtilIT.addDatasetMetadataViaNative(datasetOnePid, pathToJsonFilePostPub, userApiToken);
addDataToPublishedVersion.prettyPrint();
addDataToPublishedVersion.then().assertThat().statusCode(OK.getStatusCode());
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);

// Request datasets belonging to user
Response twoPublishedDatasetsOneDraftResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
Expand All @@ -350,7 +349,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
Response uploadImage = UtilIT.uploadFileViaNative(datasetTwoId.toString(), pathToFile, userApiToken);
uploadImage.prettyPrint();
uploadImage.then().assertThat().statusCode(OK.getStatusCode());
UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken);

// Request datasets belonging to user
Response twoPublishedDatasetsTwoDraftsResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
Expand All @@ -373,7 +372,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
Response publishDatasetOneMinor = UtilIT.publishDatasetViaNativeApi(datasetOneId, "minor", superUserApiToken);
publishDatasetOneMinor.prettyPrint();
publishDatasetOneMinor.then().assertThat().statusCode(OK.getStatusCode());
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);

// Request datasets belonging to user
Response oneMinorOneMajorOneDraftDatasetResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
Expand Down Expand Up @@ -429,7 +428,7 @@ public void testRetrieveMyDataWithMetadataFields() {
Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken);
String datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse).toString();

UtilIT.sleepForReindex(datasetId, apiToken, 5);
UtilIT.sleepForDatasetIndex(datasetId, apiToken);

Response myDataWithAuthor = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&metadata_fields=citation:author");
myDataWithAuthor.prettyPrint();
Expand Down Expand Up @@ -482,7 +481,7 @@ public void testRetrieveMyDataWithCollections() {

UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken).then().assertThat().statusCode(OK.getStatusCode());

UtilIT.sleepForReindex(datasetPid, apiToken, 5);
UtilIT.sleepForDatasetIndex(datasetPid, apiToken);

// Test that the Dataverse collection that the dataset was created in is returned
Response myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true");
Expand All @@ -506,7 +505,7 @@ public void testRetrieveMyDataWithCollections() {

UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken).then().assertThat().statusCode(OK.getStatusCode());

UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5);
UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken);

// Test that the Dataverse collection that the dataset was linked to is also returned
myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true");
Expand Down
Loading
Loading