All files / app/core/domain/interfaces metadata-entry.ts

100% Statements 12/12
100% Branches 12/12
100% Functions 3/3
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109                                                                                                      1x 1x 1x 1x 1x                                 6x                                   18x       18x 4x     18x 1x     18x            
/**
 * BUILT WITH O2.SERVICES AI HIVE
 * 
 * This file was created by AI Hive - a dynamic swarm of AI agents that
 * transform customer requirements into shipped products, handling every 
 * phase of the software engineering lifecycle.
 * 
 * IMPORTANT: Keep this file focused and under 200 lines to ensure 
 * AI agents can effectively work with it.
 * 
 * Learn more: https://o2.services
 */
 
/**
 * Metadata entry for establishing relationships between content items
 */
export interface MetadataContent {
  // Temporal information
  timestamp: number;            // Unix timestamp of creation
  
  // Content references
  references: ContentReference[];
  
  // Authorship
  authors: AuthorReference[];
  
  // Version control
  version: VersionInfo;
}
 
/**
 * Reference to content with MIME type information
 */
export interface ContentReference {
  hash: string;                 // CAS hash of referenced content
  mimeType: string;            // MIME type (e.g., 'text/plain', 'image/jpeg')
  mimeTypeSource: 'detected' | 'manual';  // How mime type was determined
  relationship?: string;        // Optional relationship type (e.g., 'attachment', 'citation')
}
 
/**
 * Reference to an author with their role
 */
export interface AuthorReference {
  authorHash: string;          // Hash reference to author entry
  role: AuthorRole;            // Author's role in this content
}
 
/**
 * Possible roles for authors
 */
export enum AuthorRole {
  CREATOR = 'creator',         // Original creator
  EDITOR = 'editor',           // Made modifications
  CONTRIBUTOR = 'contributor', // Minor contributions
  REVIEWER = 'reviewer'        // Reviewed content
}
 
 
/**
 * Version control information
 */
export interface VersionInfo {
  version: string;            // Semantic version (e.g., '1.0.0')
  previousVersion?: string;   // Hash of previous metadata record
  changeDescription?: string; // What changed in this version
}
 
/**
 * Type guard to check if content is metadata
 */
export function isMetadataContent(content: any): content is MetadataContent {
  return content 
    && typeof content.timestamp === 'number'
    && Array.isArray(content.references)
    && Array.isArray(content.authors)
    && content.version
    && typeof content.version.version === 'string';
}
 
/**
 * Helper to create a metadata content object
 */
export function createMetadataContent(params: {
  references: ContentReference[];
  authors: AuthorReference[];
  previousVersion?: string;
  changeDescription?: string;
  version?: string;
}): MetadataContent {
  const versionInfo: VersionInfo = {
    version: params.version || '1.0.0'
  };
  
  if (params.previousVersion !== undefined) {
    versionInfo.previousVersion = params.previousVersion;
  }
  
  if (params.changeDescription !== undefined) {
    versionInfo.changeDescription = params.changeDescription;
  }
  
  return {
    timestamp: Date.now(),
    references: params.references,
    authors: params.authors,
    version: versionInfo
  };
}