* Add cache refresher * make public as needed for serialization * Use content type cache to get content type out * Refactor to use ContentCacheNode model, that goes in the memory cache * Remove content node kit as its not needed * Implement tests for ensuring caching * Implement better asserts * Implement published property * Refactor to use mapping * Rename to document tests * Update to test properties * Create more tests * Refactor mock tests into own file * Update property test * Fix published version of content * Change default cache level to elements * Refactor to always have draft * Refactor to not use PublishedModelFactory * Added tests * Added and updated tests * Fixed tests * Don't return empty object with id * More tests * Added key * Another key * Refactor CacheService to be responsible for using the hybrid cache * Use notification handler to remove deleted content from cache * Add more tests for missing functions * Implement missing methods * Remove HasContent as it pertains to routing * Fik up test * formatting * refactor variable names * Implement variant tests * Map all the published content properties * Get item out of cache first, to assert updated * Implement member cache * Add member test * Implement media cache * Implement property tests for media tests * Refactor tests to use extension method * Add more media tests * Refactor properties to no longer have element caching * Don't use property cache level * Start implementing seeding * Only seed when main * Add Immutable for performance * Implement permanent seeding of content * Implement cache settings * Implement tests for seeding * Update package version * start refactoring nurepo * Refactor so draft & published nodes are cached individually * Refactor RefreshContent to take node instead of IContent * Refactor media to also use cache nodes * Remove member from repo as it isn't cached * Refactor media to not include preview, as media has no draft * create new benchmark project * POC Integration benchmarks with custom api controllers * Start implementing content picker tests * Implement domain cache * Rework content cache to implement interface * Start implementing elements cache * Implement published snapshot service * Publish snapshot tests * Use snapshot for elements cache * Create test proving we don't clear cache when updating content picker * Clear entire elements cache * Remove properties from element cache, when content gets updated. * Rename methods to async * Refactor to use old cache interfaces instead of new ones * Remove snapshot, as it is no longer needed * Fix tests building * Refactor domaincache to not have snapshots * Delete benchmarks * Delete benchmarks * Add HybridCacheProject to Umbraco * Add comment to route value transformer * Implement is draft * remove snapshot from property * V15 updated the hybrid caching integration tests to use ContentEditingService (#16947) * Added builder extension withParentKey * Created builder with ContentEditingService * Added usage of the ContentEditingService to SETUP * Started using ContentEditingService builder in tests * Updated builder extensions * Fixed builder * Clean up * Clean up, not done * Added Ids * Remove entries from cache on delete * Fix up seeding logic * Don't register hybrid cache twice * Change seeded entry options * Update hybrid cache package * Fix up published property to work with delivery api again * Fix dependency injection to work with tests * Fix naming * Dont make caches nullable * Make content node sealed * Remove path and other unused from content node * Remove hacky 2 phase ctor * Refactor to actually set content templates * Remove umbraco context * Remove "HasBy" methods * rename property data * Delete obsolete legacy stuff * Add todo for making expiration configurable * Add todo in UmbracoContext * Add clarifying comment in content factory * Remove xml stuff from published property * Fix according to review * Make content type cache injectible * Make content type cache injectible * Rename to database cache repository * Rename to document cache * Add TODO * Refactor to async * Rename to async * Make everything async * Remove duplicate line from json schema * Move Hybrid cache project * Remove leftover file * Refactor to use keys * Refactor published content to no longer have content data, as it is on the node itself * Refactor to member to use proper content node ctor * Move tests to own folder * Add immutable objects to property and content data for performance * Make property data public * Fix member caching to be singleton * Obsolete GetContentType * Remove todo * Fix naming * Fix lots of exposed errors due to scope test * Add final scope tests * Rename to document cache service * Rename test files * Create new doc type tests * Add ignore to tests * Start implementing refresh for content type save * Clear contenttype cache when contenttype is updated * Fix test Teh contenttype is not upated unless the property is dirty * Updated tests * Added tests * Use init for ContentSourceDto * Startup of setup * Fix get by key in PublishedContentTypeCache * Remove ContentType from PublishedContentTypeCache when contenttype is deleted * Created interfaces for the builder with the necessary properties * Created builder for PropertyTypeContainer * Created builder for PropertyTypeEditing * Created builder for PropertyTypeValidationEditing * Made adjustments to the builder * Updated name of usage * Commented out to test * Cleaned up builders * Updated integration test setup * Moved tests * Added interface * Add IDocumentSeedKeyProvider and migrate existing logic to seed key provider * Added functionality to the INavigationQueryService to get root keys * Fixed issue with navigation * Created helper to Convert a IContentType to ContentTypeUpdateModel * Added interfaces * Added builder * Cleaned up builders and added fixes * Added tests for PublishedContentTypeCache * Applied changes in builder * Add BreadthFirstKeyProvider * Use ISet for seedkey providers * Implement GetContentSource by key * Seed the cache with keys provided by seed key providers * Builder updates * Test setup updates * Updated tests * Dont require contenttype keys for seeding * Fix cache settings * Don't inject cache settings into SeedingNotificationHandler * Fix tests * Use enlistment for setting updated cache item * Pin seeded nodes for longer * Fix BreadthFirstKeyProvider * Fix ContentTypeSeedKeyProvider * Fix tests * Only seed published documents * Only cache published if contentCacheNode is not draft * Fix incorrect templateId * Removed unnecessary setup * initialized value * Fixed template test * Removed test * Updated tests * Removed code that was not used * Removed unused cacheSettings * Re-organize to support media cache seeding * Add MediaBreadthFirstKeyProvider * Seed media * Don't use IdKeyMap when removing content from cache * Don't clear IdKeyMap in DocumentCacheService * Add unit tests * Don't use IdKeyMap when deleting media * Add default value to timespan * Use cancellation tokens when doing loop * Fixed Models Builder error * Builder testing * Media test * Created builders * Updated method from getByKey to getById to maintain structure * Updated test setup * Moved tests * Cleaned up builders * Added helper * Added space * Updated tests * Cleaned setup * Added tests for MediaTypes * Uncommented tests * Added builder extensions * Added interfaces for builder methods * Updated to use interface pattern * Updated name * Used builder * Cleaned up test * Added media scope tests * Removed PropertyTypeModelBuilder * moved PropertyTypeModelBuilder to PropertyTypeEditingBuilder * Removed constructor * Removed duplicate * Fixed naming * Reverted * Removed space * Added todos * Removed only run on linux * Commet out DocumentHybridCacheTemplateTest again This is fixed in the release branch * Update media when media type is updated * Remove todo the tests pass now --------- Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Co-authored-by: Zeegaan <skrivdetud@gmail.com> Co-authored-by: Sven Geusens <sge@umbraco.dk> Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch> Co-authored-by: Bjarke Berg <mail@bergmania.dk>
349 lines
9.4 KiB
C#
349 lines
9.4 KiB
C#
// Copyright (c) Umbraco.
|
|
// See LICENSE for more details.
|
|
|
|
using System.Globalization;
|
|
using Umbraco.Cms.Core.Models;
|
|
using Umbraco.Cms.Tests.Common.Builders.Interfaces;
|
|
|
|
namespace Umbraco.Cms.Tests.Common.Builders.Extensions;
|
|
|
|
public static class BuilderExtensions
|
|
{
|
|
public static T WithId<T>(this T builder, int id)
|
|
where T : IWithIdBuilder
|
|
{
|
|
builder.Id = id;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithId<T, TId>(this T builder, TId id)
|
|
where T : IWithIdBuilder<TId>
|
|
{
|
|
builder.Id = id;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithoutIdentity<T>(this T builder)
|
|
where T : IWithIdBuilder
|
|
{
|
|
builder.Id = 0;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithCreatorId<T>(this T builder, int creatorId)
|
|
where T : IWithCreatorIdBuilder
|
|
{
|
|
builder.CreatorId = creatorId;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithCreateDate<T>(this T builder, DateTime createDate)
|
|
where T : IWithCreateDateBuilder
|
|
{
|
|
builder.CreateDate = createDate;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithUpdateDate<T>(this T builder, DateTime updateDate)
|
|
where T : IWithUpdateDateBuilder
|
|
{
|
|
builder.UpdateDate = updateDate;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithDeleteDate<T>(this T builder, DateTime deleteDate)
|
|
where T : IWithDeleteDateBuilder
|
|
{
|
|
builder.DeleteDate = deleteDate;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithAlias<T>(this T builder, string alias)
|
|
where T : IWithAliasBuilder
|
|
{
|
|
builder.Alias = alias;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithName<T>(this T builder, string name)
|
|
where T : IWithNameBuilder
|
|
{
|
|
builder.Name = name;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithKey<T>(this T builder, Guid key)
|
|
where T : IWithKeyBuilder
|
|
{
|
|
builder.Key = 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
|
|
{
|
|
builder.ParentId = parentId;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithParentContentType<T>(this T builder, IContentTypeComposition parent)
|
|
where T : IWithParentContentTypeBuilder
|
|
{
|
|
builder.Parent = parent;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithTrashed<T>(this T builder, bool trashed)
|
|
where T : IWithTrashedBuilder
|
|
{
|
|
builder.Trashed = trashed;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithLevel<T>(this T builder, int level)
|
|
where T : IWithLevelBuilder
|
|
{
|
|
builder.Level = level;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithPath<T>(this T builder, string path)
|
|
where T : IWithPathBuilder
|
|
{
|
|
builder.Path = path;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithSortOrder<T>(this T builder, int sortOrder)
|
|
where T : IWithSortOrderBuilder
|
|
{
|
|
builder.SortOrder = sortOrder;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithDescription<T>(this T builder, string description)
|
|
where T : IWithDescriptionBuilder
|
|
{
|
|
builder.Description = description;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithIcon<T>(this T builder, string icon)
|
|
where T : IWithIconBuilder
|
|
{
|
|
builder.Icon = icon;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithThumbnail<T>(this T builder, string thumbnail)
|
|
where T : IWithThumbnailBuilder
|
|
{
|
|
builder.Thumbnail = thumbnail;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithLogin<T>(this T builder, string username, string rawPasswordValue)
|
|
where T : IWithLoginBuilder
|
|
{
|
|
builder.Username = username;
|
|
builder.RawPasswordValue = rawPasswordValue;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithEmail<T>(this T builder, string email)
|
|
where T : IWithEmailBuilder
|
|
{
|
|
builder.Email = email;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithFailedPasswordAttempts<T>(this T builder, int failedPasswordAttempts)
|
|
where T : IWithFailedPasswordAttemptsBuilder
|
|
{
|
|
builder.FailedPasswordAttempts = failedPasswordAttempts;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithIsApproved<T>(this T builder, bool isApproved)
|
|
where T : IWithIsApprovedBuilder
|
|
{
|
|
builder.IsApproved = isApproved;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithIsLockedOut<T>(this T builder, bool isLockedOut, DateTime? lastLockoutDate = null)
|
|
where T : IWithIsLockedOutBuilder
|
|
{
|
|
builder.IsLockedOut = isLockedOut;
|
|
if (lastLockoutDate.HasValue)
|
|
{
|
|
builder.LastLockoutDate = lastLockoutDate.Value;
|
|
}
|
|
|
|
return builder;
|
|
}
|
|
|
|
public static T WithLastLoginDate<T>(this T builder, DateTime lastLoginDate)
|
|
where T : IWithLastLoginDateBuilder
|
|
{
|
|
builder.LastLoginDate = lastLoginDate;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithLastPasswordChangeDate<T>(this T builder, DateTime lastPasswordChangeDate)
|
|
where T : IWithLastPasswordChangeDateBuilder
|
|
{
|
|
builder.LastPasswordChangeDate = lastPasswordChangeDate;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithPropertyTypeIdsIncrementingFrom<T>(this T builder, int propertyTypeIdsIncrementingFrom)
|
|
where T : IWithPropertyTypeIdsIncrementingFrom
|
|
{
|
|
builder.PropertyTypeIdsIncrementingFrom = propertyTypeIdsIncrementingFrom;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithIsContainer<T>(this T builder, Guid? listView)
|
|
where T : IWithIsContainerBuilder
|
|
{
|
|
builder.ListView = listView;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithCultureInfo<T>(this T builder, string cultureCode)
|
|
where T : IWithCultureInfoBuilder
|
|
{
|
|
builder.CultureInfo = CultureInfo.GetCultureInfo(cultureCode);
|
|
return builder;
|
|
}
|
|
|
|
public static T WithSupportsPublishing<T>(this T builder, bool supportsPublishing)
|
|
where T : IWithSupportsPublishing
|
|
{
|
|
builder.SupportsPublishing = supportsPublishing;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithPropertyValues<T>(this T builder, object propertyValues, string? culture = null,
|
|
string? segment = null)
|
|
where T : IWithPropertyValues
|
|
{
|
|
builder.PropertyValues = propertyValues;
|
|
builder.PropertyValuesCulture = culture;
|
|
builder.PropertyValuesSegment = segment;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithDate<T>(this T builder, DateTime date) where T : IWithDateBuilder
|
|
{
|
|
builder.Date = date;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithInvariantName<T>(this T builder, string invariantName)
|
|
where T : IWithInvariantNameBuilder
|
|
{
|
|
builder.InvariantName = invariantName;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithKey<T>(this T builder, Guid? key)
|
|
where T : IWithKeyBuilder
|
|
{
|
|
builder.Key = key;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithContentTypeKey<T>(this T builder, Guid contentTypeKey)
|
|
where T : IWithContentTypeKeyBuilder
|
|
{
|
|
builder.ContentTypeKey = contentTypeKey;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithParentKey<T>(this T builder, Guid? parentKey)
|
|
where T : IWithParentKeyBuilder
|
|
{
|
|
builder.ParentKey = parentKey;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithTemplateKey<T>(this T builder, Guid? templateKey)
|
|
where T : IWithTemplateKeyBuilder
|
|
{
|
|
builder.TemplateKey = templateKey;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithValue<T>(this T builder, object? value)
|
|
where T : IWithValueBuilder
|
|
{
|
|
builder.Value = value;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithCulture<T>(this T builder, string culture)
|
|
where T : IWithCultureBuilder
|
|
{
|
|
builder.Culture = culture;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithAllowAsRoot<T>(this T builder, bool allowAsRoot)
|
|
where T : IWithAllowAsRootBuilder
|
|
{
|
|
builder.AllowAsRoot = allowAsRoot;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithSegment<T>(this T builder, string segment)
|
|
where T : IWithSegmentBuilder
|
|
{
|
|
builder.Segment = segment;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithIsElement<T>(this T builder, bool isElement)
|
|
where T : IWithIsElementBuilder
|
|
{
|
|
builder.IsElement = isElement;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithVariesByCulture<T>(this T builder, bool variesByCulture)
|
|
where T : IWithVariesByCultureBuilder
|
|
{
|
|
builder.VariesByCulture = variesByCulture;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithVariesBySegement<T>(this T builder, bool variesBySegment)
|
|
where T : IWithVariesBySegmentBuilder
|
|
{
|
|
builder.VariesBySegment = variesBySegment;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithDefaultTemplateKey<T>(this T builder, Guid? defaultTemplateKey)
|
|
where T : IWithDefaultTemplateKeyBuilder
|
|
{
|
|
builder.DefaultTemplateKey = defaultTemplateKey;
|
|
return builder;
|
|
}
|
|
|
|
public static T WithContainerKey<T>(this T builder, Guid? containerKey)
|
|
where T : IWithContainerKeyBuilder
|
|
{
|
|
builder.ContainerKey = containerKey;
|
|
return builder;
|
|
}
|
|
}
|