fix(ui/graphql) Handle groups in institutionalMemory aspect (#11934)

This commit is contained in:
Chris Collins 2024-11-25 09:49:16 -05:00 committed by GitHub
parent 56a5dcaaea
commit 41f7fc9949
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 111 additions and 19 deletions

View File

@ -63,6 +63,7 @@ import com.linkedin.datahub.graphql.generated.Deprecation;
import com.linkedin.datahub.graphql.generated.Domain;
import com.linkedin.datahub.graphql.generated.ERModelRelationship;
import com.linkedin.datahub.graphql.generated.ERModelRelationshipProperties;
import com.linkedin.datahub.graphql.generated.Entity;
import com.linkedin.datahub.graphql.generated.EntityPath;
import com.linkedin.datahub.graphql.generated.EntityRelationship;
import com.linkedin.datahub.graphql.generated.EntityRelationshipLegacy;
@ -312,6 +313,7 @@ import com.linkedin.datahub.graphql.resolvers.type.EntityInterfaceTypeResolver;
import com.linkedin.datahub.graphql.resolvers.type.HyperParameterValueTypeResolver;
import com.linkedin.datahub.graphql.resolvers.type.PlatformSchemaUnionTypeResolver;
import com.linkedin.datahub.graphql.resolvers.type.PropertyValueResolver;
import com.linkedin.datahub.graphql.resolvers.type.ResolvedActorResolver;
import com.linkedin.datahub.graphql.resolvers.type.ResultsTypeResolver;
import com.linkedin.datahub.graphql.resolvers.type.TimeSeriesAspectInterfaceTypeResolver;
import com.linkedin.datahub.graphql.resolvers.user.CreateNativeUserResetTokenResolver;
@ -1730,12 +1732,22 @@ public class GmsGraphQLEngine {
.type(
"InstitutionalMemoryMetadata",
typeWiring ->
typeWiring.dataFetcher(
"author",
new LoadableTypeResolver<>(
corpUserType,
(env) ->
((InstitutionalMemoryMetadata) env.getSource()).getAuthor().getUrn())))
typeWiring
.dataFetcher(
"author",
new LoadableTypeResolver<>(
corpUserType,
(env) ->
((InstitutionalMemoryMetadata) env.getSource())
.getAuthor()
.getUrn()))
.dataFetcher(
"actor",
new EntityTypeResolver(
this.entityTypes,
(env) ->
(Entity)
((InstitutionalMemoryMetadata) env.getSource()).getActor())))
.type(
"DatasetStatsSummary",
typeWiring ->
@ -2242,6 +2254,7 @@ public class GmsGraphQLEngine {
"HyperParameterValueType",
typeWiring -> typeWiring.typeResolver(new HyperParameterValueTypeResolver()))
.type("PropertyValue", typeWiring -> typeWiring.typeResolver(new PropertyValueResolver()))
.type("ResolvedActor", typeWiring -> typeWiring.typeResolver(new ResolvedActorResolver()))
.type("Aspect", typeWiring -> typeWiring.typeResolver(new AspectInterfaceTypeResolver()))
.type(
"TimeSeriesAspect",

View File

@ -0,0 +1,25 @@
package com.linkedin.datahub.graphql.resolvers.type;
import com.linkedin.datahub.graphql.generated.CorpGroup;
import com.linkedin.datahub.graphql.generated.CorpUser;
import graphql.TypeResolutionEnvironment;
import graphql.schema.GraphQLObjectType;
import graphql.schema.TypeResolver;
public class ResolvedActorResolver implements TypeResolver {
public static final String CORP_USER = "CorpUser";
public static final String CORP_GROUP = "CorpGroup";
@Override
public GraphQLObjectType getType(TypeResolutionEnvironment env) {
if (env.getObject() instanceof CorpUser) {
return env.getSchema().getObjectType(CORP_USER);
} else if (env.getObject() instanceof CorpGroup) {
return env.getSchema().getObjectType(CORP_GROUP);
} else {
throw new RuntimeException(
"Unrecognized object type provided to type resolver, Type:" + env.getObject().toString());
}
}
}

View File

@ -28,6 +28,7 @@ public class InstitutionalMemoryMetadataMapper {
result.setDescription(input.getDescription()); // deprecated field
result.setLabel(input.getDescription());
result.setAuthor(getAuthor(input.getCreateStamp().getActor().toString()));
result.setActor(ResolvedActorMapper.map(input.getCreateStamp().getActor()));
result.setCreated(AuditStampMapper.map(context, input.getCreateStamp()));
result.setAssociatedUrn(entityUrn.toString());
return result;

View File

@ -0,0 +1,31 @@
package com.linkedin.datahub.graphql.types.common.mappers;
import com.linkedin.common.urn.Urn;
import com.linkedin.datahub.graphql.generated.CorpGroup;
import com.linkedin.datahub.graphql.generated.CorpUser;
import com.linkedin.datahub.graphql.generated.EntityType;
import com.linkedin.datahub.graphql.generated.ResolvedActor;
import com.linkedin.metadata.Constants;
import javax.annotation.Nonnull;
public class ResolvedActorMapper {
public static final ResolvedActorMapper INSTANCE = new ResolvedActorMapper();
public static ResolvedActor map(@Nonnull final Urn actorUrn) {
return INSTANCE.apply(actorUrn);
}
public ResolvedActor apply(@Nonnull final Urn actorUrn) {
if (actorUrn.getEntityType().equals(Constants.CORP_GROUP_ENTITY_NAME)) {
CorpGroup partialGroup = new CorpGroup();
partialGroup.setUrn(actorUrn.toString());
partialGroup.setType(EntityType.CORP_GROUP);
return partialGroup;
}
CorpUser partialUser = new CorpUser();
partialUser.setUrn(actorUrn.toString());
partialUser.setType(EntityType.CORP_USER);
return (ResolvedActor) partialUser;
}
}

View File

@ -3005,8 +3005,14 @@ type InstitutionalMemoryMetadata {
"""
The author of this metadata
Deprecated! Use actor instead for users or groups.
"""
author: CorpUser!
author: CorpUser! @deprecated(reason: "Use `actor`")
"""
The author of this metadata
"""
actor: ResolvedActor!
"""
An AuditStamp corresponding to the creation of this resource
@ -3834,6 +3840,8 @@ enum CorpUserStatus {
ACTIVE
}
union ResolvedActor = CorpUser | CorpGroup
"""
A DataHub User entity, which represents a Person on the Metadata Entity Graph
"""

View File

@ -566,6 +566,12 @@ export const dataset3 = {
username: 'datahub',
type: EntityType.CorpUser,
},
actor: {
__typename: 'CorpUser',
urn: 'urn:li:corpuser:datahub',
username: 'datahub',
type: EntityType.CorpUser,
},
description: 'This only points to Google',
label: 'This only points to Google',
created: {

View File

@ -29,7 +29,7 @@ export default function LinkButton({ link }: Props) {
href={link.url}
target="_blank"
rel="noreferrer"
key={`${link.label}-${link.url}-${link.author}`}
key={`${link.label}-${link.url}-${link.actor.urn}`}
>
<LinkOutlined />
{link.description || link.label}

View File

@ -3,7 +3,7 @@ import { Link } from 'react-router-dom';
import styled from 'styled-components/macro';
import { message, Button, List, Typography, Modal, Form, Input } from 'antd';
import { LinkOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons';
import { EntityType, InstitutionalMemoryMetadata } from '../../../../../../types.generated';
import { InstitutionalMemoryMetadata } from '../../../../../../types.generated';
import { useEntityData, useMutationUrn } from '../../../EntityContext';
import { useEntityRegistry } from '../../../../../useEntityRegistry';
import { ANTD_GRAY } from '../../../constants';
@ -182,10 +182,8 @@ export const LinkList = ({ refetch }: LinkListProps) => {
description={
<>
Added {formatDateString(link.created.time)} by{' '}
<Link
to={`${entityRegistry.getEntityUrl(EntityType.CorpUser, link.author.urn)}`}
>
{link.author.username}
<Link to={`${entityRegistry.getEntityUrl(link.actor.type, link.actor.urn)}`}>
{entityRegistry.getDisplayName(link.actor.type, link.actor)}
</Link>
</>
}

View File

@ -99,6 +99,7 @@ export const updateEntityLink = ({ entity, institutionalMemory }: UpdateEntityLi
description: e.description as string,
label: e.description as string,
author: { urn: e.author, username: '', type: EntityType.CorpUser },
actor: { urn: e.author, username: '', type: EntityType.CorpUser },
created: { time: Date.now(), actor: getActor(), __typename: 'AuditStamp' },
associatedUrn: dataEntity.urn,
};

View File

@ -19,9 +19,8 @@ query getDomain($urn: String!) {
institutionalMemory {
elements {
url
author {
urn
username
actor {
...resolvedActorFields
}
description
created {

View File

@ -202,12 +202,22 @@ fragment embedFields on Embed {
renderUrl
}
fragment resolvedActorFields on ResolvedActor {
... on CorpUser {
urn
...entityDisplayNameFields
}
... on CorpGroup {
urn
...entityDisplayNameFields
}
}
fragment institutionalMemoryFields on InstitutionalMemory {
elements {
url
author {
urn
username
actor {
...resolvedActorFields
}
description
created {