diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java index 8ac1ec464bc272..f2cce4f674c69f 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java @@ -10,6 +10,7 @@ import com.linkedin.datahub.graphql.generated.Entity; import com.linkedin.datahub.graphql.generated.EntityRelationship; import com.linkedin.datahub.graphql.generated.RelatedDataset; +import com.linkedin.datahub.graphql.generated.InstitutionalMemoryMetadata; import com.linkedin.datahub.graphql.resolvers.load.EntityTypeResolver; import com.linkedin.datahub.graphql.resolvers.load.LoadableTypeBatchResolver; import com.linkedin.datahub.graphql.resolvers.mutate.MutableTypeResolver; @@ -312,6 +313,13 @@ private static void configureDatasetResolvers(final RuntimeWiring.Builder builde ENTITY_TYPES.stream().collect(Collectors.toList()), (env) -> ((EntityRelationship) env.getSource()).getEntity())) ) + ) + .type("InstitutionalMemoryMetadata", typeWiring -> typeWiring + .dataFetcher("author", new AuthenticatedResolver<>( + new LoadableTypeResolver<>( + CORP_USER_TYPE, + (env) -> ((InstitutionalMemoryMetadata) env.getSource()).getAuthor().getUrn())) + ) ); } diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/common/mappers/InstitutionalMemoryMetadataMapper.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/common/mappers/InstitutionalMemoryMetadataMapper.java index 6afa3171fb99a2..ba6d5427a7bf20 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/common/mappers/InstitutionalMemoryMetadataMapper.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/common/mappers/InstitutionalMemoryMetadataMapper.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.types.common.mappers; import com.linkedin.datahub.graphql.generated.InstitutionalMemoryMetadata; +import com.linkedin.datahub.graphql.generated.CorpUser; import com.linkedin.datahub.graphql.types.mappers.ModelMapper; import javax.annotation.Nonnull; @@ -18,8 +19,14 @@ public InstitutionalMemoryMetadata apply(@Nonnull final com.linkedin.common.Inst final InstitutionalMemoryMetadata result = new InstitutionalMemoryMetadata(); result.setUrl(input.getUrl().toString()); result.setDescription(input.getDescription()); - result.setAuthor(input.getCreateStamp().getActor().toString()); + result.setAuthor(getAuthor(input.getCreateStamp().getActor().toString())); result.setCreated(AuditStampMapper.map(input.getCreateStamp())); return result; } + + private CorpUser getAuthor(String actor) { + CorpUser partialUser = new CorpUser(); + partialUser.setUrn(actor); + return partialUser; + } } diff --git a/datahub-graphql-core/src/main/resources/gms.graphql b/datahub-graphql-core/src/main/resources/gms.graphql index c7692e20904280..38a044e3279e1b 100644 --- a/datahub-graphql-core/src/main/resources/gms.graphql +++ b/datahub-graphql-core/src/main/resources/gms.graphql @@ -508,7 +508,7 @@ type InstitutionalMemoryMetadata { """ The author of this metadata """ - author: String! + author: CorpUser! """ An AuditStamp corresponding to the creation of this resource diff --git a/datahub-web-react/src/Mocks.tsx b/datahub-web-react/src/Mocks.tsx index 2f42d473e18508..b6fddc16a6f833 100644 --- a/datahub-web-react/src/Mocks.tsx +++ b/datahub-web-react/src/Mocks.tsx @@ -266,7 +266,7 @@ export const dataset3 = { elements: [ { url: 'https://www.google.com', - author: 'datahub', + author: { urn: 'urn:li:corpuser:datahub', username: 'datahub', type: EntityType.CorpUser }, description: 'This only points to Google', created: { actor: 'urn:li:corpuser:1', diff --git a/datahub-web-react/src/app/entity/dataset/profile/DatasetProfile.tsx b/datahub-web-react/src/app/entity/dataset/profile/DatasetProfile.tsx index f0a103327db70a..ec5495702fcf49 100644 --- a/datahub-web-react/src/app/entity/dataset/profile/DatasetProfile.tsx +++ b/datahub-web-react/src/app/entity/dataset/profile/DatasetProfile.tsx @@ -125,6 +125,7 @@ export const DatasetProfile = ({ urn }: { urn: string }): JSX.Element => { content: ( { analytics.event({ diff --git a/datahub-web-react/src/app/entity/dataset/profile/Documentation.tsx b/datahub-web-react/src/app/entity/dataset/profile/Documentation.tsx index 89e1080f24185b..29f2f4f794f4f3 100644 --- a/datahub-web-react/src/app/entity/dataset/profile/Documentation.tsx +++ b/datahub-web-react/src/app/entity/dataset/profile/Documentation.tsx @@ -1,11 +1,17 @@ import { Button, Form, Input, Space, Table, Typography } from 'antd'; import React, { useEffect, useMemo, useState } from 'react'; import { Link } from 'react-router-dom'; -import { EntityType, InstitutionalMemoryMetadata, InstitutionalMemoryUpdate } from '../../../../types.generated'; +import { + CorpUser, + EntityType, + InstitutionalMemoryMetadata, + InstitutionalMemoryUpdate, +} from '../../../../types.generated'; import { useEntityRegistry } from '../../../useEntityRegistry'; export type Props = { authenticatedUserUrn?: string; + authenticatedUserUsername?: string; documents: Array; updateDocumentation: (update: InstitutionalMemoryUpdate) => void; }; @@ -35,7 +41,12 @@ function FormInput({ name, placeholder, type }: { name: string; placeholder: str ); } -export default function Documentation({ authenticatedUserUrn, documents, updateDocumentation }: Props) { +export default function Documentation({ + authenticatedUserUrn, + documents, + updateDocumentation, + authenticatedUserUsername, +}: Props) { const entityRegistry = useEntityRegistry(); const [form] = Form.useForm(); @@ -50,7 +61,7 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD () => stagedDocs.map((doc, index) => ({ key: index, - author: doc.author, + author: { urn: doc.author.urn, username: doc.author.username, type: EntityType.CorpUser }, url: doc.url, description: doc.description, createdAt: doc.created.time, @@ -60,7 +71,7 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD const isEditing = (record: any) => record.key === editingIndex; - const onAdd = (authorUrn: string) => { + const onAdd = (authorUrn: string, authorUsername: string) => { setEditingIndex(stagedDocs.length); form.setFieldsValue({ @@ -71,7 +82,7 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD const newDoc = { url: '', description: '', - author: authorUrn, + author: { urn: authorUrn, username: authorUsername, type: EntityType.CorpUser }, created: { time: Date.now(), }, @@ -89,12 +100,12 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD return { url: row.url, description: row.description, - author: doc.author, + author: doc.author.urn, createdAt: doc.created.time, }; } return { - author: doc.author, + author: doc.author.urn, url: doc.url, description: doc.description, createdAt: doc.created.time, @@ -113,7 +124,7 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD const onDelete = (index: number) => { const newDocs = stagedDocs.filter((_, i) => !(index === i)); const updatedInstitutionalMemory = newDocs.map((doc) => ({ - author: doc.author, + author: doc.author.urn, url: doc.url, description: doc.description, })); @@ -147,8 +158,8 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD { title: 'Author', dataIndex: 'author', - render: (authorUrn: string) => ( - {authorUrn} + render: (user: CorpUser) => ( + {user.username} ), }, { @@ -185,8 +196,8 @@ export default function Documentation({ authenticatedUserUrn, documents, updateD
- {authenticatedUserUrn && editingIndex < 0 && ( - )} diff --git a/datahub-web-react/src/app/entity/dataset/profile/__tests__/Documentation.test.tsx b/datahub-web-react/src/app/entity/dataset/profile/__tests__/Documentation.test.tsx index e0360268c9bf61..b5522e61880b1f 100644 --- a/datahub-web-react/src/app/entity/dataset/profile/__tests__/Documentation.test.tsx +++ b/datahub-web-react/src/app/entity/dataset/profile/__tests__/Documentation.test.tsx @@ -10,6 +10,7 @@ describe('Documentation', () => { undefined} /> @@ -17,7 +18,7 @@ describe('Documentation', () => { , ); expect(getByText('Documentation')).toBeInTheDocument(); - expect(getByText('urn:li:corpuser:1')).toBeInTheDocument(); + expect(getByText('1')).toBeInTheDocument(); expect(getByText('https://www.google.com')).toBeInTheDocument(); expect(getByText('Add a link')).toBeInTheDocument(); }); diff --git a/datahub-web-react/src/app/entity/dataset/profile/stories/documentation.ts b/datahub-web-react/src/app/entity/dataset/profile/stories/documentation.ts index eedbbe6fbe17b5..3b62c3e6cf0ec3 100644 --- a/datahub-web-react/src/app/entity/dataset/profile/stories/documentation.ts +++ b/datahub-web-react/src/app/entity/dataset/profile/stories/documentation.ts @@ -1,8 +1,10 @@ +import { EntityType } from '../../../../../types.generated'; + export const sampleDocs = [ { url: 'https://www.google.com', description: 'This doc spans the internet web', - author: 'urn:li:corpuser:1', + author: { urn: 'urn:li:corpuser:1', username: '1', type: EntityType.CorpUser }, created: { time: 0, actor: 'urn:li:corpuser:1', diff --git a/datahub-web-react/src/app/entity/dataset/profile/stories/sampleDataset.ts b/datahub-web-react/src/app/entity/dataset/profile/stories/sampleDataset.ts index e5a3dc72963a8f..2977016b466a2e 100644 --- a/datahub-web-react/src/app/entity/dataset/profile/stories/sampleDataset.ts +++ b/datahub-web-react/src/app/entity/dataset/profile/stories/sampleDataset.ts @@ -29,7 +29,7 @@ export const sampleDataset: Dataset = { elements: [ { url: 'https://www.google.com', - author: 'datahub', + author: { urn: 'urn:li:corpuser:datahub', username: 'datahub', type: EntityType.CorpUser }, description: 'This only points to Google', created: { actor: 'urn:li:corpuser:1', @@ -76,7 +76,7 @@ export const sampleDeprecatedDataset: Dataset = { elements: [ { url: 'https://www.google.com', - author: 'datahub', + author: { urn: 'urn:li:corpuser:datahub', username: 'datahub', type: EntityType.CorpUser }, description: 'This only points to Google', created: { actor: 'urn:li:corpuser:1', diff --git a/datahub-web-react/src/graphql/dataset.graphql b/datahub-web-react/src/graphql/dataset.graphql index f052e06a07d5dc..7d23bf4204ebea 100644 --- a/datahub-web-react/src/graphql/dataset.graphql +++ b/datahub-web-react/src/graphql/dataset.graphql @@ -36,7 +36,10 @@ query getDataset($urn: String!) { institutionalMemory { elements { url - author + author { + urn + username + } description created { actor diff --git a/datahub-web-react/src/graphql/fragments.graphql b/datahub-web-react/src/graphql/fragments.graphql index 48c21285951d15..1eed08d98e5286 100644 --- a/datahub-web-react/src/graphql/fragments.graphql +++ b/datahub-web-react/src/graphql/fragments.graphql @@ -116,7 +116,10 @@ fragment nonRecursiveDatasetFields on Dataset { institutionalMemory { elements { url - author + author { + urn + username + } description created { actor