Skip to content

Extending Media Data Structures in Nikcio.UHeadless

Nikcio.UHeadless provides flexibility to extend and replace media data structures to accommodate your specific needs. This documentation outlines three examples of how you can extend the media data structures.

Example 1: Simple Media Model

  1. Create your own media model by inheriting from BasicMedia:
using Nikcio.UHeadless.Base.Basics.Models;
using Nikcio.UHeadless.Base.Properties.Factories;
using Nikcio.UHeadless.ContentTypes.Basics.Models;
using Nikcio.UHeadless.ContentTypes.Factories;
using Nikcio.UHeadless.Media.Basics.Models;
using Nikcio.UHeadless.Media.Commands;
using Nikcio.UHeadless.Media.Factories;
public class MyMedia : BasicMedia
{
public string MyCustomValue { get; set; }
public MyMedia(CreateMedia createMedia, IPropertyFactory<BasicProperty> propertyFactory, IContentTypeFactory<BasicContentType> contentTypeFactory, IMediaFactory<BasicMedia> mediaFactory) : base(createMedia, propertyFactory, contentTypeFactory, mediaFactory)
{
MyCustomValue = "Custom Value";
}
}
  1. Extend the query where you want the model to be present. In this example, we extend the MediaAtRoot query:
using Nikcio.UHeadless.Media.Queries;
public class MyMediaAtRootQuery : MediaAtRootQuery<MyMedia>
{
}
  1. Register the query in Nikcio.UHeadless:
.AddUHeadless(new()
{
UHeadlessGraphQLOptions = new()
{
GraphQLExtensions = (IRequestExecutorBuilder builder) =>
{
builder.UseMediaQueries(); // Use this from v4.1.0+ (Only add one)
builder.AddTypeExtension<MyMediaAtRootQuery>();
return builder;
},
},
})
  1. Open /graphql and observe your new model for the MediaAtRoot query.

Example 2: Extended Media Model with Custom Property

  1. Create your property model by inheriting from BasicProperty:
using Nikcio.UHeadless.Base.Basics.Models;
using Nikcio.UHeadless.Base.Properties.Commands;
using Nikcio.UHeadless.Base.Properties.Factories;
public class MyProperty : BasicProperty
{
public string MyString { get; set; }
public MyProperty(CreateProperty createProperty, IPropertyValueFactory propertyValueFactory) : base(createProperty, propertyValueFactory)
{
MyString = "My string";
}
}
  1. Create your media model by inheriting from BasicMedia<TProperty>:
using Nikcio.UHeadless.Base.Basics.Models;
using Nikcio.UHeadless.Base.Properties.Factories;
using Nikcio.UHeadless.ContentTypes.Basics.Models;
using Nikcio.UHeadless.ContentTypes.Factories;
using Nikcio.UHeadless.Media.Basics.Models;
using Nikcio.UHeadless.Media.Commands;
using Nikcio.UHeadless.Media.Factories;
public class MyMediaWithMyProperty : BasicMedia<MyProperty>
{
public string MyCustomValue { get; set; }
public MyMediaWithMyProperty(CreateMedia createMedia, IPropertyFactory<MyProperty> propertyFactory, IContentTypeFactory<BasicContentType> contentTypeFactory, IMediaFactory<BasicMedia<MyProperty, BasicContentType>> mediaFactory) : base(createMedia, propertyFactory, contentTypeFactory, mediaFactory)
{
MyCustomValue = "Custom Value";
}
}
  1. Extend the query where you want the model to be present. In this example, we extend the MediaAtRoot query:
using Nikcio.UHeadless.Media.Queries;
public class MyMediaAtRootQueryWithMyProperty : MediaAtRootQuery<MyMediaWithMyProperty>
{
}
  1. Register the query in Nikcio.UHeadless:
.AddUHeadless(new()
{
UHeadlessGraphQLOptions = new()
{
GraphQLExtensions = (IRequestExecutorBuilder builder) =>
{
builder.UseMediaQueries(); // Use this from v4.1.0+ (Only add one)
builder.AddTypeExtension<MyMediaAtRootQueryWithMyProperty>();
return builder;
},
},
})
  1. Open /graphql and observe your new model for the MediaAtRoot query.

Example 3: Creating Media Model from Scratch

  1. Create your own media model by inheriting from Media<TProperty>:
using System.Collections.Generic;
using HotChocolate;
using HotChocolate.Data;
using Nikcio.UHeadless.Base.Basics.Models;
using Nikcio.UHeadless.Base.Properties.Factories;
using Nikcio.UHeadless.Media.Commands;
using Nikcio.UHeadless.Media.Models;
public class MyMediaFromScratch : Media<BasicProperty>
{
public string MyCustomValue { get; set; }
/// <inheritdoc/>
[GraphQLDescription("Gets the properties of the element.")]
[UseFiltering]
public virtual IEnumerable<BasicProperty?>? Properties => Content != null ? PropertyFactory.CreateProperties(Content, Culture, Segment, Fallback) : default;
public MyMediaFromScratch(CreateMedia createMedia, IPropertyFactory<BasicProperty> propertyFactory) : base(createMedia, propertyFactory)
{
MyCustomValue = "Custom Value";
}
}
  1. Extend the query where you want the model to be present. In this example, we extend the MediaAtRoot query:
using Nikcio.UHeadless.Media.Queries;
public class MyMediaAtRootQueryWithMyMediaFromScratch : MediaAtRootQuery<MyMediaFromScratch>
{
}
  1. Register the query in Nikcio.UHeadless:
.AddUHeadless(new()
{
UHeadlessGraphQLOptions = new()
{
GraphQLExtensions = (IRequestExecutorBuilder builder) =>
{
builder.UseMediaQueries(); // Use this from v4.1.0+ (Only add one)
builder.AddTypeExtension<MyMediaAtRootQueryWithMyMediaFromScratch>();
return builder;
},
},
})
  1. Open /graphql and observe your new model for the MediaAtRoot query.

These examples demonstrate different ways to extend media data structures in Nikcio.UHeadless. Choose the method that best suits your requirements and customize the models and queries accordingly.

Note: Make sure to include the necessary namespaces and dependencies based on your project structure.