Skip to content

Commit

Permalink
Merge changes from release-516 into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
nickgros committed Oct 4, 2024
1 parent 0c3479f commit ebc35a9
Show file tree
Hide file tree
Showing 7 changed files with 228 additions and 14 deletions.
4 changes: 4 additions & 0 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ jobs:
MAVEN_USERNAME: ${{ secrets.PLATFORM_ARTIFACTORY_USER }}
MAVEN_USERPWD: ${{ secrets.PLATFORM_ARTIFACTORY_PWD }}

- name: setup-job-summary
run: |
echo "| version | ${{ env.pomversion }} |" > $GITHUB_STEP_SUMMARY
call-test:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'pull_request' }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public enum FeatureFlagKey {
// If enabled, use the re-implemented ACL Editor for entities
REACT_ENTITY_ACL_EDITOR("REACT_ENTITY_ACL_EDITOR"),

// If enabled, sharing settings will appear in a dialog immediately after uploading one or more files.
SHOW_SHARING_SETTINGS_AFTER_UPLOAD("SHOW_SHARING_SETTINGS_AFTER_UPLOAD"),

// Last flag is used only for tests
TEST_FLAG_ONLY("TEST_FLAG_ONLY");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3295,4 +3295,32 @@ public FluentFuture<Void> deleteSessionAccessToken() {
String url = getAuthServiceUrl() + SESSION_ACCESS_TOKEN;
return getFuture(cb -> doDelete(url, cb));
}

public void getEntityBenefactorAcl(
String entityId,
AsyncCallback<AccessControlList> cb
) {
// Retrieving the benefactor ACL is always permitted regardless of permissions, so only retrieve that part of the bundle.
EntityBundleRequest request = new EntityBundleRequest();
request.setIncludeBenefactorACL(true);
String url = getRepoServiceUrl() + ENTITY + "/" + entityId + BUNDLE2;

doPost(
url,
request,
OBJECT_TYPE.EntityBundle,
true,
new AsyncCallback<EntityBundle>() {
@Override
public void onSuccess(EntityBundle result) {
cb.onSuccess(result.getBenefactorAcl());
}

@Override
public void onFailure(Throwable caught) {
cb.onFailure(caught);
}
}
);
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,38 @@
package org.sagebionetworks.web.client.widget.entity.download;

import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import org.sagebionetworks.repo.model.Entity;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.FeatureFlagKey;
import org.sagebionetworks.web.client.events.EntityUpdatedEvent;
import org.sagebionetworks.web.client.utils.CallbackP;
import org.sagebionetworks.web.client.widget.SynapseWidgetPresenter;
import org.sagebionetworks.web.client.widget.sharing.EntityAccessControlListModalWidget;

public class UploadDialogWidget
implements UploadDialogWidgetView.Presenter, SynapseWidgetPresenter {

private UploadDialogWidgetView view;
private Uploader uploader;
private final EventBus eventBus;
private final EntityAccessControlListModalWidget entityAclEditor;
private final FeatureFlagConfig featureFlagConfig;

@Inject
public UploadDialogWidget(UploadDialogWidgetView view, Uploader uploader) {
public UploadDialogWidget(
UploadDialogWidgetView view,
Uploader uploader,
EventBus eventBus,
EntityAccessControlListModalWidget entityAccessControlListModalWidget,
FeatureFlagConfig featureFlagConfig
) {
this.view = view;
this.uploader = uploader;
this.eventBus = eventBus;
this.entityAclEditor = entityAccessControlListModalWidget;
this.featureFlagConfig = featureFlagConfig;
view.setPresenter(this);
}

Expand All @@ -40,8 +57,21 @@ public void configure(
view.configureDialog(title, body);

// add handlers for closing the window
uploader.setSuccessHandler(() -> {
uploader.setSuccessHandler(benefactorId -> {
view.hideDialog();
if (
benefactorId != null &&
featureFlagConfig.isFeatureEnabled(
FeatureFlagKey.SHOW_SHARING_SETTINGS_AFTER_UPLOAD
)
) {
entityAclEditor.configure(
benefactorId,
() -> eventBus.fireEvent(new EntityUpdatedEvent(benefactorId)),
true
);
entityAclEditor.setOpen(true);
}
});

uploader.setCancelHandler(() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import java.util.List;
import org.sagebionetworks.repo.model.AccessControlList;
import org.sagebionetworks.repo.model.Entity;
import org.sagebionetworks.repo.model.Folder;
import org.sagebionetworks.repo.model.attachment.UploadResult;
Expand Down Expand Up @@ -790,10 +791,30 @@ public void onSuccess(Entity result) {
entity = result;
view.showInfo(DisplayConstants.TEXT_LINK_SUCCESS);
if (successHandler != null) {
successHandler.onSuccessfulUpload();
}
jsClient.getEntityBenefactorAcl(
result.getId(),
new AsyncCallback<AccessControlList>() {
@Override
public void onSuccess(AccessControlList benefactorAcl) {
if (benefactorAcl.getId().equals(entity.getId())) {
// Don't show the ACL modal if the entity is its own benefactor
successHandler.onSuccessfulUpload(null);
} else {
successHandler.onSuccessfulUpload(benefactorAcl.getId());
}
entityUpdated();
}

entityUpdated();
@Override
public void onFailure(Throwable caught) {
view.showErrorMessage(caught.getMessage());
// Upload was still a success, benefactor ID is not required to continue
successHandler.onSuccessfulUpload(null);
entityUpdated();
}
}
);
}
}

@Override
Expand Down Expand Up @@ -1009,9 +1030,30 @@ private void uploadSuccess() {
view.resetToInitialState();
resetUploadProgress();
if (successHandler != null) {
successHandler.onSuccessfulUpload();
jsClient.getEntityBenefactorAcl(
entityId,
new AsyncCallback<AccessControlList>() {
@Override
public void onSuccess(AccessControlList benefactorAcl) {
if (benefactorAcl.getId().equals(entityId)) {
// Don't show the ACL modal if the entity is its own benefactor
successHandler.onSuccessfulUpload(null);
} else {
successHandler.onSuccessfulUpload(benefactorAcl.getId());
}
entityUpdated();
}

@Override
public void onFailure(Throwable caught) {
view.showErrorMessage(caught.getMessage());
// Upload was still a success, benefactor ID is not required to continue.
successHandler.onSuccessfulUpload(null);
entityUpdated();
}
}
);
}
entityUpdated();
}

private void resetUploadProgress() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
package org.sagebionetworks.web.unitclient.widget.entity.download;

import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.event.shared.EventBus;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.sagebionetworks.repo.model.Entity;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.FeatureFlagKey;
import org.sagebionetworks.web.client.events.CancelHandler;
import org.sagebionetworks.web.client.events.UploadSuccessHandler;
import org.sagebionetworks.web.client.jsinterop.EntityAclEditorModalProps;
import org.sagebionetworks.web.client.utils.CallbackP;
import org.sagebionetworks.web.client.widget.entity.download.UploadDialogWidget;
import org.sagebionetworks.web.client.widget.entity.download.UploadDialogWidgetView;
import org.sagebionetworks.web.client.widget.entity.download.Uploader;
import org.sagebionetworks.web.client.widget.sharing.EntityAccessControlListModalWidget;

@RunWith(MockitoJUnitRunner.Silent.class)
public class UploadDialogTest {
Expand All @@ -28,15 +37,84 @@ public class UploadDialogTest {
@Mock
Uploader mockUploader;

@Mock
EventBus mockEventBus;

@Mock
EntityAccessControlListModalWidget mockEntityAccessControlListModalWidget;

@Mock
FeatureFlagConfig mockFeatureFlagConfig;

@Captor
ArgumentCaptor<UploadSuccessHandler> uploadSuccessCaptor;

@Captor
ArgumentCaptor<
EntityAclEditorModalProps.Callback
> updateAclSuccessCallbackCaptor;

UploadDialogWidget widget;

@Before
public void before() throws Exception {
widget = new UploadDialogWidget(view, mockUploader);
widget =
new UploadDialogWidget(
view,
mockUploader,
mockEventBus,
mockEntityAccessControlListModalWidget,
mockFeatureFlagConfig
);
}

@Test
public void testConfigure() {
when(
mockFeatureFlagConfig.isFeatureEnabled(
FeatureFlagKey.SHOW_SHARING_SETTINGS_AFTER_UPLOAD
)
)
.thenReturn(false);

String title = "dialog title";
Entity entity = mock(Entity.class);
String parentEntityId = "parent";
CallbackP<String> fileHandleIdCallback = mock(CallbackP.class);
boolean isEntity = true;
widget.configure(
title,
entity,
parentEntityId,
fileHandleIdCallback,
isEntity
);

verify(mockUploader)
.configure(entity, parentEntityId, fileHandleIdCallback, isEntity);
verify(view).configureDialog(eq(title), any());

verify(mockUploader).setSuccessHandler(uploadSuccessCaptor.capture());
verify(mockUploader).setCancelHandler(any(CancelHandler.class));

// simulate a successful upload
String benefactorId = "syn123";
uploadSuccessCaptor.getValue().onSuccessfulUpload(benefactorId);
verify(view).hideDialog();
verify(mockEntityAccessControlListModalWidget, never())
.configure(eq(benefactorId), any(), anyBoolean());
verify(mockEntityAccessControlListModalWidget, never()).setOpen(true);
}

@Test
public void testSharingSettingsFeatureEnabled() {
when(
mockFeatureFlagConfig.isFeatureEnabled(
FeatureFlagKey.SHOW_SHARING_SETTINGS_AFTER_UPLOAD
)
)
.thenReturn(true);

String title = "dialog title";
Entity entity = mock(Entity.class);
String parentEntityId = "parent";
Expand All @@ -54,8 +132,24 @@ public void testConfigure() {
.configure(entity, parentEntityId, fileHandleIdCallback, isEntity);
verify(view).configureDialog(eq(title), any());

verify(mockUploader).setSuccessHandler(any(UploadSuccessHandler.class));
verify(mockUploader).setSuccessHandler(uploadSuccessCaptor.capture());
verify(mockUploader).setCancelHandler(any(CancelHandler.class));

// simulate a successful upload
String benefactorId = "syn123";
uploadSuccessCaptor.getValue().onSuccessfulUpload(benefactorId);
verify(view).hideDialog();
verify(mockEntityAccessControlListModalWidget)
.configure(
eq(benefactorId),
updateAclSuccessCallbackCaptor.capture(),
eq(true)
);
verify(mockEntityAccessControlListModalWidget).setOpen(true);

// Simulate a successful ACL save
updateAclSuccessCallbackCaptor.getValue().run();
verify(mockEventBus).fireEvent(any());
}

@Test
Expand Down
Loading

0 comments on commit ebc35a9

Please sign in to comment.