Ensures that member properties are created when member type property type's are added (same as U4-1407), streamlines how this occurs on the base class. Streamlines how empty aliases are validated at the repo level for members, media, content. Makes built-in member property type's non-editable

This commit is contained in:
Shannon
2014-02-19 14:23:48 +11:00
parent 1e45abe71e
commit e267b7700a
15 changed files with 402 additions and 514 deletions

View File

@@ -577,33 +577,6 @@ namespace Umbraco.Core.Persistence.Repositories
return content;
}
private PropertyCollection GetPropertyCollection(int id, Guid versionId, IContentType contentType, DateTime createDate, DateTime updateDate)
{
var sql = new Sql();
sql.Select("*")
.From<PropertyDataDto>()
.InnerJoin<PropertyTypeDto>()
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
.Where<PropertyDataDto>(x => x.NodeId == id)
.Where<PropertyDataDto>(x => x.VersionId == versionId);
var propertyDataDtos = Database.Fetch<PropertyDataDto, PropertyTypeDto>(sql);
var propertyFactory = new PropertyFactory(contentType, versionId, id, createDate, updateDate);
var properties = propertyFactory.BuildEntity(propertyDataDtos);
var newProperties = properties.Where(x => x.HasIdentity == false);
foreach (var property in newProperties)
{
var propertyDataDto = new PropertyDataDto{ NodeId = id, PropertyTypeId = property.PropertyTypeId, VersionId = versionId };
int primaryKey = Convert.ToInt32(Database.Insert(propertyDataDto));
property.Version = versionId;
property.Id = primaryKey;
}
return new PropertyCollection(properties);
}
private string EnsureUniqueNodeName(int parentId, string nodeName, int id = 0)
{
if (EnsureUniqueNaming == false)

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Rdbms;
@@ -304,6 +305,10 @@ namespace Umbraco.Core.Persistence.Repositories
var datatype = Database.FirstOrDefault<DataTypeDto>("WHERE controlId = @Id", new { Id = propertyType.DataTypeId });
propertyType.DataTypeDefinitionId = datatype.DataTypeId;
}
//validate the alias!
ValidateAlias(propertyType);
var propertyTypeDto = propertyGroupFactory.BuildPropertyTypeDto(tabId, propertyType);
int typePrimaryKey = propertyType.HasIdentity
? Database.Update(propertyTypeDto)
@@ -381,5 +386,39 @@ namespace Umbraco.Core.Persistence.Repositories
return new PropertyTypeCollection(list);
}
protected void ValidateAlias(PropertyType pt)
{
Mandate.That<InvalidOperationException>(string.IsNullOrEmpty(pt.Alias) == false,
() =>
{
var message =
string.Format(
"{0} '{1}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.",
"Property Type",
pt.Name);
var exception = new InvalidOperationException(message);
LogHelper.Error<ContentTypeBaseRepository<TId, TEntity>>(message, exception);
throw exception;
});
}
protected void ValidateAlias(TEntity entity)
{
Mandate.That<InvalidOperationException>(string.IsNullOrEmpty(entity.Alias) == false,
() =>
{
var message =
string.Format(
"{0} '{1}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.",
typeof(TEntity).Name,
entity.Name);
var exception = new InvalidOperationException(message);
LogHelper.Error<ContentTypeBaseRepository<TId, TEntity>>(message, exception);
throw exception;
});
}
}
}

View File

@@ -208,18 +208,7 @@ namespace Umbraco.Core.Persistence.Repositories
protected override void PersistUpdatedItem(IContentType entity)
{
Mandate.That<Exception>(string.IsNullOrEmpty(entity.Alias) == false,
() =>
{
var message =
string.Format(
"ContentType '{0}' cannot have an empty Alias. This is most likely due to invalid characters stripped from the Alias.",
entity.Name);
var exception = new Exception(message);
LogHelper.Error<ContentTypeRepository>(message, exception);
throw exception;
});
ValidateAlias(entity);
//Updates Modified date
((ContentType)entity).UpdatingEntity();

View File

@@ -358,34 +358,7 @@ namespace Umbraco.Core.Persistence.Repositories
}
#endregion
private PropertyCollection GetPropertyCollection(int id, Guid versionId, IMediaType contentType, DateTime createDate, DateTime updateDate)
{
var sql = new Sql();
sql.Select("*")
.From<PropertyDataDto>()
.InnerJoin<PropertyTypeDto>()
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
.Where<PropertyDataDto>(x => x.NodeId == id)
.Where<PropertyDataDto>(x => x.VersionId == versionId);
var propertyDataDtos = Database.Fetch<PropertyDataDto, PropertyTypeDto>(sql);
var propertyFactory = new PropertyFactory(contentType, versionId, id, createDate, updateDate);
var properties = propertyFactory.BuildEntity(propertyDataDtos);
var newProperties = properties.Where(x => x.HasIdentity == false);
foreach (var property in newProperties)
{
var propertyDataDto = new PropertyDataDto { NodeId = id, PropertyTypeId = property.PropertyTypeId, VersionId = versionId };
int primaryKey = Convert.ToInt32(Database.Insert(propertyDataDto));
property.Version = versionId;
property.Id = primaryKey;
}
return new PropertyCollection(properties);
}
private string EnsureUniqueNodeName(int parentId, string nodeName, int id = 0)
{
if (EnsureUniqueNaming == false)

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Rdbms;
@@ -162,6 +163,8 @@ namespace Umbraco.Core.Persistence.Repositories
protected override void PersistUpdatedItem(IMediaType entity)
{
ValidateAlias(entity);
//Updates Modified date
((MediaType)entity).UpdatingEntity();

View File

@@ -600,6 +600,8 @@ namespace Umbraco.Core.Persistence.Repositories
var factory = new MemberReadOnlyFactory(memberTypes);
var member = factory.BuildEntity(dto);
member.Properties = GetPropertyCollection(dto.NodeId, dto.VersionId, member.ContentType, dto.CreateDate, dto.UpdateDate);
return member;
}
@@ -613,8 +615,15 @@ namespace Umbraco.Core.Persistence.Repositories
var memberTypeList = _memberTypeRepository.GetAll();
memberTypeList.ForEach(x => memberTypes.Add(x.Alias, x));
var entities = new List<IMember>();
var factory = new MemberReadOnlyFactory(memberTypes);
return dtos.Select(factory.BuildEntity);
foreach (var dto in dtos)
{
var entity = factory.BuildEntity(dto);
entity.Properties = GetPropertyCollection(dto.NodeId, dto.VersionId, entity.ContentType, dto.CreateDate, dto.UpdateDate);
entities.Add(entity);
}
return entities;
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Rdbms;
@@ -194,6 +195,8 @@ namespace Umbraco.Core.Persistence.Repositories
protected override void PersistUpdatedItem(IMemberType entity)
{
ValidateAlias(entity);
//Updates Modified date
((MemberType)entity).UpdatingEntity();

View File

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence.Caching;
using Umbraco.Core.Persistence.Factories;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Persistence.Repositories
@@ -90,5 +92,42 @@ namespace Umbraco.Core.Persistence.Repositories
protected abstract void PerformDeleteVersion(int id, Guid versionId);
#endregion
/// <summary>
/// This is a fix for U4-1407 - when property types are added to a content type - the property of the entity are not actually created
/// and we get YSODs
/// </summary>
/// <param name="id"></param>
/// <param name="versionId"></param>
/// <param name="contentType"></param>
/// <param name="createDate"></param>
/// <param name="updateDate"></param>
/// <returns></returns>
protected PropertyCollection GetPropertyCollection(int id, Guid versionId, IContentTypeComposition contentType, DateTime createDate, DateTime updateDate)
{
var sql = new Sql();
sql.Select("*")
.From<PropertyDataDto>()
.InnerJoin<PropertyTypeDto>()
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
.Where<PropertyDataDto>(x => x.NodeId == id)
.Where<PropertyDataDto>(x => x.VersionId == versionId);
var propertyDataDtos = Database.Fetch<PropertyDataDto, PropertyTypeDto>(sql);
var propertyFactory = new PropertyFactory(contentType, versionId, id, createDate, updateDate);
var properties = propertyFactory.BuildEntity(propertyDataDtos).ToArray();
var newProperties = properties.Where(x => x.HasIdentity == false);
foreach (var property in newProperties)
{
var propertyDataDto = new PropertyDataDto { NodeId = id, PropertyTypeId = property.PropertyTypeId, VersionId = versionId };
int primaryKey = Convert.ToInt32(Database.Insert(propertyDataDto));
property.Version = versionId;
property.Id = primaryKey;
}
return new PropertyCollection(properties);
}
}
}