Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[no ticket][risk=no] Supplemented creator information #8969

Merged
merged 32 commits into from
Dec 10, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
afc952d
Change creator from string to object.
evrii Nov 22, 2024
854e0a3
Change creator usages
evrii Nov 22, 2024
a440c21
Remove unnecessary mapping
evrii Nov 22, 2024
adb2f6d
Fix TestMockFactory
evrii Nov 22, 2024
5021cf4
Update tests with creator refactor.
evrii Nov 22, 2024
1c02e1f
Update test with creator refactor.
evrii Nov 22, 2024
086847f
Cleanup
evrii Nov 22, 2024
3e19bc0
Fix creator check on Workspace edit page.
evrii Nov 22, 2024
ea145a8
Fix test
evrii Nov 22, 2024
2d9ac5b
Remove contact email for now.
evrii Nov 22, 2024
fcef1db
Merge remote-tracking branch 'origin/main' into eric/ownerInfo
evrii Dec 6, 2024
37e4869
Ignore email
evrii Dec 6, 2024
03cd8c4
Update test to include given and family names.
evrii Dec 6, 2024
6b9b1a7
Changing to make deployment-safe
evrii Dec 10, 2024
ccf9a6f
Switched to more appropriate field.
evrii Dec 10, 2024
ca7bf41
Clarified mapping
evrii Dec 10, 2024
ada1d6c
Cleanup
evrii Dec 10, 2024
cc4e8b5
Fixed fields
evrii Dec 10, 2024
3cc4365
Fixed fields
evrii Dec 10, 2024
0adcebe
Cleanup
evrii Dec 10, 2024
d63fc66
Fix mapping issue
evrii Dec 10, 2024
6932030
Fix field usage
evrii Dec 10, 2024
f595bb2
Fix field usage
evrii Dec 10, 2024
8fa37c9
Fix field usage
evrii Dec 10, 2024
63ea159
Lint
evrii Dec 10, 2024
60e4d8f
Updated creator endpoints
evrii Dec 10, 2024
4f2a936
Updated creator endpoints
evrii Dec 10, 2024
c91e3ce
Lint
evrii Dec 10, 2024
becb5dd
Deprecating creator field.
evrii Dec 10, 2024
f2a0e2d
Update creator field.
evrii Dec 10, 2024
465553d
Update field for test
evrii Dec 10, 2024
097c2fe
Fix workspace stub function
evrii Dec 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public enum WorkspaceTargetProperty implements ModelBackedTargetProperty<Workspa
TERRA_NAME("terra_name", Workspace::getTerraName),
NAMESPACE("namespace", Workspace::getNamespace),
CDR_VERSION_ID("cdr_version_id", Workspace::getCdrVersionId),
CREATOR("creator", Workspace::getCreator),
CREATOR("creator", workspace -> workspace.getCreator().getEmail()),
Copy link
Collaborator

@jmthibault79 jmthibault79 Dec 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please switch to getUserName() because email is deprecated. We want to stop using "email" in most cases because it's ambiguous (contact email or username?) and we sometimes get it wrong.

I have a new PR to remove it (and also update UserRole): #8989

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing this out

ACCESS_TIER_SHORT_NAME("access_tier_short_name", Workspace::getAccessTierShortName),

// all fields below here relate to research purpose
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ public interface WorkspaceMapper {
@Mapping(target = "displayName", source = "dbWorkspace.name")
@Mapping(target = "terraName", source = "fcWorkspace.name")
@Mapping(target = "googleBucketName", source = "fcWorkspace.bucketName")
@Mapping(target = "creator", source = "dbWorkspace.creator.username")
@Mapping(target = "creator.userName", source = "dbWorkspace.creator.username")
@Mapping(target = "creator.email", ignore = true) // need to work with security before exposing
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when we do get this approval, I want to use a new field like contactEmail or institutionalEmail, to be explicit about which email it is

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I added a comment.

@Mapping(
target = "initialCredits.expirationEpochMillis",
source = "dbWorkspace.creator",
Expand Down Expand Up @@ -124,7 +125,8 @@ default List<WorkspaceResponse> toApiWorkspaceResponseList(
ResearchPurpose workspaceToResearchPurpose(DbWorkspace dbWorkspace);

@Mapping(target = "cdrVersionId", source = "cdrVersion")
@Mapping(target = "creator", source = "creator.username")
@Mapping(target = "creator.userName", source = "creator.username") // need to work with security before exposing
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the comment belongs on the next line

@Mapping(target = "creator.email", ignore = true)
@Mapping(target = "initialCredits.expired", source = "dbWorkspace.initialCreditsExpired")
@Mapping(
target = "initialCredits.expirationEpochMillis",
Expand Down
2 changes: 1 addition & 1 deletion api/src/main/resources/workbench-api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7278,7 +7278,7 @@ components:
cdrVersionId:
type: string
creator:
type: string
$ref: '#/components/schemas/User'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unfortunately this is not deployment-safe: when the API is deployed with this change, there's a period of time when the UI will be expecting a string here, before the UI is also updated.

Adding a field (maybe creatorUser?) and later deleting the original creator after a release would solve this issue.

billingAccountName:
type: string
googleBucketName:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.pmiops.workbench.db.model.DbWorkspace;
import org.pmiops.workbench.model.BillingStatus;
import org.pmiops.workbench.model.ResearchPurpose;
import org.pmiops.workbench.model.User;
import org.pmiops.workbench.model.Workspace;
import org.pmiops.workbench.model.WorkspaceAccessLevel;
import org.pmiops.workbench.utils.mappers.CommonMappers;
Expand Down Expand Up @@ -113,14 +114,17 @@ public void setUp() {
.researchOutcomeList(Collections.emptyList());
final long now = System.currentTimeMillis();

User creator = new User();
creator.setEmail("[email protected]");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-> userName


workspace1 =
new Workspace()
.etag("etag_1")
.name("DbWorkspace 1")
.terraName("dbworkspace1")
.namespace("aou-rw-local1-c4be869a")
.cdrVersionId("1")
.creator("[email protected]")
.creator(creator)
.billingAccountName("big-bux")
.googleBucketName("bucket o' science")
.accessTierShortName(AccessTierService.REGISTERED_TIER_SHORT_NAME)
Expand Down Expand Up @@ -279,6 +283,8 @@ public void testFireEditAction_sendsChangedProperties() {
.timeReviewed(workspace1.getResearchPurpose().getTimeReviewed() + 1000L)
.controlSet(!workspace1.getResearchPurpose().isControlSet());
final int rpChanges = 5;
User creator = new User();
creator.setUserName("[email protected]");

Workspace editedWorkspace =
clone(workspace1)
Expand All @@ -287,7 +293,7 @@ public void testFireEditAction_sendsChangedProperties() {
// changes
.name("a new name")
.namespace("a new namespace")
.creator("[email protected]");
.creator(creator);
final int wsChanges = 3;

workspaceAuditor.fireEditAction(workspace1, editedWorkspace, dbWorkspace1.getWorkspaceId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.pmiops.workbench.access.AccessTierService;
import org.pmiops.workbench.model.ResearchPurpose;
import org.pmiops.workbench.model.SpecificPopulationEnum;
import org.pmiops.workbench.model.User;
import org.pmiops.workbench.model.Workspace;

class TargetPropertyExtractorTest {
Expand All @@ -16,6 +17,8 @@ class TargetPropertyExtractorTest {
@BeforeEach
void setUp() {
long now = System.currentTimeMillis();
User creator = new User();
creator.setEmail("[email protected]");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

userName


var researchPurpose1 =
new ResearchPurpose()
Expand Down Expand Up @@ -52,7 +55,7 @@ void setUp() {
.terraName("dbworkspace1")
.namespace("aou-rw-local1-c4be869a")
.cdrVersionId("1")
.creator("[email protected]")
.creator(creator)
.accessTierShortName(AccessTierService.REGISTERED_TIER_SHORT_NAME)
.researchPurpose(researchPurpose1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.pmiops.workbench.access.AccessTierService;
import org.pmiops.workbench.model.ResearchPurpose;
import org.pmiops.workbench.model.SpecificPopulationEnum;
import org.pmiops.workbench.model.User;
import org.pmiops.workbench.model.Workspace;

public class WorkspaceTargetPropertyTest {
Expand Down Expand Up @@ -42,13 +43,15 @@ public void setUp() {
.anticipatedFindings("a 4-leaf clover");

long now = System.currentTimeMillis();
User creator = new User();
creator.setEmail("[email protected]");

workspace1 =
new Workspace()
.name("Workspace 1")
.terraName("workspace1")
.namespace("aou-rw-local1-c4be869a")
.creator("[email protected]")
.creator(creator)
.cdrVersionId("1")
.researchPurpose(researchPurposeAllFieldsPopulated)
.creationTime(now)
Expand All @@ -61,7 +64,7 @@ public void setUp() {
.name("Workspace 2")
.terraName("workspace2")
.namespace("aou-rw-local1-c4be869a")
.creator("[email protected]")
.creator(creator)
.cdrVersionId("33")
.researchPurpose(researchPurpose2)
.creationTime(now)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,8 @@ private List<RawlsWorkspaceACLUpdate> convertUserRolesToUpdateAclRequestList(
private Workspace createWorkspaceAndGrantAccess(WorkspaceAccessLevel accessLevel) {
Workspace ws = createWorkspace();
ws = workspacesController.createWorkspace(ws).getBody();
stubGetWorkspace(ws.getNamespace(), ws.getTerraName(), ws.getCreator(), accessLevel);
stubGetWorkspace(
ws.getNamespace(), ws.getTerraName(), ws.getCreator().getUserName(), accessLevel);
return ws;
}

Expand Down Expand Up @@ -669,7 +670,7 @@ public void testCreateWorkspace() {
assertThat(retrievedWorkspace.getCdrVersionId()).isEqualTo(cdrVersionId);
assertThat(retrievedWorkspace.getAccessTierShortName())
.isEqualTo(registeredTier.getShortName());
assertThat(retrievedWorkspace.getCreator()).isEqualTo(LOGGED_IN_USER_EMAIL);
assertThat(retrievedWorkspace.getCreator().getUserName()).isEqualTo(LOGGED_IN_USER_EMAIL);
assertThat(retrievedWorkspace.getName()).isEqualTo(testWorkspaceDisplayName);
assertThat(retrievedWorkspace.getDisplayName()).isEqualTo(testWorkspaceDisplayName);
assertThat(retrievedWorkspace.getTerraName()).isEqualTo(testWorkspaceTerraName);
Expand Down Expand Up @@ -905,7 +906,7 @@ public void testGetWorkspaceOperation_withWorkspace() {
stubGetWorkspace(
workspace.getNamespace(),
workspace.getTerraName(),
workspace.getCreator(),
workspace.getCreator().getUserName(),
WorkspaceAccessLevel.READER);

WorkspaceOperation operation =
Expand Down Expand Up @@ -1248,7 +1249,10 @@ public void testReaderUpdateWorkspaceThrows() {
UpdateWorkspaceRequest request = new UpdateWorkspaceRequest();
request.setWorkspace(ws);
stubGetWorkspace(
ws.getNamespace(), ws.getTerraName(), ws.getCreator(), WorkspaceAccessLevel.READER);
ws.getNamespace(),
ws.getTerraName(),
ws.getCreator().getUserName(),
WorkspaceAccessLevel.READER);
workspacesController.updateWorkspace(ws.getNamespace(), ws.getTerraName(), request);
});
}
Expand All @@ -1264,7 +1268,10 @@ public void testWriterUpdateWorkspaceThrows() {
UpdateWorkspaceRequest request = new UpdateWorkspaceRequest();
request.setWorkspace(ws);
stubGetWorkspace(
ws.getNamespace(), ws.getTerraName(), ws.getCreator(), WorkspaceAccessLevel.WRITER);
ws.getNamespace(),
ws.getTerraName(),
ws.getCreator().getUserName(),
WorkspaceAccessLevel.WRITER);
workspacesController.updateWorkspace(ws.getNamespace(), ws.getTerraName(), request);
});
}
Expand Down Expand Up @@ -2102,7 +2109,7 @@ private void assertConceptSetClone(
assertThat(clonedConceptSet.getName()).isEqualTo(originalConceptSet.getName());
assertThat(clonedConceptSet.getDomain()).isEqualTo(originalConceptSet.getDomain());
assertThat(clonedConceptSet.getCriteriums()).isEqualTo(originalConceptSet.getCriteriums());
assertThat(clonedConceptSet.getCreator()).isEqualTo(clonedWorkspace.getCreator());
assertThat(clonedConceptSet.getCreator()).isEqualTo(clonedWorkspace.getCreator().getUserName());
assertThat(clonedConceptSet.getCreationTime()).isEqualTo(clonedWorkspace.getCreationTime());
assertThat(clonedConceptSet.getLastModifiedTime())
.isEqualTo(clonedWorkspace.getLastModifiedTime());
Expand Down Expand Up @@ -2180,7 +2187,7 @@ public void testCloneWorkspaceDifferentOwner() {
.getBody()
.getWorkspace();

assertThat(workspace2.getCreator()).isEqualTo(cloner.getUsername());
assertThat(workspace2.getCreator().getUserName()).isEqualTo(cloner.getUsername());
}

@Test
Expand Down Expand Up @@ -2397,7 +2404,7 @@ public void testCloneWorkspaceIncludeUserRoles() {
.getBody()
.getWorkspace();

assertThat(clonedWorkspace.getCreator()).isEqualTo(cloner.getUsername());
assertThat(clonedWorkspace.getCreator().getUserName()).isEqualTo(cloner.getUsername());

verify(fireCloudService)
.updateWorkspaceACL(
Expand Down Expand Up @@ -2839,7 +2846,10 @@ public void testGetBillingUsage() {
Workspace ws = createWorkspace();
ws = workspacesController.createWorkspace(ws).getBody();
stubGetWorkspace(
ws.getNamespace(), ws.getTerraName(), ws.getCreator(), WorkspaceAccessLevel.OWNER);
ws.getNamespace(),
ws.getTerraName(),
ws.getCreator().getUserName(),
WorkspaceAccessLevel.OWNER);
when(mockInitialCreditsService.getWorkspaceFreeTierBillingUsage(any())).thenReturn(cost);

WorkspaceBillingUsageResponse workspaceBillingUsageResponse =
Expand All @@ -2855,7 +2865,10 @@ public void testGetBillingUsageWithoutAccess() {
Workspace ws = createWorkspace();
ws = workspacesController.createWorkspace(ws).getBody();
stubGetWorkspace(
ws.getNamespace(), ws.getTerraName(), ws.getCreator(), WorkspaceAccessLevel.READER);
ws.getNamespace(),
ws.getTerraName(),
ws.getCreator().getUserName(),
WorkspaceAccessLevel.READER);
workspacesController.getBillingUsage(ws.getNamespace(), ws.getTerraName());
});
}
Expand All @@ -2865,7 +2878,10 @@ public void testGetBillingUsageWithNoSpend() {
Workspace ws = createWorkspace();
ws = workspacesController.createWorkspace(ws).getBody();
stubGetWorkspace(
ws.getNamespace(), ws.getTerraName(), ws.getCreator(), WorkspaceAccessLevel.OWNER);
ws.getNamespace(),
ws.getTerraName(),
ws.getCreator().getUserName(),
WorkspaceAccessLevel.OWNER);
WorkspaceBillingUsageResponse workspaceBillingUsageResponse =
workspacesController.getBillingUsage(ws.getNamespace(), ws.getTerraName()).getBody();
assertThat(workspaceBillingUsageResponse.getCost()).isEqualTo(0.0d);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
import org.pmiops.workbench.model.ResearchPurpose;
import org.pmiops.workbench.model.SexAtBirthV2;
import org.pmiops.workbench.model.SexualOrientationV2;
import org.pmiops.workbench.model.User;
import org.pmiops.workbench.model.Workspace;
import org.pmiops.workbench.model.YesNoPreferNot;
import org.pmiops.workbench.rawls.model.RawlsWorkspaceAccessLevel;
Expand Down Expand Up @@ -119,6 +120,12 @@ public static Workspace createWorkspace(
List<ResearchOutcomeEnum> ResearchOutcomeEnumsList = new ArrayList<>();
ResearchOutcomeEnumsList.add(ResearchOutcomeEnum.IMPROVED_RISK_ASSESMENT);

User creator = new User();
creator.setEmail("[email protected]");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rm, to ensure that this field is not actually what we're reading

creator.setUserName("[email protected]");
creator.setGivenName("Jay");
creator.setFamilyName("Tester");

return new Workspace()
.etag("\"1\"")
.name(workspaceDisplayName)
Expand All @@ -131,7 +138,7 @@ public static Workspace createWorkspace(
.billingAccountName(WORKSPACE_BILLING_ACCOUNT_NAME)
.googleProject(DEFAULT_GOOGLE_PROJECT)
.creationTime(1588097211621L)
.creator("[email protected]")
.creator(creator)
.creationTime(Instant.parse("2000-01-01T00:00:00.00Z").toEpochMilli())
.lastModifiedTime(1588097211621L)
.googleProject(DEFAULT_GOOGLE_PROJECT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@
public class WorkspaceMapperTest {
private static final String FIRECLOUD_NAMESPACE = "aou-xxxxxxx";
private static final String CREATOR_EMAIL = "[email protected]";
private static final String CREATOR_GIVEN_NAME = "Oscar";
private static final String CREATOR_FAMILY_NAME = "Calhoun";
private static final long CREATOR_USER_ID = 101L;
private static final long WORKSPACE_DB_ID = 222L;
private static final int WORKSPACE_VERSION = 2;
Expand Down Expand Up @@ -145,6 +147,8 @@ public void setUp() {
final DbUser creatorUser =
new DbUser()
.setUsername(CREATOR_EMAIL)
.setGivenName(CREATOR_GIVEN_NAME)
.setFamilyName(CREATOR_FAMILY_NAME)
.setUserId(CREATOR_USER_ID)
.setUserInitialCreditsExpiration(
new DbUserInitialCreditsExpiration()
Expand Down Expand Up @@ -213,7 +217,9 @@ public void testConvertsDbToApiWorkspace() {
assertThat(ws.getName()).isEqualTo(WORKSPACE_AOU_NAME);
assertThat(ws.getNamespace()).isEqualTo(FIRECLOUD_NAMESPACE);
assertThat(ws.getCdrVersionId()).isEqualTo(Long.toString(CDR_VERSION_ID));
assertThat(ws.getCreator()).isEqualTo(CREATOR_EMAIL);
assertThat(ws.getCreator().getUserName()).isEqualTo(CREATOR_EMAIL);
assertThat(ws.getCreator().getGivenName()).isEqualTo(CREATOR_GIVEN_NAME);
assertThat(ws.getCreator().getFamilyName()).isEqualTo(CREATOR_FAMILY_NAME);
assertThat(ws.getInitialCredits().getExpirationEpochMillis())
.isEqualTo(INITIAL_CREDITS_EXPIRATION_TIMESTAMP.getTime());
assertThat(ws.getGoogleBucketName()).isEqualTo(FIRECLOUD_BUCKET_NAME);
Expand Down
2 changes: 1 addition & 1 deletion ui/src/app/pages/admin/workspace/admin-workspace.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export class AdminWorkspaceImpl extends React.Component<Props, State> {
<>
<Collaborators
{...{ collaborators }}
creator={workspace.creator}
creator={workspace.creator.userName}
/>
<CohortBuilder {...{ workspaceObjects }} />
<CloudStorageObjects
Expand Down
2 changes: 1 addition & 1 deletion ui/src/app/pages/workspace/workspace-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ export const WorkspaceCard = fp.flow(withNavigation)(
</div>
{useFeaturedWorkspacePageUi && (
<div style={{ fontSize: 12 }}>
Created By: {workspace.creator.split('@')[0]}
Created By: {workspace.creator.userName.split('@')[0]}
</div>
)}
</FlexColumn>
Expand Down
2 changes: 1 addition & 1 deletion ui/src/app/pages/workspace/workspace-edit.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ describe(WorkspaceEdit.name, () => {
],
researchOutcomeList: [ResearchOutcomeEnum.DECREASE_ILLNESS_BURDEN],
},
creator: ProfileStubVariables.PROFILE_STUB.username,
creator: { userName: ProfileStubVariables.PROFILE_STUB.username },
};

workspaceEditMode = WorkspaceEditMode.Create;
Expand Down
4 changes: 2 additions & 2 deletions ui/src/app/pages/workspace/workspace-edit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1430,7 +1430,7 @@ export const WorkspaceEdit = fp.flow(
return (
// can set billing account in Create and Duplicate modes
!this.isMode(WorkspaceEditMode.Edit) ||
workspace?.creator === profile?.username
workspace?.creator?.userName === profile?.username
);
}

Expand Down Expand Up @@ -1742,7 +1742,7 @@ export const WorkspaceEdit = fp.flow(
</div>
<FlexRow>
<TooltipTrigger
content={`Only the workspace creator ${this.props.workspace?.creator} can change the billing account.`}
content={`Only the workspace creator ${this.props.workspace?.creator?.userName} can change the billing account.`}
disabled={this.canSetBillingAccount(
this.props.workspace,
profile
Expand Down
4 changes: 2 additions & 2 deletions ui/src/app/pages/workspace/workspace-share.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -494,8 +494,8 @@ export const WorkspaceShare = fp.flow(withUserProfile())(
>
When you share this workspace as a ‘Writer’ or an ‘Owner’,
the initial credits of the creator of the workspace (
{this.props.workspace.creator}) will be used for all
analysis in this workspace.
{this.props.workspace.creator.userName}) will be used for
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are a few other instances of this which need changing:

  • EnvironmentInformedActionPanel
  • BasicInformation

all analysis in this workspace.
</div>
)}
</ModalTitle>
Expand Down
2 changes: 1 addition & 1 deletion ui/src/testing/stubs/featured-workspaces-service-stub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export class FeaturedWorkspacesApiStub extends FeaturedWorkspaceApi {
return {
workspace: {
...workspace,
creator: '[email protected]',
creator: { userName: '[email protected]' },
featuredCategory: category as FeaturedWorkspaceCategory,
},
accessLevel: WorkspaceAccessLevel.OWNER,
Expand Down