Metadata Structure by Content Type

Content: Metadata Structure by Content Type

User Intent

"What metadata is captured for each content type? How do I access it?"

Operation

  • Concept: Content metadata fields

  • GraphQL Fields: Type-specific metadata objects

  • Entity Type: Content

  • Common Use Cases: Accessing email details, message info, document properties, image metadata, event details

Metadata Fields Overview

Each ContentType has a corresponding metadata field with type-specific properties automatically captured during ingestion.

TypeScript (Canonical)

import { Graphlit } from 'graphlit-client';
import { ContentTypes, FileTypes } from 'graphlit-client/dist/generated/graphql-types';

const graphlit = new Graphlit();

const content = await graphlit.getContent('content-id');

// Access metadata based on content type
if (content.content.type === ContentTypes.Email && content.content.email) {
  const email = content.content.email;
  console.log(`Subject: ${email.subject}`);
  console.log(`From: ${email.from[0].email}`);
  console.log(`To: ${email.to?.map(p => p.email).join(', ')}`);
  console.log(`Labels: ${email.labels?.join(', ')}`);
  console.log(`Attachments: ${email.attachmentCount}`);
}

if (content.content.type === ContentTypes.Message && content.content.message) {
  const msg = content.content.message;
  console.log(`Channel: ${msg.channelName}`);
  console.log(`Author: ${msg.author?.name} (${msg.author?.email})`);
  console.log(`Mentions: ${msg.mentions?.map(p => p.name).join(', ')}`);
}

if (content.content.fileType === FileTypes.Document && content.content.document) {
  const doc = content.content.document;
  console.log(`Pages: ${doc.pageCount}`);
  console.log(`Author: ${doc.author}`);
  console.log(`Words: ${doc.wordCount}`);
  console.log(`Encrypted: ${doc.isEncrypted}`);
}

Email Metadata (ContentTypes.Email)

Field: content.email (EmailMetadata)

Properties:

Example Access:

Message Metadata (ContentTypes.Message)

Field: content.message (MessageMetadata)

Properties:

Example Access:

Document Metadata (FileDocument)

Field: content.document (DocumentMetadata)

Properties:

Example Access:

Image Metadata (FileImage)

Field: content.image (ImageMetadata)

Properties:

Example Access:

Audio Metadata (FileAudio)

Field: content.audio (AudioMetadata)

Properties:

Example Access:

Video Metadata (FileVideo)

Field: content.video (VideoMetadata)

Properties:

Example Access:

Event Metadata (ContentEvent)

Field: content.event (EventMetadata)

Properties:

Example Access:

Issue Metadata (ContentTypes.Issue)

Field: content.issue (IssueMetadata)

Properties:

Example Access:

Post Metadata (ContentPost)

Field: content.post (PostMetadata)

Properties:

Example Access:

Access email metadata (snake_case fields)

if content.content.type == "EMAIL" and content.content.email: email = content.content.email print(f"Subject: {email.subject}") print(f"From: {email.from_[0].email}") # Note: from_ (reserved word) print(f"Attachments: {email.attachment_count}")

Access message metadata

if content.content.type == "MESSAGE" and content.content.message: msg = content.content.message print(f"Channel: {msg.channel_name}") print(f"Author: {msg.author.name}")

Access document metadata

if content.content.file_type == "DOCUMENT" and content.content.document: doc = content.content.document print(f"Pages: {doc.page_count}") print(f"Words: {doc.word_count}")

Developer Hints

Always Check Type First

Null-Safe Access

PersonReference Pattern

Common Issues & Solutions

Issue: Metadata field is undefined Solution: Check content type matches expected type

Issue: Arrays are null instead of empty Solution: Use nullish coalescing

Issue: Date fields are strings not Date objects Solution: Parse ISO 8601 strings

Production Example

Last updated

Was this helpful?