Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
202 commits
Select commit Hold shift + click to select a range
9bfdcf2
Update to dotnet 9 and update nuget packages
Zeegaan Jun 19, 2024
f6770a9
Update umbraco code version
Zeegaan Jun 19, 2024
38a5d22
Update Directory.Build.props
Zeegaan Jun 24, 2024
07b2fd4
Include preview version in pipeline
Zeegaan Jun 24, 2024
b317b08
update template projects
Zeegaan Jun 24, 2024
53be525
update global json with specific version
Zeegaan Jun 24, 2024
9bf9e89
Update version.json to v15
Zeegaan Jun 24, 2024
749aed0
Rename TrimStart and TrimEnd to string specific
Zeegaan Jun 24, 2024
f599a17
Rename to Exact
Zeegaan Jun 25, 2024
d14e355
Update global.json
Zeegaan Jun 26, 2024
8075adb
Remove includePreviewVersion
Zeegaan Jun 26, 2024
9636433
Merge remote-tracking branch 'origin/v15/feature/update-to-dotnet-9' …
Zeegaan Jun 26, 2024
c84137e
Rename to trim exact
Zeegaan Jun 26, 2024
84c6a7c
Add new Hybridcache project
Zeegaan Jun 27, 2024
4487421
Add tests
Zeegaan Jun 27, 2024
2a7b813
Start implementing PublishedContent.cs
Zeegaan Jun 28, 2024
737348a
Implement repository for content
Zeegaan Jun 28, 2024
972f452
Refactor to use async everywhere
Zeegaan Jul 4, 2024
5770a39
Add cache refresher
Zeegaan Jul 4, 2024
9c2b836
make public as needed for serialization
Zeegaan Jul 4, 2024
437497f
Use content type cache to get content type out
Zeegaan Jul 5, 2024
1c035c0
Refactor to use ContentCacheNode model, that goes in the memory cache
Zeegaan Jul 5, 2024
661bb32
Remove content node kit as its not needed
Zeegaan Jul 5, 2024
1002a5d
Implement tests for ensuring caching
Zeegaan Jul 8, 2024
22c68ff
Implement better asserts
Zeegaan Jul 9, 2024
65e596d
Implement published property
Zeegaan Jul 9, 2024
04dbde3
Refactor to use mapping
Zeegaan Jul 9, 2024
0c7a7e2
Rename to document tests
Zeegaan Jul 9, 2024
42b427e
Update to test properties
Zeegaan Jul 9, 2024
a75c463
Create more tests
Zeegaan Jul 10, 2024
acb745a
Refactor mock tests into own file
Zeegaan Jul 10, 2024
0465971
Update property test
Zeegaan Jul 10, 2024
8233de8
Fix published version of content
Zeegaan Jul 10, 2024
f87181a
Change default cache level to elements
Zeegaan Jul 10, 2024
b82eb60
Refactor to always have draft
Zeegaan Jul 10, 2024
fa15a2e
Refactor to not use PublishedModelFactory
Zeegaan Jul 10, 2024
7149fd8
Added tests
andr317c Jul 10, 2024
a5bb8ae
Added and updated tests
andr317c Jul 10, 2024
4d10def
Fixed tests
andr317c Jul 11, 2024
5a7d435
Don't return empty object with id
Zeegaan Jul 11, 2024
4a73539
More tests
andr317c Jul 11, 2024
a7203f8
Added key
andr317c Jul 11, 2024
7c6b5e1
Another key
andr317c Jul 11, 2024
4151d9f
Refactor CacheService to be responsible for using the hybrid cache
Zeegaan Jul 12, 2024
08bdb8e
Use notification handler to remove deleted content from cache
Zeegaan Jul 12, 2024
26b209f
Add more tests for missing functions
Zeegaan Jul 12, 2024
55341f7
Implement missing methods
Zeegaan Jul 12, 2024
4750985
Remove HasContent as it pertains to routing
Zeegaan Jul 15, 2024
c3c017e
Fik up test
Zeegaan Jul 15, 2024
895e324
formatting
Zeegaan Jul 15, 2024
f9e5276
refactor variable names
Zeegaan Jul 15, 2024
4191c3a
Implement variant tests
Zeegaan Jul 15, 2024
b714596
Map all the published content properties
Zeegaan Jul 15, 2024
197c2ca
Get item out of cache first, to assert updated
Zeegaan Jul 16, 2024
dc22674
Implement member cache
Zeegaan Jul 16, 2024
0c9dad6
Add member test
Zeegaan Jul 16, 2024
4c941bb
Implement media cache
Zeegaan Jul 16, 2024
f03485a
Implement property tests for media tests
Zeegaan Jul 17, 2024
387628c
Refactor tests to use extension method
Zeegaan Jul 17, 2024
7ed8c94
Add more media tests
Zeegaan Jul 17, 2024
1dfd5a7
Refactor properties to no longer have element caching
Zeegaan Jul 18, 2024
6b2b978
Don't use property cache level
Zeegaan Jul 18, 2024
9eab933
Start implementing seeding
Zeegaan Jul 22, 2024
97c7d08
Only seed when main
Zeegaan Jul 22, 2024
33483e6
Add Immutable for performance
Zeegaan Jul 22, 2024
47b6e88
Implement permanent seeding of content
Zeegaan Jul 22, 2024
acae74c
Implement cache settings
Zeegaan Jul 22, 2024
b64ade1
Implement tests for seeding
Zeegaan Jul 22, 2024
632f0ce
Update package version
Zeegaan Jul 23, 2024
905790e
start refactoring nurepo
Zeegaan Jul 25, 2024
026b88b
Merge remote-tracking branch 'origin/v15/feature/hybrid-caching' into…
Zeegaan Jul 25, 2024
61ce2cf
Refactor so draft & published nodes are cached individually
Zeegaan Jul 25, 2024
c2b7879
Refactor RefreshContent to take node instead of IContent
Zeegaan Jul 25, 2024
ab2fce3
Refactor media to also use cache nodes
Zeegaan Jul 26, 2024
fab1df8
Remove member from repo as it isn't cached
Zeegaan Jul 26, 2024
1bb1601
Refactor media to not include preview, as media has no draft
Zeegaan Jul 26, 2024
617ebf0
create new benchmark project
Zeegaan Aug 2, 2024
56dd31c
POC Integration benchmarks with custom api controllers
Migaroez Aug 2, 2024
3b3de87
Merge branch 'v14/dev' into v15/feature/hybrid-caching
Zeegaan Aug 7, 2024
8eef9ce
Start implementing content picker tests
Zeegaan Aug 14, 2024
4807241
Implement domain cache
Zeegaan Aug 15, 2024
6788066
Rework content cache to implement interface
Zeegaan Aug 15, 2024
6b98d8f
Start implementing elements cache
Zeegaan Aug 15, 2024
f12eb47
Implement published snapshot service
Zeegaan Aug 15, 2024
8152c19
Publish snapshot tests
Zeegaan Aug 15, 2024
2bc59e3
Use snapshot for elements cache
Zeegaan Aug 19, 2024
ea93843
Create test proving we don't clear cache when updating content picker
Zeegaan Aug 19, 2024
e7c86cc
Clear entire elements cache
Zeegaan Aug 19, 2024
b3aa4d3
Remove properties from element cache, when content gets updated.
Zeegaan Aug 20, 2024
4b34ac5
Merge remote-tracking branch 'origin/v15/dev' into v15/feature/hybrid…
Zeegaan Aug 21, 2024
69e0324
Rename methods to async
Zeegaan Aug 21, 2024
06d71b4
Refactor to use old cache interfaces instead of new ones
Zeegaan Aug 21, 2024
4b4ff31
Remove snapshot, as it is no longer needed
Zeegaan Aug 21, 2024
27b1202
Fix tests building
Zeegaan Aug 21, 2024
0fe3ed5
Refactor domaincache to not have snapshots
Zeegaan Aug 22, 2024
640b9be
Delete benchmarks
Zeegaan Aug 22, 2024
824a530
Delete benchmarks
Zeegaan Aug 22, 2024
513d08a
Merge remote-tracking branch 'origin/v15/feature/hybrid-caching' into…
Zeegaan Aug 22, 2024
dfaf285
Add HybridCacheProject to Umbraco
Zeegaan Aug 22, 2024
6630b7d
Add comment to route value transformer
Zeegaan Aug 22, 2024
89cb8ff
Implement is draft
Zeegaan Aug 22, 2024
b2bd81a
remove snapshot from property
Zeegaan Aug 22, 2024
0e9067d
V15 updated the hybrid caching integration tests to use ContentEditin…
andr317c Aug 22, 2024
5d373ce
Merge remote-tracking branch 'origin/v15/feature/hybrid-caching' into…
Zeegaan Aug 22, 2024
9e5eed3
Remove entries from cache on delete
Zeegaan Aug 22, 2024
eeb8863
Fix up seeding logic
Zeegaan Aug 22, 2024
9510e03
Don't register hybrid cache twice
Zeegaan Aug 23, 2024
0fe27e2
Change seeded entry options
Zeegaan Aug 23, 2024
2573115
Update hybrid cache package
Zeegaan Aug 23, 2024
0fbd157
Fix up published property to work with delivery api again
Zeegaan Aug 24, 2024
a2c1fc4
Fix dependency injection to work with tests
Zeegaan Aug 26, 2024
d5dd217
Fix naming
nikolajlauridsen Aug 26, 2024
182c17a
Dont make caches nullable
Zeegaan Aug 27, 2024
ceb74b7
Make content node sealed
Zeegaan Aug 27, 2024
e62f24a
Remove path and other unused from content node
Zeegaan Aug 27, 2024
81134ad
Remove hacky 2 phase ctor
Zeegaan Aug 27, 2024
3ae0595
Refactor to actually set content templates
Zeegaan Aug 27, 2024
6d4a20f
Remove umbraco context
Zeegaan Aug 27, 2024
e9e3023
Remove "HasBy" methods
Zeegaan Aug 27, 2024
cdfe257
rename property data
Zeegaan Aug 27, 2024
d370f99
Delete obsolete legacy stuff
Zeegaan Aug 27, 2024
c03dfb6
Add todo for making expiration configurable
Zeegaan Aug 27, 2024
73ace33
Add todo in UmbracoContext
Zeegaan Aug 27, 2024
d881eec
Add clarifying comment in content factory
Zeegaan Aug 27, 2024
8f275ec
Remove xml stuff from published property
Zeegaan Aug 27, 2024
32e749d
Fix according to review
Zeegaan Aug 27, 2024
6af5487
Merge remote-tracking branch 'origin/v15/dev' into v15/feature/hybrid…
Zeegaan Aug 27, 2024
5851239
Make content type cache injectible
Zeegaan Aug 27, 2024
8f68e09
Make content type cache injectible
Zeegaan Aug 27, 2024
6e2d817
Merge branch 'v15/feature/hybrid-caching' of https://github.com/umbra…
Zeegaan Aug 27, 2024
202dee5
Rename to database cache repository
Zeegaan Aug 27, 2024
86f4be2
Rename to document cache
Zeegaan Aug 27, 2024
df9d221
Add TODO
nikolajlauridsen Aug 28, 2024
e8a2c57
Refactor to async
Zeegaan Aug 28, 2024
3705855
Merge remote-tracking branch 'origin/v15/feature/hybrid-caching' into…
Zeegaan Aug 28, 2024
ea39b43
Rename to async
Zeegaan Aug 28, 2024
065979c
Make everything async
Zeegaan Aug 28, 2024
df9f3c2
Remove duplicate line from json schema
Zeegaan Aug 28, 2024
ce732f2
Move Hybrid cache project
Zeegaan Aug 28, 2024
6a00a53
Remove leftover file
nikolajlauridsen Aug 28, 2024
1d65aeb
Refactor to use keys
Zeegaan Aug 28, 2024
184c19a
Merge remote-tracking branch 'origin/v15/dev' into v15/feature/hybrid…
Zeegaan Aug 28, 2024
9c2350b
Refactor published content to no longer have content data, as it is o…
Zeegaan Aug 28, 2024
59f7257
Refactor to member to use proper content node ctor
Zeegaan Aug 28, 2024
9830e23
Move tests to own folder
Zeegaan Aug 28, 2024
8a675d9
Add immutable objects to property and content data for performance
Zeegaan Aug 28, 2024
63cf4fd
Make property data public
Zeegaan Aug 28, 2024
bbd7300
Fix member caching to be singleton
Zeegaan Aug 28, 2024
2cd7ad3
Obsolete GetContentType
Zeegaan Aug 28, 2024
b59e56a
Remove todo
Zeegaan Aug 28, 2024
c941b29
Fix naming
Zeegaan Aug 28, 2024
38e337a
Fix lots of exposed errors due to scope test
Zeegaan Aug 28, 2024
101e253
Add final scope tests
Zeegaan Aug 28, 2024
38d6b11
Rename to document cache service
Zeegaan Aug 29, 2024
86a5a64
Rename test files
Zeegaan Aug 30, 2024
e45fa10
Create new doc type tests
Zeegaan Aug 30, 2024
1ad0b68
Add ignore to tests
Zeegaan Aug 30, 2024
01d48bd
Merge remote-tracking branch 'origin/v15/dev' into v15/feature/hybrid…
Zeegaan Aug 30, 2024
af4f2de
Start implementing refresh for content type save
Zeegaan Aug 30, 2024
bfae478
Clear contenttype cache when contenttype is updated
nikolajlauridsen Sep 3, 2024
73d0523
Fix test
nikolajlauridsen Sep 3, 2024
0693950
Updated tests
andr317c Sep 3, 2024
ee6aaee
Added tests
andr317c Sep 3, 2024
f90c8f4
Use init for ContentSourceDto
nikolajlauridsen Sep 4, 2024
75512dc
Startup of setup
andr317c Sep 4, 2024
d925f52
Fix get by key in PublishedContentTypeCache
nikolajlauridsen Sep 4, 2024
d06de4d
Remove ContentType from PublishedContentTypeCache when contenttype is…
nikolajlauridsen Sep 4, 2024
3ebf3f2
Created interfaces for the builder with the necessary properties
andr317c Sep 5, 2024
6f12fc6
Created builder for PropertyTypeContainer
andr317c Sep 5, 2024
f983dfc
Created builder for PropertyTypeEditing
andr317c Sep 5, 2024
152469a
Created builder for PropertyTypeValidationEditing
andr317c Sep 5, 2024
5378590
Made adjustments to the builder
andr317c Sep 5, 2024
6a339b0
Updated name of usage
andr317c Sep 5, 2024
9d80212
Commented out to test
andr317c Sep 5, 2024
2b99318
Merge remote-tracking branch 'refs/remotes/origin/v15/feature/hybrid-…
andr317c Sep 5, 2024
8a0c3f8
Cleaned up builders
andr317c Sep 5, 2024
373cd2e
Updated integration test setup
andr317c Sep 5, 2024
69e1837
Moved tests
andr317c Sep 5, 2024
4b5a1e6
Merge remote-tracking branch 'refs/remotes/origin/v15/dev' into v15/f…
nikolajlauridsen Sep 6, 2024
7268e47
Merge remote-tracking branch 'origin/v15/feature/hybrid-caching' into…
andr317c Sep 6, 2024
8181e09
Added interface
andr317c Sep 6, 2024
8b0f8ed
Created helper to Convert a IContentType to ContentTypeUpdateModel
andr317c Sep 10, 2024
d0070c5
Added interfaces
andr317c Sep 10, 2024
8038db2
Added builder
andr317c Sep 10, 2024
75ca1a9
Cleaned up builders and added fixes
andr317c Sep 10, 2024
5a2a1d4
Added tests for PublishedContentTypeCache
andr317c Sep 10, 2024
c51de5e
Applied changes in builder
andr317c Sep 10, 2024
65371c5
Builder updates
andr317c Sep 11, 2024
89c847d
Test setup updates
andr317c Sep 11, 2024
08d0162
Updated tests
andr317c Sep 11, 2024
c08287e
Merge remote-tracking branch 'origin/v15/feature/cache-seeding' into …
andr317c Sep 18, 2024
afa1143
Merge remote-tracking branch 'origin/v15/dev' into v15/QA/hybrid-cach…
andr317c Sep 18, 2024
55cb11b
Merge remote-tracking branch 'refs/remotes/origin/v15/feature/cache-s…
andr317c Sep 18, 2024
6908c68
Removed unnecessary setup
andr317c Sep 18, 2024
5e31593
initialized value
andr317c Sep 18, 2024
d90257e
Fixed template test
andr317c Sep 18, 2024
403f45e
Removed test
andr317c Sep 18, 2024
6d89d31
Merge remote-tracking branch 'origin/v15/feature/cache-seeding' into …
andr317c Sep 18, 2024
b595ec5
Updated tests
andr317c Sep 18, 2024
71b6c74
Removed code that was not used
andr317c Sep 18, 2024
34810f0
Removed unused cacheSettings
andr317c Sep 19, 2024
92b9e24
Merge remote-tracking branch 'refs/remotes/origin/v15/feature/cache-s…
andr317c Sep 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Infrastructure.HybridCache.Services;

Expand Down
53 changes: 25 additions & 28 deletions tests/Umbraco.Tests.Common/Builders/ContentEditingBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.

using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.ContentEditing;
using Umbraco.Cms.Tests.Common.Builders.Extensions;
using Umbraco.Cms.Tests.Common.Builders.Interfaces;
Expand All @@ -17,10 +16,10 @@ public class ContentEditingBuilder
IWithKeyBuilder,
IWithContentTypeKeyBuilder,
IWithParentKeyBuilder,
IWithTemplateKeyBuilder
IWithTemplateKeyBuilder,
IBuildContentTypes
{
private IContentType _contentType;
private ContentTypeBuilder _contentTypeBuilder;
private ContentTypeEditingBuilder _contentTypeEditingBuilder;
private IEnumerable<PropertyValueModel> _invariantProperties = [];
private IEnumerable<VariantModel> _variants = [];
private Guid _contentTypeKey;
Expand Down Expand Up @@ -84,8 +83,7 @@ public ContentEditingBuilder WithInvariantProperty(string alias, object value)
return this;
}

public ContentEditingBuilder AddVariant(string culture, string segment, string name,
IEnumerable<PropertyValueModel> properties)
public ContentEditingBuilder AddVariant(string culture, string segment, string name, IEnumerable<PropertyValueModel> properties)
{
var variant = new VariantModel { Culture = culture, Segment = segment, Name = name, Properties = properties };
_variants = _variants.Concat(new[] { variant });
Expand All @@ -104,13 +102,6 @@ public ContentEditingBuilder WithTemplateKey(Guid templateKey)
return this;
}

public ContentEditingBuilder WithContentType(IContentType contentType)
{
_contentTypeBuilder = null;
_contentType = contentType;
return this;
}

public override ContentCreateModel Build()
{
var key = _key ?? Guid.NewGuid();
Expand All @@ -120,15 +111,7 @@ public override ContentCreateModel Build()
var invariantProperties = _invariantProperties;
var variants = _variants;

if (_contentTypeBuilder is null && _contentType is null)
{
throw new InvalidOperationException(
"A content item cannot be constructed without providing a content type. Use AddContentType() or WithContentType().");
}

var contentType = _contentType ?? _contentTypeBuilder.Build();
var content = new ContentCreateModel();

content.InvariantName = invariantName;
if (parentKey is not null)
{
Expand All @@ -140,33 +123,47 @@ public override ContentCreateModel Build()
content.TemplateKey = templateKey;
}

content.ContentTypeKey = contentType.Key;
content.ContentTypeKey = _contentTypeKey;
content.Key = key;
content.InvariantProperties = invariantProperties;
content.Variants = variants;

return content;
}

public static ContentCreateModel CreateBasicContent(IContentType contentType, Guid? key) =>
public static ContentCreateModel CreateBasicContent(Guid contentTypeKey, Guid? key) =>
new ContentEditingBuilder()
.WithKey(key)
.WithContentType(contentType)
.WithContentTypeKey(contentTypeKey)
.WithInvariantName("Home")
.Build();

public static ContentCreateModel CreateSimpleContent(IContentType contentType) =>
public static ContentCreateModel CreateSimpleContent(Guid contentTypeKey) =>
new ContentEditingBuilder()
.WithContentType(contentType)
.WithContentTypeKey(contentTypeKey)
.WithInvariantName("Home")
.WithInvariantProperty("title", "Welcome to our Home page")
.Build();

public static ContentCreateModel CreateSimpleContent(IContentType contentType, string name, Guid? parentKey) =>
public static ContentCreateModel CreateSimpleContent(Guid contentTypeKey, string name, Guid? parentKey) =>
new ContentEditingBuilder()
.WithContentType(contentType)
.WithContentTypeKey(contentTypeKey)
.WithInvariantName(name)
.WithParentKey(parentKey)
.WithInvariantProperty("title", "Welcome to our Home page")
.Build();

public static ContentCreateModel CreateSimpleContent(Guid contentTypeKey, string name) =>
new ContentEditingBuilder()
.WithContentTypeKey(contentTypeKey)
.WithInvariantName(name)
.WithInvariantProperty("title", "Welcome to our Home page")
.Build();

public static ContentCreateModel CreateContentWithTwoVariantProperties(Guid contentTypeKey, string firstCulture, string secondCulture, string propertyAlias, string propertyName) =>
new ContentEditingBuilder()
.WithContentTypeKey(contentTypeKey)
.AddVariant(firstCulture, null, firstCulture, new[] { new PropertyValueModel { Alias = propertyAlias, Value = propertyName } })
.AddVariant(secondCulture, null, secondCulture, new[] { new PropertyValueModel { Alias = propertyAlias, Value = propertyName } })
.Build();
}
240 changes: 240 additions & 0 deletions tests/Umbraco.Tests.Common/Builders/ContentTypeEditingBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.ContentTypeEditing;
using Umbraco.Cms.Tests.Common.Builders.Extensions;
using Umbraco.Cms.Tests.Common.Builders.Interfaces;

namespace Umbraco.Cms.Tests.Common.Builders;

public class ContentTypeEditingBuilder
: ContentTypeBaseBuilder<ContentEditingBuilder, ContentTypeCreateModel>,
IBuildPropertyTypes
{
private Guid? _key;
private Guid? _containerKey;
private ContentTypeCleanup _cleanup = new();
private IEnumerable<Guid> _allowedTemplateKeys;
private Guid? _defaultTemplateKey;
private bool? _allowAtRoot;
private bool? _isElement;
private bool? _variesByCulture;
private bool? _variesBySegment;
private readonly List<PropertyTypeEditingBuilder> _propertyTypeBuilders = [];
private readonly List<PropertyTypeContainerBuilder<ContentTypeEditingBuilder>> _propertyTypeContainerBuilders = [];
private readonly List<ContentTypeSortBuilder> _allowedContentTypeBuilders = [];

public ContentTypeEditingBuilder()
: base(null)
{
}

public ContentTypeEditingBuilder(ContentEditingBuilder parentBuilder)
: base(parentBuilder)
{
}

public ContentTypeEditingBuilder WithDefaultTemplateKey(Guid templateKey)
{
_defaultTemplateKey = templateKey;
return this;
}

public ContentTypeEditingBuilder WithIsElement(bool isElement)
{
_isElement = isElement;
return this;
}

public PropertyTypeContainerBuilder<ContentTypeEditingBuilder> AddPropertyGroup()
{
var builder = new PropertyTypeContainerBuilder<ContentTypeEditingBuilder>(this);
_propertyTypeContainerBuilders.Add(builder);
return builder;
}

public PropertyTypeEditingBuilder AddPropertyType()
{
var builder = new PropertyTypeEditingBuilder(this);
_propertyTypeBuilders.Add(builder);
return builder;
}


public ContentTypeSortBuilder AddAllowedContentType()
{
var builder = new ContentTypeSortBuilder(this);
_allowedContentTypeBuilders.Add(builder);
return builder;
}

public ContentTypeEditingBuilder AddAllowedTemplateKeys(IEnumerable<Guid> templateKeys)
{
_allowedTemplateKeys = templateKeys;
return this;
}

public ContentTypeEditingBuilder WithAllowAtRoot(bool allowAtRoot)
{
_allowAtRoot = allowAtRoot;
return this;
}

public ContentTypeEditingBuilder WithVariesByCulture(bool variesByCulture)
{
_variesByCulture = variesByCulture;
return this;
}

public ContentTypeEditingBuilder WithVariesBySegment(bool variesBySegment)
{
_variesBySegment = variesBySegment;
return this;
}

public override ContentTypeCreateModel Build()
{
ContentTypeCreateModel contentType = new ContentTypeCreateModel();
contentType.Name = GetName();
contentType.Alias = GetAlias();
contentType.Key = GetKey();
contentType.ContainerKey = _containerKey;
contentType.Cleanup = _cleanup;
contentType.AllowedTemplateKeys = _allowedTemplateKeys ?? Array.Empty<Guid>();
contentType.DefaultTemplateKey = _defaultTemplateKey;
contentType.IsElement = _isElement ?? false;
contentType.VariesByCulture = _variesByCulture ?? false;
contentType.VariesBySegment = _variesBySegment ?? false;
contentType.AllowedAsRoot = _allowAtRoot ?? false;
contentType.Properties = _propertyTypeBuilders.Select(x => x.Build());
contentType.Containers = _propertyTypeContainerBuilders.Select(x => x.Build());
contentType.AllowedContentTypes = _allowedContentTypeBuilders.Select(x => x.Build());

return contentType;
}

public static ContentTypeCreateModel CreateBasicContentType(string alias = "umbTextpage", string name = "TextPage", IContentType parent = null)
{
var builder = new ContentTypeEditingBuilder();
return (ContentTypeCreateModel)builder
.WithAlias(alias)
.WithName(name)
.WithParentContentType(parent)
.Build();
}

public static ContentTypeCreateModel CreateSimpleContentType(string alias = "umbTextpage", string name = "TextPage", IContentType parent = null, string propertyGroupName = "Content", Guid? defaultTemplateKey = null)
{
var containerKey = Guid.NewGuid();
var builder = new ContentTypeEditingBuilder();
return (ContentTypeCreateModel)builder
.WithAlias(alias)
.WithName(name)
.WithAllowAtRoot(true)
.WithParentContentType(parent)
.AddPropertyGroup()
.WithKey(containerKey)
.WithName(propertyGroupName)
.Done()
.AddPropertyType()
.WithAlias("title")
.WithDataTypeKey(Constants.DataTypes.Guids.TextareaGuid)
.WithName("Title")
.WithContainerKey(containerKey)
.Done()
.WithDefaultTemplateKey(defaultTemplateKey ?? Guid.Empty)
.AddAllowedTemplateKeys([defaultTemplateKey ?? Guid.Empty])
.Build();
}

public static ContentTypeCreateModel CreateTextPageContentType(string alias = "textPage", string name = "Text Page", Guid defaultTemplateKey = default)
{
var containerKeyOne = Guid.NewGuid();
var containerKeyTwo = Guid.NewGuid();

var builder = new ContentTypeEditingBuilder();
return (ContentTypeCreateModel)builder
.WithAlias(alias)
.WithName(name)
.WithAllowAtRoot(true)
.AddPropertyGroup()
.WithName("Content")
.WithKey(containerKeyOne)
.WithSortOrder(1)
.Done()
.AddPropertyType()
.WithAlias("title")
.WithName("Title")
.WithContainerKey(containerKeyOne)
.WithSortOrder(1)
.Done()
.AddPropertyType()
.WithDataTypeKey(Constants.DataTypes.Guids.RichtextEditorGuid)
.WithAlias("bodyText")
.WithName("Body text")
.WithContainerKey(containerKeyOne)
.WithSortOrder(2)
.Done()
.AddPropertyGroup()
.WithName("Meta")
.WithSortOrder(2)
.WithKey(containerKeyTwo)
.Done()
.AddPropertyType()
.WithAlias("keywords")
.WithName("Keywords")
.WithContainerKey(containerKeyTwo)
.WithSortOrder(1)
.Done()
.AddPropertyType()
.WithAlias("description")
.WithName("Description")
.WithContainerKey(containerKeyTwo)
.WithSortOrder(2)
.Done()
.AddAllowedTemplateKeys([defaultTemplateKey])
.WithDefaultTemplateKey(defaultTemplateKey)
.Build();
}

public static ContentTypeCreateModel CreateElementType(string alias = "textElement", string name = "Text Element")
{
var containerKey = Guid.NewGuid();
var builder = new ContentTypeEditingBuilder();
return (ContentTypeCreateModel)builder
.WithAlias(alias)
.WithName(name)
.WithIsElement(true)
.AddPropertyGroup()
.WithName("Content")
.WithKey(containerKey)
.Done()
.AddPropertyType()
.WithDataTypeKey(Constants.DataTypes.Guids.RichtextEditorGuid)
.WithAlias("bodyText")
.WithName("Body text")
.WithContainerKey(containerKey)
.Done()
.Build();
}

public static ContentTypeCreateModel CreateContentTypeWithDataTypeKey(Guid dataTypeKey, string alias = "textElement", string name = "Text Element" )
{
var containerKey = Guid.NewGuid();
var builder = new ContentTypeEditingBuilder();
return (ContentTypeCreateModel)builder
.WithAlias(alias)
.WithName(name)
.WithIsElement(true)
.AddPropertyGroup()
.WithName("Content")
.WithKey(containerKey)
.Done()
.AddPropertyType()
.WithDataTypeKey(dataTypeKey)
.WithAlias("dataType")
.WithName("Data Type")
.WithContainerKey(containerKey)
.Done()
.Build();
}
}
5 changes: 5 additions & 0 deletions tests/Umbraco.Tests.Common/Builders/ContentTypeSortBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ public ContentTypeSortBuilder(ContentTypeBuilder parentBuilder)
{
}

public ContentTypeSortBuilder(ContentTypeEditingBuilder parentBuilder)
: base(null)
{
}

string IWithAliasBuilder.Alias
{
get => _alias;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ public static T WithKey<T>(this T builder, Guid key)
return builder;
}

public static T WithDataTypeKey<T>(this T builder, Guid key)
where T : IWithDataTypeKeyBuilder
{
builder.DataTypeKey = key;
return builder;
}

public static T WithParentId<T>(this T builder, int parentId)
where T : IWithParentIdBuilder
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Umbraco.Cms.Tests.Common.Builders.Interfaces;

public interface IWIthContainerKeyBuilder
{
Guid? ContainerKey { get; set; }
}
Loading