Further NRT amends (#12363)

* Amended nullability of base Deploy classes.

* Ensured ContentItemDisplay.Variants is non-nullable.

* Set IArtifactSignature.Dependencies to be non-nullable.

* Update template collection retrieval to be non-nullable.

* IMediaService.GetRootMedia to be non-nullable.

* Non-nullable collection for IMemberService.GetMembersByMemberType.

* Non-nullable collection for member role retrieval.

* Non-nullable collection for root dictionary items.

* Non-nullable collection for child dictionary items.

* Applied suggestions from code review

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Remove extra dot

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
Co-authored-by: Nikolaj Geisle <niko737@edu.ucl.dk>
(cherry picked from commit 63b77b7743)
This commit is contained in:
Andy Butland
2022-05-06 10:13:58 +02:00
committed by Bjarke Berg
parent fbdf704567
commit ea77c9a4fc
20 changed files with 66 additions and 79 deletions

View File

@@ -1,7 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Umbraco.Cms.Core.Deploy
{
/// <summary>
@@ -15,13 +11,13 @@ namespace Umbraco.Cms.Core.Deploy
Udi = udi ?? throw new ArgumentNullException("udi");
Name = Udi.ToString();
Dependencies = dependencies ?? Enumerable.Empty<ArtifactDependency>();
_dependencies = dependencies ?? Enumerable.Empty<ArtifactDependency>();
_checksum = new Lazy<string>(GetChecksum);
}
private readonly Lazy<string> _checksum;
private IEnumerable<ArtifactDependency>? _dependencies;
private IEnumerable<ArtifactDependency> _dependencies;
protected abstract string GetChecksum();
@@ -43,16 +39,16 @@ namespace Umbraco.Cms.Core.Deploy
/// </remarks>
public bool ShouldSerializeChecksum() => false;
public IEnumerable<ArtifactDependency>? Dependencies
public IEnumerable<ArtifactDependency> Dependencies
{
get => _dependencies;
set => _dependencies = value?.OrderBy(x => x.Udi);
set => _dependencies = value.OrderBy(x => x.Udi);
}
#endregion
public string Name { get; set; }
public string? Alias { get; set; }
public string Alias { get; set; } = string.Empty;
}
}

View File

@@ -15,7 +15,7 @@
/// <param name="connector">The service connector deploying the artifact.</param>
/// <param name="nextPass">The next pass number.</param>
/// <returns>A deploying artifact.</returns>
public static ArtifactDeployState<TArtifact, TEntity> Create<TArtifact, TEntity>(TArtifact art, TEntity entity, IServiceConnector connector, int nextPass)
public static ArtifactDeployState<TArtifact, TEntity> Create<TArtifact, TEntity>(TArtifact art, TEntity? entity, IServiceConnector connector, int nextPass)
where TArtifact : IArtifact
{
return new ArtifactDeployState<TArtifact, TEntity>(art, entity, connector, nextPass);

View File

@@ -21,7 +21,7 @@
/// <param name="entity">The entity.</param>
/// <param name="connector">The service connector deploying the artifact.</param>
/// <param name="nextPass">The next pass number.</param>
public ArtifactDeployState(TArtifact art, TEntity entity, IServiceConnector connector, int nextPass)
public ArtifactDeployState(TArtifact art, TEntity? entity, IServiceConnector connector, int nextPass)
{
Artifact = art;
Entity = entity;

View File

@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
namespace Umbraco.Cms.Core.Deploy
{
@@ -36,6 +36,6 @@ namespace Umbraco.Cms.Core.Deploy
/// <summary>
/// Gets the dependencies of this artifact.
/// </summary>
IEnumerable<ArtifactDependency>? Dependencies { get; }
IEnumerable<ArtifactDependency> Dependencies { get; }
}
}

View File

@@ -65,7 +65,7 @@ namespace Umbraco.Cms.Core.Models.ContentEditing
/// If a content item is invariant, this collection will only contain one item, else it will contain all culture variants
/// </remarks>
[DataMember(Name = "variants")]
public IEnumerable<TVariant>? Variants { get; set; }
public IEnumerable<TVariant> Variants { get; set; }
[DataMember(Name = "owner")]
public UserProfile? Owner { get; set; }

View File

@@ -19,12 +19,12 @@ namespace Umbraco.Cms.Core.Models.Mapping
_localizedTextService = localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService));
}
public IEnumerable<TVariant>? Map<TVariant>(IContent source, MapperContext context) where TVariant : ContentVariantDisplay
public IEnumerable<TVariant> Map<TVariant>(IContent source, MapperContext context) where TVariant : ContentVariantDisplay
{
var variesByCulture = source.ContentType.VariesByCulture();
var variesBySegment = source.ContentType.VariesBySegment();
IList<TVariant>? variants = new List<TVariant>();
List<TVariant> variants = new ();
if (!variesByCulture && !variesBySegment)
{
@@ -38,7 +38,7 @@ namespace Umbraco.Cms.Core.Models.Mapping
else if (variesByCulture && !variesBySegment)
{
var languages = GetLanguages(context);
variants = languages?
variants = languages
.Select(language => CreateVariantDisplay<TVariant>(context, source, language, null))
.WhereNotNull()
.ToList();
@@ -47,7 +47,7 @@ namespace Umbraco.Cms.Core.Models.Mapping
{
// Segment only
var segments = GetSegments(source);
variants = segments?
variants = segments
.Select(segment => CreateVariantDisplay<TVariant>(context, source, null, segment))
.WhereNotNull()
.ToList();
@@ -64,7 +64,7 @@ namespace Umbraco.Cms.Core.Models.Mapping
throw new InvalidOperationException("No languages or segments available");
}
variants = languages?
variants = languages
.SelectMany(language => segments
.Select(segment => CreateVariantDisplay<TVariant>(context, source, language, segment)))
.WhereNotNull()
@@ -74,11 +74,9 @@ namespace Umbraco.Cms.Core.Models.Mapping
return SortVariants(variants);
}
private IList<TVariant>? SortVariants<TVariant>(IList<TVariant>? variants) where TVariant : ContentVariantDisplay
private IList<TVariant> SortVariants<TVariant>(IList<TVariant> variants) where TVariant : ContentVariantDisplay
{
if (variants == null || variants.Count <= 1)
if (variants.Count <= 1)
{
return variants;
}

View File

@@ -155,9 +155,9 @@ namespace Umbraco.Cms.Core.Models.Mapping
return prop;
}
internal IDictionary<string, bool> GetMemberGroupValue(string? username)
internal IDictionary<string, bool> GetMemberGroupValue(string username)
{
IEnumerable<string>? userRoles = username.IsNullOrWhiteSpace() ? null : _memberService.GetAllRoles(username);
IEnumerable<string> userRoles = _memberService.GetAllRoles(username);
// create a dictionary of all roles (except internal roles) + "false"
var result = _memberGroupService.GetAll()

View File

@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Cms.Core.Models.Membership
{
public class MemberExportModel
@@ -10,10 +7,10 @@ namespace Umbraco.Cms.Core.Models.Membership
public string? Name { get; set; }
public string? Username { get; set; }
public string? Email { get; set; }
public List<string?>? Groups { get; set; }
public List<string> Groups { get; set; } = new ();
public string? ContentTypeAlias { get; set; }
public DateTime CreateDate { get; set; }
public DateTime UpdateDate { get; set; }
public List<MemberExportProperty>? Properties { get; set; }
public List<MemberExportProperty> Properties { get; set; } = new ();
}
}

View File

@@ -7,9 +7,9 @@ namespace Umbraco.Cms.Core.Persistence.Repositories
{
ITemplate? Get(string? alias);
IEnumerable<ITemplate>? GetAll(params string[] aliases);
IEnumerable<ITemplate> GetAll(params string[] aliases);
IEnumerable<ITemplate>? GetChildren(int masterTemplateId);
IEnumerable<ITemplate> GetChildren(int masterTemplateId);
IEnumerable<ITemplate> GetDescendants(int masterTemplateId);
}

View File

@@ -412,11 +412,11 @@ namespace Umbraco.Cms.Core.Services
/// Gets a list of all <see cref="ITemplate"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="ITemplate"/> objects</returns>
public IEnumerable<ITemplate>? GetTemplates(params string[] aliases)
public IEnumerable<ITemplate> GetTemplates(params string[] aliases)
{
using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
return _templateRepository.GetAll(aliases)?.OrderBy(x => x.Name);
return _templateRepository.GetAll(aliases).OrderBy(x => x.Name);
}
}
@@ -424,11 +424,11 @@ namespace Umbraco.Cms.Core.Services
/// Gets a list of all <see cref="ITemplate"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="ITemplate"/> objects</returns>
public IEnumerable<ITemplate>? GetTemplates(int masterTemplateId)
public IEnumerable<ITemplate> GetTemplates(int masterTemplateId)
{
using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
return _templateRepository.GetChildren(masterTemplateId)?.OrderBy(x => x.Name);
return _templateRepository.GetChildren(masterTemplateId).OrderBy(x => x.Name);
}
}

View File

@@ -199,13 +199,13 @@ namespace Umbraco.Cms.Core.Services
/// Gets a list of all <see cref="ITemplate"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="ITemplate"/> objects</returns>
IEnumerable<ITemplate>? GetTemplates(params string[] aliases);
IEnumerable<ITemplate> GetTemplates(params string[] aliases);
/// <summary>
/// Gets a list of all <see cref="ITemplate"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="ITemplate"/> objects</returns>
IEnumerable<ITemplate>? GetTemplates(int masterTemplateId);
IEnumerable<ITemplate> GetTemplates(int masterTemplateId);
/// <summary>
/// Gets a <see cref="ITemplate"/> object by its alias.

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using Umbraco.Cms.Core.Models;
@@ -59,7 +59,7 @@ namespace Umbraco.Cms.Core.Services
/// </summary>
/// <param name="parentId">Id of the parent</param>
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
IEnumerable<IDictionaryItem>? GetDictionaryItemChildren(Guid parentId);
IEnumerable<IDictionaryItem> GetDictionaryItemChildren(Guid parentId);
/// <summary>
/// Gets a list of descendants for a <see cref="IDictionaryItem"/>
@@ -72,7 +72,7 @@ namespace Umbraco.Cms.Core.Services
/// Gets the root/top <see cref="IDictionaryItem"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
IEnumerable<IDictionaryItem>? GetRootDictionaryItems();
IEnumerable<IDictionaryItem> GetRootDictionaryItems();
/// <summary>
/// Checks if a <see cref="IDictionaryItem"/> with given key exists

View File

@@ -130,7 +130,7 @@ namespace Umbraco.Cms.Core.Services
/// Gets a collection of <see cref="IMedia"/> objects, which reside at the first level / root
/// </summary>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
IEnumerable<IMedia>? GetRootMedia();
IEnumerable<IMedia> GetRootMedia();
/// <summary>
/// Gets a collection of an <see cref="IMedia"/> objects, which resides in the Recycle Bin

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Querying;
@@ -127,14 +127,14 @@ namespace Umbraco.Cms.Core.Services
/// </summary>
/// <param name="memberTypeAlias">Alias of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember>? GetMembersByMemberType(string memberTypeAlias);
IEnumerable<IMember> GetMembersByMemberType(string memberTypeAlias);
/// <summary>
/// Gets all Members for the MemberType id
/// </summary>
/// <param name="memberTypeId">Id of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember>? GetMembersByMemberType(int memberTypeId);
IEnumerable<IMember> GetMembersByMemberType(int memberTypeId);
/// <summary>
/// Gets all Members within the specified MemberGroup name

View File

@@ -12,9 +12,9 @@ namespace Umbraco.Cms.Core.Services
IEnumerable<IMemberGroup> GetAllRoles();
IEnumerable<string?>? GetAllRoles(int memberId);
IEnumerable<string> GetAllRoles(int memberId);
IEnumerable<string> GetAllRoles(string? username);
IEnumerable<string> GetAllRoles(string username);
IEnumerable<int> GetAllRolesIds();

View File

@@ -179,18 +179,15 @@ namespace Umbraco.Cms.Core.Services
/// </summary>
/// <param name="parentId">Id of the parent</param>
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
public IEnumerable<IDictionaryItem>? GetDictionaryItemChildren(Guid parentId)
public IEnumerable<IDictionaryItem> GetDictionaryItemChildren(Guid parentId)
{
using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
var query = Query<IDictionaryItem>().Where(x => x.ParentId == parentId);
var items = _dictionaryRepository.Get(query)?.ToArray();
if (items is not null)
{
//ensure the lazy Language callback is assigned
foreach (var item in items)
EnsureDictionaryItemLanguageCallback(item);
}
var items = _dictionaryRepository.Get(query).ToArray();
//ensure the lazy Language callback is assigned
foreach (var item in items)
EnsureDictionaryItemLanguageCallback(item);
return items;
}
@@ -217,18 +214,15 @@ namespace Umbraco.Cms.Core.Services
/// Gets the root/top <see cref="IDictionaryItem"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
public IEnumerable<IDictionaryItem>? GetRootDictionaryItems()
public IEnumerable<IDictionaryItem> GetRootDictionaryItems()
{
using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
var query = Query<IDictionaryItem>().Where(x => x.ParentId == null);
var items = _dictionaryRepository.Get(query)?.ToArray();
if (items is not null)
{
//ensure the lazy Language callback is assigned
foreach (var item in items)
EnsureDictionaryItemLanguageCallback(item);
}
var items = _dictionaryRepository.Get(query).ToArray();
//ensure the lazy Language callback is assigned
foreach (var item in items)
EnsureDictionaryItemLanguageCallback(item);
return items;
}
}

View File

@@ -590,7 +590,7 @@ namespace Umbraco.Cms.Core.Services
/// Gets a collection of <see cref="IMedia"/> objects, which reside at the first level / root
/// </summary>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable<IMedia>? GetRootMedia()
public IEnumerable<IMedia> GetRootMedia()
{
using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{

View File

@@ -406,7 +406,7 @@ namespace Umbraco.Cms.Core.Services
/// </summary>
/// <param name="memberTypeAlias">Alias of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember>? GetMembersByMemberType(string memberTypeAlias)
public IEnumerable<IMember> GetMembersByMemberType(string memberTypeAlias)
{
using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
@@ -421,7 +421,7 @@ namespace Umbraco.Cms.Core.Services
/// </summary>
/// <param name="memberTypeId">Id of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember>? GetMembersByMemberType(int memberTypeId)
public IEnumerable<IMember> GetMembersByMemberType(int memberTypeId)
{
using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
@@ -894,17 +894,17 @@ namespace Umbraco.Cms.Core.Services
/// </summary>
/// <param name="memberId"></param>
/// <returns>A list of member roles</returns>
public IEnumerable<string?>? GetAllRoles(int memberId)
public IEnumerable<string> GetAllRoles(int memberId)
{
using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
scope.ReadLock(Constants.Locks.MemberTree);
var result = _memberGroupRepository.GetMemberGroupsForMember(memberId);
return result.Select(x => x.Name).Distinct();
return result.Select(x => x.Name).WhereNotNull().Distinct();
}
}
public IEnumerable<string> GetAllRoles(string? username)
public IEnumerable<string> GetAllRoles(string username)
{
using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true))
{
@@ -1107,7 +1107,7 @@ namespace Umbraco.Cms.Core.Services
Name = member.Name,
Username = member.Username,
Email = member.Email,
Groups = GetAllRoles(member.Id)?.ToList(),
Groups = GetAllRoles(member.Id).ToList(),
ContentTypeAlias = member.ContentTypeAlias,
CreateDate = member.CreateDate,
UpdateDate = member.UpdateDate,

View File

@@ -504,7 +504,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
public ITemplate? Get(string? alias) => GetAll(alias)?.FirstOrDefault();
public IEnumerable<ITemplate>? GetAll(params string?[] aliases)
public IEnumerable<ITemplate> GetAll(params string?[] aliases)
{
//We must call the base (normal) GetAll method
// which is cached. This is a specialized method and unfortunately with the params[] it
@@ -515,26 +515,26 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
}
//return from base.GetAll, this is all cached
return base.GetMany()?.Where(x => aliases.WhereNotNull().InvariantContains(x.Alias));
return base.GetMany().Where(x => aliases.WhereNotNull().InvariantContains(x.Alias));
}
public IEnumerable<ITemplate>? GetChildren(int masterTemplateId)
public IEnumerable<ITemplate> GetChildren(int masterTemplateId)
{
//return from base.GetAll, this is all cached
ITemplate[]? all = base.GetMany()?.ToArray();
ITemplate[] all = base.GetMany().ToArray();
if (masterTemplateId <= 0)
{
return all?.Where(x => x.MasterTemplateAlias.IsNullOrWhiteSpace());
return all.Where(x => x.MasterTemplateAlias.IsNullOrWhiteSpace());
}
ITemplate? parent = all?.FirstOrDefault(x => x.Id == masterTemplateId);
ITemplate? parent = all.FirstOrDefault(x => x.Id == masterTemplateId);
if (parent == null)
{
return Enumerable.Empty<ITemplate>();
}
IEnumerable<ITemplate>? children = all?.Where(x => x.MasterTemplateAlias.InvariantEquals(parent.Alias));
IEnumerable<ITemplate> children = all.Where(x => x.MasterTemplateAlias.InvariantEquals(parent.Alias));
return children;
}

View File

@@ -160,8 +160,10 @@ namespace Umbraco.Cms.Web.BackOffice.Mapping
target.Urls = GetUrls(source);
target.Variants = _contentVariantMapper.Map<TVariant>(source, context);
target.ContentDto = new ContentPropertyCollectionDto();
target.ContentDto.Properties = context.MapEnumerable<IProperty, ContentPropertyDto>(source.Properties).WhereNotNull();
target.ContentDto = new ContentPropertyCollectionDto
{
Properties = context.MapEnumerable<IProperty, ContentPropertyDto>(source.Properties).WhereNotNull()
};
}
// Umbraco.Code.MapAll -Segment -Language -DisplayName