diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs index 5c85f9877e..8ddc81fc92 100644 --- a/src/Umbraco.Core/Models/ContentType.cs +++ b/src/Umbraco.Core/Models/ContentType.cs @@ -32,8 +32,9 @@ namespace Umbraco.Core.Models private IEnumerable _allowedTemplates; private IEnumerable _allowedContentTypes; - public ContentType() + public ContentType(int parentId) { + _parentId = parentId; _allowedTemplates = new List(); _allowedContentTypes = new List(); _propertyGroups = new PropertyGroupCollection(); @@ -394,9 +395,6 @@ namespace Umbraco.Core.Models { base.AddingEntity(); Key = Guid.NewGuid(); - - if (ParentId == 0) - _parentId = -1; } /// diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs index 9d10a40182..f816b9cadc 100644 --- a/src/Umbraco.Core/Models/DictionaryItem.cs +++ b/src/Umbraco.Core/Models/DictionaryItem.cs @@ -16,8 +16,6 @@ namespace Umbraco.Core.Models private Guid _parentId; private string _itemKey; private IEnumerable _translations; - //NOTE Add this to LocalizationService or Repository - //private static Guid _topLevelParent = new Guid("41c7638d-f529-4bff-853e-59a0c2fb1bde"); public DictionaryItem(Guid parentId, string itemKey) { diff --git a/src/Umbraco.Core/Models/IContent.cs b/src/Umbraco.Core/Models/IContent.cs index cca852ebea..ddec41f3b6 100644 --- a/src/Umbraco.Core/Models/IContent.cs +++ b/src/Umbraco.Core/Models/IContent.cs @@ -23,11 +23,6 @@ namespace Umbraco.Core.Models /// //string Language { get; set; } - /// - /// Gets the Guid Id of the Content's Version - /// - Guid Version { get; } - /// /// Gets or Sets the date the Content should be released and thus be published /// diff --git a/src/Umbraco.Core/Models/IContentBase.cs b/src/Umbraco.Core/Models/IContentBase.cs index 53acf4eb81..ee9e43c5eb 100644 --- a/src/Umbraco.Core/Models/IContentBase.cs +++ b/src/Umbraco.Core/Models/IContentBase.cs @@ -1,5 +1,5 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; +using System; +using System.Collections.Generic; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models @@ -56,6 +56,11 @@ namespace Umbraco.Core.Models /// int ContentTypeId { get; } + /// + /// Gets the Guid Id of the Content's Version + /// + Guid Version { get; } + /// /// List of properties, which make up all the data available for this Content object /// diff --git a/src/Umbraco.Core/Models/Media.cs b/src/Umbraco.Core/Models/Media.cs index 870d42e517..c2ff051eee 100644 --- a/src/Umbraco.Core/Models/Media.cs +++ b/src/Umbraco.Core/Models/Media.cs @@ -51,6 +51,7 @@ namespace Umbraco.Core.Models _contentType = contentType; _properties = properties; _properties.EnsurePropertyTypes(PropertyTypes); + Version = Guid.NewGuid(); } private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); @@ -194,6 +195,12 @@ namespace Umbraco.Core.Models } } + /// + /// Guid Id of the curent Version + /// + [DataMember] + public Guid Version { get; internal set; } + /// /// List of properties, which make up all the data available for this Media object /// @@ -319,5 +326,25 @@ namespace Umbraco.Core.Models ChangeContentType(contentType); } + + /// + /// Method to call when Entity is being saved + /// + /// Created date is set and a Unique key is assigned + internal override void AddingEntity() + { + base.AddingEntity(); + Key = Guid.NewGuid(); + } + + /// + /// Method to call when Entity is being updated + /// + /// Modified Date is set and a new Version guid is set + internal override void UpdatingEntity() + { + base.UpdatingEntity(); + Version = Guid.NewGuid(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/MediaType.cs b/src/Umbraco.Core/Models/MediaType.cs index e4ab83a760..2d1ecbfa55 100644 --- a/src/Umbraco.Core/Models/MediaType.cs +++ b/src/Umbraco.Core/Models/MediaType.cs @@ -29,8 +29,9 @@ namespace Umbraco.Core.Models private PropertyGroupCollection _propertyGroups; private IEnumerable _allowedContentTypes; - public MediaType() + public MediaType(int parentId) { + _parentId = parentId; _allowedContentTypes = new List(); _propertyGroups = new PropertyGroupCollection(); } @@ -256,9 +257,6 @@ namespace Umbraco.Core.Models { base.AddingEntity(); Key = Guid.NewGuid(); - - if (ParentId == 0) - _parentId = -1; } /// diff --git a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs index 5e3fd4768d..8c256497dc 100644 --- a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs @@ -18,7 +18,7 @@ namespace Umbraco.Core.Persistence.Factories public IContentType BuildEntity(DocumentTypeDto dto) { - var contentType = new ContentType + var contentType = new ContentType(dto.ContentTypeDto.NodeDto.ParentId) { Id = dto.ContentTypeDto.NodeDto.NodeId, Key = @@ -34,7 +34,6 @@ namespace Umbraco.Core.Persistence.Factories CreateDate = dto.ContentTypeDto.NodeDto.CreateDate, Path = dto.ContentTypeDto.NodeDto.Path, Level = dto.ContentTypeDto.NodeDto.Level, - ParentId = dto.ContentTypeDto.NodeDto.ParentId, UserId = dto.ContentTypeDto.NodeDto.UserId.HasValue ? dto.ContentTypeDto.NodeDto.UserId.Value diff --git a/src/Umbraco.Core/Persistence/Factories/MediaFactory.cs b/src/Umbraco.Core/Persistence/Factories/MediaFactory.cs new file mode 100644 index 0000000000..901ff2ed30 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Factories/MediaFactory.cs @@ -0,0 +1,105 @@ +using System; +using System.Globalization; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Factories +{ + internal class MediaFactory : IEntityFactory + { + private readonly IMediaType _contentType; + private readonly Guid _nodeObjectTypeId; + private readonly int _id; + private int _primaryKey; + + public MediaFactory(IMediaType contentType, Guid nodeObjectTypeId, int id) + { + _contentType = contentType; + _nodeObjectTypeId = nodeObjectTypeId; + _id = id; + } + + #region Implementation of IEntityFactory + + public IMedia BuildEntity(ContentVersionDto dto) + { + return new Models.Media(dto.ContentDto.NodeDto.ParentId, _contentType) + { + Id = _id, + Key = + dto.ContentDto.NodeDto.UniqueId.HasValue + ? dto.ContentDto.NodeDto.UniqueId.Value + : _id.ToGuid(), + Name = dto.ContentDto.NodeDto.Text, + Path = dto.ContentDto.NodeDto.Path, + UserId = + dto.ContentDto.NodeDto.UserId.HasValue + ? dto.ContentDto.NodeDto.UserId.Value + : 0, + Level = dto.ContentDto.NodeDto.Level, + ParentId = dto.ContentDto.NodeDto.ParentId, + SortOrder = dto.ContentDto.NodeDto.SortOrder, + Trashed = dto.ContentDto.NodeDto.Trashed, + CreateDate = dto.ContentDto.NodeDto.CreateDate, + UpdateDate = dto.VersionDate, + Version = dto.VersionId + }; + } + + public ContentVersionDto BuildDto(IMedia entity) + { + var dto = new ContentVersionDto + { + NodeId = entity.Id, + VersionDate = entity.UpdateDate, + VersionId = entity.Version, + ContentDto = BuildContentDto(entity) + }; + return dto; + } + + #endregion + + public void SetPrimaryKey(int primaryKey) + { + _primaryKey = primaryKey; + } + + private ContentDto BuildContentDto(IMedia entity) + { + var contentDto = new ContentDto + { + NodeId = entity.Id, + ContentType = entity.ContentTypeId, + NodeDto = BuildNodeDto(entity) + }; + + if (_primaryKey > 0) + { + contentDto.PrimaryKey = _primaryKey; + } + + return contentDto; + } + + private NodeDto BuildNodeDto(IMedia entity) + { + var nodeDto = new NodeDto + { + CreateDate = entity.CreateDate, + NodeId = entity.Id, + Level = short.Parse(entity.Level.ToString(CultureInfo.InvariantCulture)), + NodeObjectType = _nodeObjectTypeId, + ParentId = entity.ParentId, + Path = entity.Path, + SortOrder = entity.SortOrder, + Text = entity.Name, + Trashed = entity.Trashed, + UniqueId = entity.Key, + UserId = entity.UserId + }; + + return nodeDto; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs index 769f1066c1..a8fd54e945 100644 --- a/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/MediaTypeFactory.cs @@ -18,7 +18,7 @@ namespace Umbraco.Core.Persistence.Factories public IMediaType BuildEntity(ContentTypeDto dto) { - var contentType = new MediaType + var contentType = new MediaType(dto.NodeDto.ParentId) { Id = dto.NodeDto.NodeId, Key = @@ -34,7 +34,6 @@ namespace Umbraco.Core.Persistence.Factories CreateDate = dto.NodeDto.CreateDate, Path = dto.NodeDto.Path, Level = dto.NodeDto.Level, - ParentId = dto.NodeDto.ParentId, UserId = dto.NodeDto.UserId.HasValue ? dto.NodeDto.UserId.Value diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyFactory.cs b/src/Umbraco.Core/Persistence/Factories/PropertyFactory.cs index 26e67f3e1b..1971bf1d56 100644 --- a/src/Umbraco.Core/Persistence/Factories/PropertyFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/PropertyFactory.cs @@ -9,11 +9,10 @@ namespace Umbraco.Core.Persistence.Factories internal class PropertyFactory : IEntityFactory, IEnumerable> { private readonly IContentType _contentType; + private readonly IMediaType _mediaType; private readonly Guid _version; private readonly int _id; - #region Implementation of IEntityFactory - public PropertyFactory(IContentType contentType, Guid version, int id) { _contentType = contentType; @@ -21,13 +20,21 @@ namespace Umbraco.Core.Persistence.Factories _id = id; } + public PropertyFactory(IMediaType mediaType, Guid version, int id) + { + _mediaType = mediaType; + _version = version; + _id = id; + } + + #region Implementation of IEntityFactory + public IEnumerable BuildEntity(IEnumerable dtos) { var properties = new List(); foreach (var dto in dtos) { - var propertyType = - _contentType.CompositionPropertyTypes.FirstOrDefault(x => x.Id == dto.PropertyTypeId); + var propertyType = _contentType.CompositionPropertyTypes.FirstOrDefault(x => x.Id == dto.PropertyTypeId); properties.Add(propertyType.CreatePropertyFromRawValue(dto.GetValue)); } return properties; @@ -71,5 +78,16 @@ namespace Umbraco.Core.Persistence.Factories } #endregion + + public IEnumerable BuildMediaEntity(IEnumerable dtos) + { + var properties = new List(); + foreach (var dto in dtos) + { + var propertyType = _mediaType.PropertyTypes.FirstOrDefault(x => x.Id == dto.PropertyTypeId); + properties.Add(propertyType.CreatePropertyFromRawValue(dto.GetValue)); + } + return properties; + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 5ab3655d6b..985c79d396 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -38,28 +38,17 @@ namespace Umbraco.Core.Persistence.Repositories contentSql.Append(GetBaseWhereClause(id)); contentSql.OrderBy("[cmsContentVersion].[VersionDate] DESC"); - var documentDto = Database.Query(contentSql).FirstOrDefault(); + var dto = Database.Query(contentSql).FirstOrDefault(); - if (documentDto == null) + if (dto == null) return null; - var propertySql = new Sql(); - propertySql.Select("*"); - propertySql.From("cmsPropertyData"); - propertySql.InnerJoin("cmsPropertyType ON ([cmsPropertyData].[propertytypeid] = [cmsPropertyType].[id])"); - propertySql.Where("[cmsPropertyData].[contentNodeId] = @Id", new { Id = id }); - propertySql.Where("[cmsPropertyData].[versionId] = @VersionId", new { VersionId = documentDto.ContentVersionDto.VersionId }); - - var propertyDataDtos = Database.Fetch(propertySql); - - var contentType = _contentTypeRepository.Get(documentDto.ContentVersionDto.ContentDto.ContentType); + var contentType = _contentTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentType); var factory = new ContentFactory(contentType, NodeObjectTypeId, id); - var content = factory.BuildEntity(documentDto); + var content = factory.BuildEntity(dto); - var propertyFactory = new PropertyFactory(contentType, documentDto.ContentVersionDto.VersionId, id); - var properties = propertyFactory.BuildEntity(propertyDataDtos); - content.Properties = new PropertyCollection(properties); + content.Properties = GetPropertyCollection(id, dto.ContentVersionDto.VersionId, contentType); ((Content)content).ResetDirtyProperties(); return content; @@ -90,11 +79,11 @@ namespace Umbraco.Core.Persistence.Repositories var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); - var documentDtos = Database.Fetch(sql); + var dtos = Database.Fetch(sql); - foreach (var documentDto in documentDtos) + foreach (var dto in dtos) { - yield return Get(documentDto.NodeId); + yield return Get(dto.NodeId); } } @@ -117,7 +106,7 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseWhereClause(object id) { var sql = new Sql(); - sql.Where("[cmsDocument].[nodeId] = @Id", new { Id = id }); + sql.Where("[umbracoNode].[id] = @Id", new { Id = id }); return sql; } @@ -194,7 +183,7 @@ namespace Umbraco.Core.Persistence.Repositories Database.Insert(dto); //Create the PropertyData for this version - cmsPropertyData - var propertyFactory = new PropertyFactory(null, entity.Version, entity.Id); + var propertyFactory = new PropertyFactory(((Content)entity).ContentType, entity.Version, entity.Id); var propertyDataDtos = propertyFactory.BuildDto(entity.Properties); //Add Properties foreach (var propertyDataDto in propertyDataDtos) @@ -247,7 +236,7 @@ namespace Umbraco.Core.Persistence.Repositories Database.Insert(dto); //Create the PropertyData for this version - cmsPropertyData - var propertyFactory = new PropertyFactory(null, entity.Version, entity.Id); + var propertyFactory = new PropertyFactory(((Content)entity).ContentType, entity.Version, entity.Id); var propertyDataDtos = propertyFactory.BuildDto(entity.Properties); //Add Properties foreach (var propertyDataDto in propertyDataDtos) @@ -282,33 +271,37 @@ namespace Umbraco.Core.Persistence.Repositories contentSql.Where("[cmsContentVersion].[VersionId] = @VersionId", new { VersionId = versionId }); contentSql.OrderBy("[cmsContentVersion].[VersionDate] DESC"); - var documentDto = Database.Query(contentSql).FirstOrDefault(); + var dto = Database.Query(contentSql).FirstOrDefault(); - if (documentDto == null) + if (dto == null) return null; - var propertySql = new Sql(); - propertySql.Select("*"); - propertySql.From("cmsPropertyData"); - propertySql.InnerJoin("cmsPropertyType ON [cmsPropertyData].[propertytypeid] = [cmsPropertyType].[id]"); - propertySql.Where("[cmsPropertyData].[contentNodeId] = @Id", new { Id = id }); - propertySql.Where("[cmsPropertyData].[versionId] = @VersionId", new { VersionId = versionId }); - - var propertyDataDtos = Database.Query(propertySql); - - var contentType = _contentTypeRepository.Get(documentDto.ContentVersionDto.ContentDto.ContentType); + var contentType = _contentTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentType); var factory = new ContentFactory(contentType, NodeObjectTypeId, id); - var content = factory.BuildEntity(documentDto); + var content = factory.BuildEntity(dto); - var propertyFactory = new PropertyFactory(contentType, documentDto.ContentVersionDto.VersionId, id); - var properties = propertyFactory.BuildEntity(propertyDataDtos); - content.Properties = new PropertyCollection(properties); + content.Properties = GetPropertyCollection(id, versionId, contentType); ((Content)content).ResetDirtyProperties(); return content; } #endregion + + private PropertyCollection GetPropertyCollection(int id, Guid versionId, IContentType contentType) + { + var propertySql = new Sql(); + propertySql.Select("*"); + propertySql.From("cmsPropertyData"); + propertySql.InnerJoin("cmsPropertyType ON ([cmsPropertyData].[propertytypeid] = [cmsPropertyType].[id])"); + propertySql.Where("[cmsPropertyData].[contentNodeId] = @Id", new { Id = id }); + propertySql.Where("[cmsPropertyData].[versionId] = @VersionId", new { VersionId = versionId }); + + var propertyDataDtos = Database.Fetch(propertySql); + var propertyFactory = new PropertyFactory(contentType, versionId, id); + var properties = propertyFactory.BuildEntity(propertyDataDtos); + return new PropertyCollection(properties); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index b39c5df29d..4000e83c2d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -1,7 +1,11 @@ using System; using System.Collections.Generic; +using System.Globalization; +using System.Linq; using Umbraco.Core.Models; +using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; @@ -12,29 +16,74 @@ namespace Umbraco.Core.Persistence.Repositories /// internal class MediaRepository : PetaPocoRepositoryBase, IMediaRepository { - public MediaRepository(IUnitOfWork work) : base(work) + private readonly IMediaTypeRepository _mediaTypeRepository; + + public MediaRepository(IUnitOfWork work, IMediaTypeRepository mediaTypeRepository) : base(work) { + _mediaTypeRepository = mediaTypeRepository; } - public MediaRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + public MediaRepository(IUnitOfWork work, IRepositoryCacheProvider cache, IMediaTypeRepository mediaTypeRepository) + : base(work, cache) { + _mediaTypeRepository = mediaTypeRepository; } #region Overrides of RepositoryBase protected override IMedia PerformGet(int id) { - throw new NotImplementedException(); + var contentSql = GetBaseQuery(false); + contentSql.Append(GetBaseWhereClause(id)); + contentSql.OrderBy("[cmsContentVersion].[VersionDate] DESC"); + + var dto = Database.Query(contentSql).FirstOrDefault(); + + if (dto == null) + return null; + + var contentType = _mediaTypeRepository.Get(dto.ContentDto.ContentType); + + var factory = new MediaFactory(contentType, NodeObjectTypeId, id); + var content = factory.BuildEntity(dto); + + content.Properties = GetPropertyCollection(id, dto.VersionId, contentType); + + ((Models.Media)content).ResetDirtyProperties(); + return content; } protected override IEnumerable PerformGetAll(params int[] ids) { - throw new NotImplementedException(); + if (ids.Any()) + { + foreach (var id in ids) + { + yield return Get(id); + } + } + else + { + var nodeDtos = Database.Fetch("WHERE nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + foreach (var nodeDto in nodeDtos) + { + yield return Get(nodeDto.NodeId); + } + } } protected override IEnumerable PerformGetByQuery(IQuery query) { - throw new NotImplementedException(); + var sqlClause = GetBaseQuery(false); + var translator = new SqlTranslator(sqlClause, query); + var sql = translator.Translate(); + + var dtos = Database.Fetch(sql); + + foreach (var dto in dtos) + { + yield return Get(dto.ContentDto.NodeDto.NodeId); + } } #endregion @@ -43,22 +92,41 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { - throw new NotImplementedException(); + var sql = new Sql(); + sql.Select(isCount ? "COUNT(*)" : "*"); + sql.From("cmsContentVersion"); + sql.InnerJoin("cmsContent ON ([cmsContentVersion].[ContentId] = [cmsContent].[nodeId])"); + sql.InnerJoin("umbracoNode ON ([cmsContent].[nodeId] = [umbracoNode].[id])"); + sql.Where("[umbracoNode].[nodeObjectType] = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + return sql; } protected override Sql GetBaseWhereClause(object id) { - throw new NotImplementedException(); + var sql = new Sql(); + sql.Where("[umbracoNode].[id] = @Id", new { Id = id }); + return sql; } protected override IEnumerable GetDeleteClauses() { - throw new NotImplementedException(); + var list = new List + { + string.Format("DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id"), + string.Format("DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id"), + string.Format("DELETE FROM cmsTagRelationship WHERE nodeId = @Id"), + string.Format("DELETE FROM cmsDocument WHERE NodeId = @Id"), + string.Format("DELETE FROM cmsPropertyData WHERE contentNodeId = @Id"), + string.Format("DELETE FROM cmsContentVersion WHERE ContentId = @Id"), + string.Format("DELETE FROM cmsContent WHERE NodeId = @Id"), + string.Format("DELETE FROM umbracoNode WHERE id = @Id") + }; + return list; } protected override Guid NodeObjectTypeId { - get { throw new NotImplementedException(); } + get { return new Guid("B796F64C-1F99-4FFB-B886-4BF4BC011A9C"); } } #endregion @@ -67,14 +135,110 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistNewItem(IMedia entity) { - throw new NotImplementedException(); + ((Models.Media)entity).AddingEntity(); + + var factory = new MediaFactory(null, NodeObjectTypeId, entity.Id); + var dto = factory.BuildDto(entity); + + //NOTE Should the logic below have some kind of fallback for empty parent ids ? + //Logic for setting Path, Level and SortOrder + var parent = Database.First("WHERE id = @ParentId", new { ParentId = entity.ParentId }); + int level = parent.Level + 1; + int sortOrder = + Database.ExecuteScalar("SELECT COUNT(*) FROM umbracoNode WHERE parentID = @ParentId AND nodeObjectType = @NodeObjectType", + new { ParentId = entity.ParentId, NodeObjectType = NodeObjectTypeId }); + + //Create the (base) node data - umbracoNode + var nodeDto = dto.ContentDto.NodeDto; + nodeDto.Path = parent.Path; + nodeDto.Level = short.Parse(level.ToString(CultureInfo.InvariantCulture)); + nodeDto.SortOrder = sortOrder; + var o = Database.IsNew(nodeDto) ? Convert.ToInt32(Database.Insert(nodeDto)) : Database.Update(nodeDto); + + //Update with new correct path + nodeDto.Path = string.Concat(parent.Path, ",", nodeDto.NodeId); + Database.Update(nodeDto); + + //Update entity with correct values + entity.Id = nodeDto.NodeId; //Set Id on entity to ensure an Id is set + entity.Path = nodeDto.Path; + entity.SortOrder = sortOrder; + entity.Level = level; + + //Create the Content specific data - cmsContent + var contentDto = dto.ContentDto; + Database.Insert(contentDto); + + //Create the first version - cmsContentVersion + //Assumes a new Version guid and Version date (modified date) has been set + Database.Insert(dto); + + //Create the PropertyData for this version - cmsPropertyData + var propertyFactory = new PropertyFactory(((Models.Media)entity).ContentType, entity.Version, entity.Id); + var propertyDataDtos = propertyFactory.BuildDto(entity.Properties); + //Add Properties + foreach (var propertyDataDto in propertyDataDtos) + { + Database.Insert(propertyDataDto); + } + + ((Models.Media)entity).ResetDirtyProperties(); } protected override void PersistUpdatedItem(IMedia entity) { - throw new NotImplementedException(); + //Updates Modified date and Version Guid + ((Models.Media)entity).UpdatingEntity(); + + var factory = new MediaFactory(null, NodeObjectTypeId, entity.Id); + //Look up Content entry to get Primary for updating the DTO + var contentDto = Database.SingleOrDefault("WHERE nodeId = @Id", new { Id = entity.Id }); + factory.SetPrimaryKey(contentDto.PrimaryKey); + var dto = factory.BuildDto(entity); + + //Updates the (base) node data - umbracoNode + var nodeDto = dto.ContentDto.NodeDto; + var o = Database.Update(nodeDto); + + //Only update this DTO if the contentType has actually changed + if (contentDto.ContentType != entity.ContentTypeId) + { + //Create the Content specific data - cmsContent + var newContentDto = dto.ContentDto; + Database.Update(newContentDto); + } + + //Create a new version - cmsContentVersion + //Assumes a new Version guid and Version date (modified date) has been set + Database.Insert(dto); + + //Create the PropertyData for this version - cmsPropertyData + var propertyFactory = new PropertyFactory(((Models.Media)entity).ContentType, entity.Version, entity.Id); + var propertyDataDtos = propertyFactory.BuildDto(entity.Properties); + //Add Properties + foreach (var propertyDataDto in propertyDataDtos) + { + Database.Insert(propertyDataDto); + } + + ((Models.Media)entity).ResetDirtyProperties(); } #endregion + + private PropertyCollection GetPropertyCollection(int id, Guid versionId, IMediaType contentType) + { + var propertySql = new Sql(); + propertySql.Select("*"); + propertySql.From("cmsPropertyData"); + propertySql.InnerJoin("cmsPropertyType ON ([cmsPropertyData].[propertytypeid] = [cmsPropertyType].[id])"); + propertySql.Where("[cmsPropertyData].[contentNodeId] = @Id", new { Id = id }); + propertySql.Where("[cmsPropertyData].[versionId] = @VersionId", new { VersionId = versionId }); + + var propertyDataDtos = Database.Fetch(propertySql); + var propertyFactory = new PropertyFactory(contentType, versionId, id); + var properties = propertyFactory.BuildMediaEntity(propertyDataDtos); + return new PropertyCollection(properties); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index d6eaa9b828..a155e1d2b4 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -108,6 +108,7 @@ +