From 07b5f6983f5a526385b83b0bbdbb463d19f35b59 Mon Sep 17 00:00:00 2001 From: sitereactor Date: Thu, 25 Oct 2012 18:38:23 -0200 Subject: [PATCH] Refactoring the creation of database schema and base/default data creation. Adding extension method to get all properties for interfaces in PetaPoco used for mapping. Creating ServiceContext and adding it to the UmbracoContext to provide access to the various services. Adding UmbracoContext to BaseDatabaseFactory test. --- .../Rdbms/ContentTypeAllowedContentTypeDto.cs | 6 +- src/Umbraco.Core/Models/Rdbms/UserDto.cs | 4 +- .../Persistence/Mappers/ContentTypeMapper.cs | 3 + .../Persistence/Mappers/ModelDtoMapper.cs | 89 +++++- .../Migrations/Initial/BaseDataCreation.cs | 259 +++++++++++------- .../Migrations/Initial/DatabaseCreation.cs | 128 ++++++++- src/Umbraco.Core/Persistence/PetaPoco.cs | 7 +- .../Persistence/PetaPocoExtensions.cs | 21 +- src/Umbraco.Core/TypeExtensions.cs | 46 ++++ .../Services/ContentServiceTests.cs | 4 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 102 ++++++- src/Umbraco.Web/Services/ContentService.cs | 4 +- src/Umbraco.Web/Services/ServiceContext.cs | 106 +++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + src/Umbraco.Web/UmbracoContext.cs | 8 + 15 files changed, 659 insertions(+), 129 deletions(-) create mode 100644 src/Umbraco.Web/Services/ServiceContext.cs diff --git a/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs index ae623ca0a4..0b66d61150 100644 --- a/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/ContentTypeAllowedContentTypeDto.cs @@ -9,12 +9,12 @@ namespace Umbraco.Core.Models.Rdbms internal class ContentTypeAllowedContentTypeDto { [Column("Id")] - [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType")] - [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_cmsContentTypeAllowedContentType", OnColumns = "[Id], [AllowedId]")] + [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType", Column = "nodeId")] + [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_cmsContentTypeAllowedContentType", OnColumns = "Id, AllowedId")] public int Id { get; set; } [Column("AllowedId")] - [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType1")] + [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType1", Column = "nodeId")] public int AllowedId { get; set; } [Column("SortOrder")] diff --git a/src/Umbraco.Core/Models/Rdbms/UserDto.cs b/src/Umbraco.Core/Models/Rdbms/UserDto.cs index 96c39f02cd..091838749f 100644 --- a/src/Umbraco.Core/Models/Rdbms/UserDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/UserDto.cs @@ -4,12 +4,12 @@ using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Models.Rdbms { [TableName("umbracoUser")] - [PrimaryKey("id")] + [PrimaryKey("id", autoIncrement = true)] [ExplicitColumns] internal class UserDto { [Column("id")] - [PrimaryKeyColumn] + [PrimaryKeyColumn(Name = "PK_user")] public int Id { get; set; } [Column("userDisabled")] diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs index 8a06fdebef..9c48cae1e1 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs @@ -48,6 +48,9 @@ namespace Umbraco.Core.Persistence.Mappers internal override string Map(string propertyName) { + if (!PropertyInfoCache.ContainsKey(propertyName)) + return string.Empty; + var dtoTypeProperty = PropertyInfoCache[propertyName]; return base.GetColumnName(dtoTypeProperty.Type, dtoTypeProperty.PropertyInfo); diff --git a/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs index 873de957ac..d03ef82b22 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs @@ -16,49 +16,112 @@ namespace Umbraco.Core.Persistence.Mappers { if (pi.DeclaringType == typeof(Content) || pi.DeclaringType == typeof(IContent)) { - columnName = ContentMapper.Instance.Map(pi.Name); + var mappedName = ContentMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; return true; } if (pi.DeclaringType == typeof(Models.Media) || pi.DeclaringType == typeof(IMedia)) { - columnName = MediaMapper.Instance.Map(pi.Name); + var mappedName = MediaMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; return true; } if (pi.DeclaringType == typeof(ContentType) || pi.DeclaringType == typeof(IContentType) || pi.DeclaringType == typeof(IMediaType)) { - columnName = ContentTypeMapper.Instance.Map(pi.Name); + var mappedName = ContentTypeMapper.Instance.Map(pi.Name); + if (!string.IsNullOrEmpty(mappedName)) + { + columnName = mappedName; + } + return true; } - if (pi.DeclaringType == typeof(DataTypeDefinition)) + if (pi.DeclaringType == typeof(DataTypeDefinition) || pi.DeclaringType == typeof(IDataTypeDefinition)) { - columnName = DataTypeDefinitionMapper.Instance.Map(pi.Name); + var mappedName = DataTypeDefinitionMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; } - if (pi.DeclaringType == typeof(DictionaryItem)) + if (pi.DeclaringType == typeof(DictionaryItem) || pi.DeclaringType == typeof(IDictionaryItem)) { - columnName = DictionaryMapper.Instance.Map(pi.Name); + var mappedName = DictionaryMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; } - if (pi.DeclaringType == typeof(DictionaryTranslation)) + if (pi.DeclaringType == typeof(DictionaryTranslation) || pi.DeclaringType == typeof(IDictionaryTranslation)) { - columnName = DictionaryTranslationMapper.Instance.Map(pi.Name); + var mappedName = DictionaryTranslationMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; } - if (pi.DeclaringType == typeof(Language)) + if (pi.DeclaringType == typeof(Language) || pi.DeclaringType == typeof(ILanguage)) { - columnName = LanguageMapper.Instance.Map(pi.Name); + var mappedName = LanguageMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; } if (pi.DeclaringType == typeof(Relation)) { - columnName = RelationMapper.Instance.Map(pi.Name); + var mappedName = RelationMapper.Instance.Map(pi.Name); + if (!string.IsNullOrEmpty(mappedName)) + { + columnName = mappedName; + } + return true; } if (pi.DeclaringType == typeof(RelationType)) { - columnName = RelationTypeMapper.Instance.Map(pi.Name); + var mappedName = RelationTypeMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; + } + + if (pi.DeclaringType == typeof(PropertyType)) + { + var mappedName = PropertyTypeMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; + } + + if (pi.DeclaringType == typeof(PropertyGroup)) + { + var mappedName = PropertyGroupMapper.Instance.Map(pi.Name); + if (mappedName == string.Empty) + return false; + + columnName = mappedName; + return true; } return true; diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs index 2dd8ebecab..0aa0c221f1 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs @@ -17,71 +17,124 @@ namespace Umbraco.Core.Persistence.Migrations.Initial /// /// Initialize the base data creation by inserting the data foundation for umbraco + /// specific to a table /// - public void InitializeBaseData() + /// Name of the table to create base data for + public void InitializeBaseData(string tableName) { - using (var transaction = _database.GetTransaction()) + if(tableName.Equals("umbracoNode")) { CreateUmbracNodeData(); - CreateCmsContentTypeData(); - CreateUmbracoUserData(); - CreateUmbracoUserTypeData(); - CreateUmbracoUser2AppData(); - CreateCmsMacroPropertyTypeData(); - CreateCmsPropertyTypeGroupData(); - CreateCmsPropertyTypeData(); - CreateUmbracoLanguageData(); - CreateCmsContentTypeAllowedContentType(); - CreateCmsDataTypeData(); + } - transaction.Complete(); + if(tableName.Equals("cmsContentType")) + { + CreateCmsContentTypeData(); + } + + if (tableName.Equals("umbracoUser")) + { + CreateUmbracoUserData(); + } + + if (tableName.Equals("umbracoUserType")) + { + CreateUmbracoUserTypeData(); + } + + if (tableName.Equals("umbracoUser2app")) + { + CreateUmbracoUser2AppData(); + } + + if (tableName.Equals("cmsMacroPropertyType")) + { + CreateCmsMacroPropertyTypeData(); + } + + if (tableName.Equals("cmsPropertyTypeGroup")) + { + CreateCmsPropertyTypeGroupData(); + } + + if (tableName.Equals("cmsPropertyType")) + { + CreateCmsPropertyTypeData(); + } + + if (tableName.Equals("umbracoLanguage")) + { + CreateUmbracoLanguageData(); + } + + if (tableName.Equals("cmsContentTypeAllowedContentType")) + { + CreateCmsContentTypeAllowedContentTypeData(); + } + + if(tableName.Equals("cmsDataType")) + { + CreateCmsDataTypeData(); } } private void CreateUmbracNodeData() { - _database.Insert(new NodeDto { NodeId = -1, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1", SortOrder = 0, UniqueId = new Guid("916724a5-173d-4619-b97e-b9de133dd6f5"), Text = "SYSTEM DATA: umbraco master root", NodeObjectType = new Guid("ea7d8624-4cfe-4578-a871-24aa946bf34d"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -20, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1,-20", SortOrder = 0, UniqueId = new Guid("0F582A79-1E41-4CF0-BFA0-76340651891A"), Text = "Recycle Bin", NodeObjectType = new Guid("01BB7FF2-24DC-4C0C-95A2-C24EF72BBAC8"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -92, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-92", SortOrder = 35, UniqueId = new Guid("f0bc4bfb-b499-40d6-ba86-058885a5178c"), Text = "Label", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow}); - _database.Insert(new NodeDto { NodeId = -90, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-90", SortOrder = 34, UniqueId = new Guid("84c6b441-31df-4ffe-b67e-67d5bc3ae65a"), Text = "Upload", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -89, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-89", SortOrder = 33, UniqueId = new Guid("c6bac0dd-4ab9-45b1-8e30-e4b619ee5da3"), Text = "Textbox multiple", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -88, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-88", SortOrder = 32, UniqueId = new Guid("0cc0eba1-9960-42c9-bf9b-60e150b429ae"), Text = "Textstring", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -87, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-87", SortOrder = 4, UniqueId = new Guid("ca90c950-0aff-4e72-b976-a30b1ac57dad"), Text = "Richtext editor", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -51, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-51", SortOrder = 2, UniqueId = new Guid("2e6d3631-066e-44b8-aec4-96f09099b2b5"), Text = "Numeric", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -49, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-49", SortOrder = 2, UniqueId = new Guid("2897bc6-a5f3-4ffe-ae27-f2e7e33dda49"), Text = "True/false", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -43, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-43", SortOrder = 2, UniqueId = new Guid("fbaf13a8-4036-41f2-93a3-974f678c312a"), Text = "Checkbox list", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -42, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-42", SortOrder = 2, UniqueId = new Guid("b6a45e7-44ba-430d-9da5-4e46060b9e03"), Text = "Dropdown", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -41, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-41", SortOrder = 2, UniqueId = new Guid("046194e-4237-453c-a547-15db3a07c4e1"), Text = "Date Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -40, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-40", SortOrder = 2, UniqueId = new Guid("bb5f57c9-ce2b-4bb9-b697-4caca783a805"), Text = "Radiobox", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -39, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-39", SortOrder = 2, UniqueId = new Guid("f38f0ac7-1d27-439c-9f3f-089cd8825a53"), Text = "Dropdown multiple", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -38, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-38", SortOrder = 2, UniqueId = new Guid("fd9f1447-6c61-4a7c-9595-5aa39147d318"), Text = "Folder Browser", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -37, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-37", SortOrder = 2, UniqueId = new Guid("0225af17-b302-49cb-9176-b9f35cab9c17"), Text = "Approved Color", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = -36, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-36", SortOrder = 2, UniqueId = new Guid("e4d66c0f-b935-4200-81f0-025f7256b89a"), Text = "Date Picker with time", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1031, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1031", SortOrder = 2, UniqueId = new Guid("f38bd2d7-65d0-48e6-95dc-87ce06ec2d3d"), Text = "Folder", NodeObjectType = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1032, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1032", SortOrder = 2, UniqueId = new Guid("cc07b313-0843-4aa8-bbda-871c8da728c8"), Text = "Image", NodeObjectType = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1033, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1033", SortOrder = 2, UniqueId = new Guid("4c52d8ab-54e6-40cd-999c-7a5f24903e4d"), Text = "File", NodeObjectType = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1034, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1034", SortOrder = 2, UniqueId = new Guid("a6857c73-d6e9-480c-b6e6-f15f6ad11125"), Text = "Content Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1035, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1035", SortOrder = 2, UniqueId = new Guid("93929b9a-93a2-4e2a-b239-d99334440a59"), Text = "Media Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1036, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1036", SortOrder = 2, UniqueId = new Guid("2b24165f-9782-4aa3-b459-1de4a4d21f60"), Text = "Member Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1038, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1038", SortOrder = 2, UniqueId = new Guid("1251c96c-185c-4e9b-93f4-b48205573cbd"), Text = "Simple Editor", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1039, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1039", SortOrder = 2, UniqueId = new Guid("06f349a9-c949-4b6a-8660-59c10451af42"), Text = "Ultimate Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1040, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1040", SortOrder = 2, UniqueId = new Guid("21e798da-e06e-4eda-a511-ed257f78d4fa"), Text = "Related Links", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1041, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1041", SortOrder = 2, UniqueId = new Guid("b6b73142-b9c1-4bf8-a16d-e1c23320b549"), Text = "Tags", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1042, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1042", SortOrder = 2, UniqueId = new Guid("0a452bd5-83f9-4bc3-8403-1286e13fb77e"), Text = "Macro Container", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); - _database.Insert(new NodeDto { NodeId = 1043, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1043", SortOrder = 2, UniqueId = new Guid("1df9f033-e6d4-451f-b8d2-e0cbc50a836f"), Text = "Image Cropper", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + using (var transaction = _database.GetTransaction()) + { + _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoNode] ON ")); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -1, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1", SortOrder = 0, UniqueId = new Guid("916724a5-173d-4619-b97e-b9de133dd6f5"), Text = "SYSTEM DATA: umbraco master root", NodeObjectType = new Guid("ea7d8624-4cfe-4578-a871-24aa946bf34d"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -20, Trashed = false, ParentId = -1, UserId = 0, Level = 0, Path = "-1,-20", SortOrder = 0, UniqueId = new Guid("0F582A79-1E41-4CF0-BFA0-76340651891A"), Text = "Recycle Bin", NodeObjectType = new Guid("01BB7FF2-24DC-4C0C-95A2-C24EF72BBAC8"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -92, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-92", SortOrder = 35, UniqueId = new Guid("f0bc4bfb-b499-40d6-ba86-058885a5178c"), Text = "Label", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -90, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-90", SortOrder = 34, UniqueId = new Guid("84c6b441-31df-4ffe-b67e-67d5bc3ae65a"), Text = "Upload", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -89, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-89", SortOrder = 33, UniqueId = new Guid("c6bac0dd-4ab9-45b1-8e30-e4b619ee5da3"), Text = "Textbox multiple", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -88, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-88", SortOrder = 32, UniqueId = new Guid("0cc0eba1-9960-42c9-bf9b-60e150b429ae"), Text = "Textstring", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -87, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-87", SortOrder = 4, UniqueId = new Guid("ca90c950-0aff-4e72-b976-a30b1ac57dad"), Text = "Richtext editor", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -51, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-51", SortOrder = 2, UniqueId = new Guid("2e6d3631-066e-44b8-aec4-96f09099b2b5"), Text = "Numeric", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -49, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-49", SortOrder = 2, UniqueId = new Guid("92897bc6-a5f3-4ffe-ae27-f2e7e33dda49"), Text = "True/false", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -43, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-43", SortOrder = 2, UniqueId = new Guid("fbaf13a8-4036-41f2-93a3-974f678c312a"), Text = "Checkbox list", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -42, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-42", SortOrder = 2, UniqueId = new Guid("0b6a45e7-44ba-430d-9da5-4e46060b9e03"), Text = "Dropdown", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -41, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-41", SortOrder = 2, UniqueId = new Guid("5046194e-4237-453c-a547-15db3a07c4e1"), Text = "Date Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -40, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-40", SortOrder = 2, UniqueId = new Guid("bb5f57c9-ce2b-4bb9-b697-4caca783a805"), Text = "Radiobox", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -39, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-39", SortOrder = 2, UniqueId = new Guid("f38f0ac7-1d27-439c-9f3f-089cd8825a53"), Text = "Dropdown multiple", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -38, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-38", SortOrder = 2, UniqueId = new Guid("fd9f1447-6c61-4a7c-9595-5aa39147d318"), Text = "Folder Browser", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -37, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-37", SortOrder = 2, UniqueId = new Guid("0225af17-b302-49cb-9176-b9f35cab9c17"), Text = "Approved Color", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = -36, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,-36", SortOrder = 2, UniqueId = new Guid("e4d66c0f-b935-4200-81f0-025f7256b89a"), Text = "Date Picker with time", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1031, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1031", SortOrder = 2, UniqueId = new Guid("f38bd2d7-65d0-48e6-95dc-87ce06ec2d3d"), Text = "Folder", NodeObjectType = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1032, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1032", SortOrder = 2, UniqueId = new Guid("cc07b313-0843-4aa8-bbda-871c8da728c8"), Text = "Image", NodeObjectType = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1033, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1033", SortOrder = 2, UniqueId = new Guid("4c52d8ab-54e6-40cd-999c-7a5f24903e4d"), Text = "File", NodeObjectType = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1034, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1034", SortOrder = 2, UniqueId = new Guid("a6857c73-d6e9-480c-b6e6-f15f6ad11125"), Text = "Content Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1035, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1035", SortOrder = 2, UniqueId = new Guid("93929b9a-93a2-4e2a-b239-d99334440a59"), Text = "Media Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1036, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1036", SortOrder = 2, UniqueId = new Guid("2b24165f-9782-4aa3-b459-1de4a4d21f60"), Text = "Member Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1038, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1038", SortOrder = 2, UniqueId = new Guid("1251c96c-185c-4e9b-93f4-b48205573cbd"), Text = "Simple Editor", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1039, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1039", SortOrder = 2, UniqueId = new Guid("06f349a9-c949-4b6a-8660-59c10451af42"), Text = "Ultimate Picker", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1040, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1040", SortOrder = 2, UniqueId = new Guid("21e798da-e06e-4eda-a511-ed257f78d4fa"), Text = "Related Links", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1041, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1041", SortOrder = 2, UniqueId = new Guid("b6b73142-b9c1-4bf8-a16d-e1c23320b549"), Text = "Tags", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1042, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1042", SortOrder = 2, UniqueId = new Guid("0a452bd5-83f9-4bc3-8403-1286e13fb77e"), Text = "Macro Container", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1043, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1043", SortOrder = 2, UniqueId = new Guid("1df9f033-e6d4-451f-b8d2-e0cbc50a836f"), Text = "Image Cropper", NodeObjectType = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"), CreateDate = DateTime.UtcNow }); + _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoNode] OFF ")); + transaction.Complete(); + } } private void CreateCmsContentTypeData() { - _database.Insert(new ContentTypeDto { PrimaryKey = 532, NodeId = 1031, Alias = "Folder", Icon = "folder.gif", IsContainer = true, AllowAtRoot = true}); - _database.Insert(new ContentTypeDto { PrimaryKey = 533, NodeId = 1032, Alias = "Image", Icon = "mediaPhoto.gif" }); - _database.Insert(new ContentTypeDto { PrimaryKey = 534, NodeId = 1033, Alias = "File", Icon = "mediaFile.gif" }); + _database.Insert(new ContentTypeDto { PrimaryKey = 532, NodeId = 1031, Alias = "Folder", Icon = "folder.gif", Thumbnail = "folder.png", IsContainer = true, AllowAtRoot = true }); + _database.Insert(new ContentTypeDto { PrimaryKey = 533, NodeId = 1032, Alias = "Image", Icon = "mediaPhoto.gif", Thumbnail = "folder.png" }); + _database.Insert(new ContentTypeDto { PrimaryKey = 534, NodeId = 1033, Alias = "File", Icon = "mediaFile.gif", Thumbnail = "folder.png" }); } private void CreateUmbracoUserData() { - _database.Insert(new UserDto{ Id = 0, Disabled = false, NoConsole = false, Type = 1, ContentStartId = -1, MediaStartId = -1, UserName = "Administrator", Login = "admin", Password = "default", Email = "", UserLanguage = "en"}); + using (var transaction = _database.GetTransaction()) + { + _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoUser] ON ")); + _database.Insert("umbracoUser", "id", false, new UserDto { Id = 0, Disabled = false, NoConsole = false, Type = 1, ContentStartId = -1, MediaStartId = -1, UserName = "Administrator", Login = "admin", Password = "default", Email = "", UserLanguage = "en", DefaultPermissions = null, DefaultToLiveEditing = false }); + _database.Execute(new Sql("SET IDENTITY_INSERT [umbracoUser] OFF ")); + + transaction.Complete(); + } } private void CreateUmbracoUserTypeData() @@ -124,23 +177,36 @@ namespace Umbraco.Core.Persistence.Migrations.Initial private void CreateCmsPropertyTypeGroupData() { - _database.Insert(new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1}); - _database.Insert(new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1 }); - _database.Insert(new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1 }); + using (var transaction = _database.GetTransaction()) + { + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyTypeGroup] ON ")); + _database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1 }); + _database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1 }); + _database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1 }); + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyTypeGroup] OFF ")); + + transaction.Complete(); + } } private void CreateCmsPropertyTypeData() { - _database.Insert(new PropertyTypeDto { Id = 6, DataTypeId = -90, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoFile", Name = "Upload image", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null}); - _database.Insert(new PropertyTypeDto { Id = 7, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoWidth", Name = "Width", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 8, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoHeight", Name = "Height", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 9, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoBytes", Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 10, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoExtension", Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 24, DataTypeId = -90, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoFile", Name = "Upload file", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 25, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoExtension", Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 26, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoBytes", Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); - _database.Insert(new PropertyTypeDto { Id = 27, DataTypeId = -38, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + using (var transaction = _database.GetTransaction()) + { + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyType] ON ")); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 6, DataTypeId = -90, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoFile", Name = "Upload image", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 7, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoWidth", Name = "Width", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 8, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoHeight", Name = "Height", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 9, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoBytes", Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 10, DataTypeId = -92, ContentTypeId = 1032, PropertyTypeGroupId = 3, Alias = "umbracoExtension", Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 24, DataTypeId = -90, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoFile", Name = "Upload file", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 25, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoExtension", Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 26, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = "umbracoBytes", Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 27, DataTypeId = -38, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null }); + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsPropertyType] OFF ")); + transaction.Complete(); + } } private void CreateUmbracoLanguageData() @@ -148,7 +214,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert(new LanguageDto { Id = 1, IsoCode = "en-US", CultureName = "en-US" }); } - private void CreateCmsContentTypeAllowedContentType() + private void CreateCmsContentTypeAllowedContentTypeData() { _database.Insert(new ContentTypeAllowedContentTypeDto { Id = 1031, AllowedId = 1031 }); _database.Insert(new ContentTypeAllowedContentTypeDto { Id = 1031, AllowedId = 1032 }); @@ -157,41 +223,48 @@ namespace Umbraco.Core.Persistence.Migrations.Initial private void CreateCmsDataTypeData() { - _database.Insert(new DataTypeDto { PrimaryKey = 4, DataTypeId = -49, ControlId = new Guid("38b352c1-e9f8-4fd8-9324-9a2eab06d97a"), DbType = "Integer" }); - _database.Insert(new DataTypeDto { PrimaryKey = 6, DataTypeId = -51, ControlId = new Guid("1413afcb-d19a-4173-8e9a-68288d2a73b8"), DbType = "Integer" }); - _database.Insert(new DataTypeDto { PrimaryKey = 8, DataTypeId = -87, ControlId = new Guid("5E9B75AE-FACE-41c8-B47E-5F4B0FD82F83"), DbType = "Ntext" }); - _database.Insert(new DataTypeDto { PrimaryKey = 9, DataTypeId = -88, ControlId = new Guid("ec15c1e5-9d90-422a-aa52-4f7622c63bea"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 10, DataTypeId = -89, ControlId = new Guid("67db8357-ef57-493e-91ac-936d305e0f2a"), DbType = "Ntext" }); - _database.Insert(new DataTypeDto { PrimaryKey = 11, DataTypeId = -90, ControlId = new Guid("5032a6e6-69e3-491d-bb28-cd31cd11086c"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 12, DataTypeId = -91, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 13, DataTypeId = -92, ControlId = new Guid("6c738306-4c17-4d88-b9bd-6546f3771597"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 14, DataTypeId = -36, ControlId = new Guid("b6fb1622-afa5-4bbf-a3cc-d9672a442222"), DbType = "Date" }); - _database.Insert(new DataTypeDto { PrimaryKey = 15, DataTypeId = -37, ControlId = new Guid("f8d60f68-ec59-4974-b43b-c46eb5677985"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 16, DataTypeId = -38, ControlId = new Guid("cccd4ae9-f399-4ed2-8038-2e88d19e810c"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 17, DataTypeId = -39, ControlId = new Guid("928639ed-9c73-4028-920c-1e55dbb68783"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 18, DataTypeId = -40, ControlId = new Guid("a52c7c1c-c330-476e-8605-d63d3b84b6a6"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 19, DataTypeId = -41, ControlId = new Guid("23e93522-3200-44e2-9f29-e61a6fcbb79a"), DbType = "Date" }); - _database.Insert(new DataTypeDto { PrimaryKey = 20, DataTypeId = -42, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Integer" }); - _database.Insert(new DataTypeDto { PrimaryKey = 21, DataTypeId = -43, ControlId = new Guid("b4471851-82b6-4c75-afa4-39fa9c6a75e9"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 22, DataTypeId = -44, ControlId = new Guid("a3776494-0574-4d93-b7de-efdfdec6f2d1"), DbType = "Ntext" }); - _database.Insert(new DataTypeDto { PrimaryKey = 23, DataTypeId = -128, ControlId = new Guid("a52c7c1c-c330-476e-8605-d63d3b84b6a6"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 24, DataTypeId = -129, ControlId = new Guid("928639ed-9c73-4028-920c-1e55dbb68783"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 25, DataTypeId = -130, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 26, DataTypeId = -131, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 27, DataTypeId = -132, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 28, DataTypeId = -133, ControlId = new Guid("6c738306-4c17-4d88-b9bd-6546f3771597"), DbType = "Ntext" }); - _database.Insert(new DataTypeDto { PrimaryKey = 29, DataTypeId = -134, ControlId = new Guid("928639ed-9c73-4028-920c-1e55dbb68783"), DbType = "Nvarchar" }); - _database.Insert(new DataTypeDto { PrimaryKey = 30, DataTypeId = -50, ControlId = new Guid("aaf99bb2-dbbe-444d-a296-185076bf0484"), DbType = "Date"}); - _database.Insert(new DataTypeDto { PrimaryKey = 31, DataTypeId = 1034, ControlId = new Guid("158aa029-24ed-4948-939e-c3da209e5fba"), DbType = "Integer"}); - _database.Insert(new DataTypeDto { PrimaryKey = 32, DataTypeId = 1035, ControlId = new Guid("ead69342-f06d-4253-83ac-28000225583b"), DbType = "Integer"}); - _database.Insert(new DataTypeDto { PrimaryKey = 33, DataTypeId = 1036, ControlId = new Guid("39f533e4-0551-4505-a64b-e0425c5ce775"), DbType = "Integer"}); - _database.Insert(new DataTypeDto { PrimaryKey = 35, DataTypeId = 1038, ControlId = new Guid("60b7dabf-99cd-41eb-b8e9-4d2e669bbde9"), DbType = "Ntext"}); - _database.Insert(new DataTypeDto { PrimaryKey = 36, DataTypeId = 1039, ControlId = new Guid("cdbf0b5d-5cb2-445f-bc12-fcaaec07cf2c"), DbType = "Ntext"}); - _database.Insert(new DataTypeDto { PrimaryKey = 37, DataTypeId = 1040, ControlId = new Guid("71b8ad1a-8dc2-425c-b6b8-faa158075e63"), DbType = "Ntext"}); - _database.Insert(new DataTypeDto { PrimaryKey = 38, DataTypeId = 1041, ControlId = new Guid("4023e540-92f5-11dd-ad8b-0800200c9a66"), DbType = "Ntext"}); - _database.Insert(new DataTypeDto { PrimaryKey = 39, DataTypeId = 1042, ControlId = new Guid("474FCFF8-9D2D-11DE-ABC6-AD7A56D89593"), DbType = "Ntext"}); - _database.Insert(new DataTypeDto { PrimaryKey = 40, DataTypeId = 1043, ControlId = new Guid("7A2D436C-34C2-410F-898F-4A23B3D79F54"), DbType = "Ntext"}); + using (var transaction = _database.GetTransaction()) + { + //TODO Check which of the DataTypeIds below doesn't exist in umbracoNode, which results in a foreign key constraint errors. + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsDataType] ON ")); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 4, DataTypeId = -49, ControlId = new Guid("38b352c1-e9f8-4fd8-9324-9a2eab06d97a"), DbType = "Integer" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 6, DataTypeId = -51, ControlId = new Guid("1413afcb-d19a-4173-8e9a-68288d2a73b8"), DbType = "Integer" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 8, DataTypeId = -87, ControlId = new Guid("5E9B75AE-FACE-41c8-B47E-5F4B0FD82F83"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 9, DataTypeId = -88, ControlId = new Guid("ec15c1e5-9d90-422a-aa52-4f7622c63bea"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 10, DataTypeId = -89, ControlId = new Guid("67db8357-ef57-493e-91ac-936d305e0f2a"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 11, DataTypeId = -90, ControlId = new Guid("5032a6e6-69e3-491d-bb28-cd31cd11086c"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 12, DataTypeId = -91, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 13, DataTypeId = -92, ControlId = new Guid("6c738306-4c17-4d88-b9bd-6546f3771597"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 14, DataTypeId = -36, ControlId = new Guid("b6fb1622-afa5-4bbf-a3cc-d9672a442222"), DbType = "Date" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 15, DataTypeId = -37, ControlId = new Guid("f8d60f68-ec59-4974-b43b-c46eb5677985"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 16, DataTypeId = -38, ControlId = new Guid("cccd4ae9-f399-4ed2-8038-2e88d19e810c"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 17, DataTypeId = -39, ControlId = new Guid("928639ed-9c73-4028-920c-1e55dbb68783"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 18, DataTypeId = -40, ControlId = new Guid("a52c7c1c-c330-476e-8605-d63d3b84b6a6"), DbType = "Nvarchar" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 19, DataTypeId = -41, ControlId = new Guid("23e93522-3200-44e2-9f29-e61a6fcbb79a"), DbType = "Date" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 20, DataTypeId = -42, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Integer" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 21, DataTypeId = -43, ControlId = new Guid("b4471851-82b6-4c75-afa4-39fa9c6a75e9"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 22, DataTypeId = -44, ControlId = new Guid("a3776494-0574-4d93-b7de-efdfdec6f2d1"), DbType = "Ntext" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 23, DataTypeId = -128, ControlId = new Guid("a52c7c1c-c330-476e-8605-d63d3b84b6a6"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 24, DataTypeId = -129, ControlId = new Guid("928639ed-9c73-4028-920c-1e55dbb68783"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 25, DataTypeId = -130, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 26, DataTypeId = -131, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 27, DataTypeId = -132, ControlId = new Guid("a74ea9c9-8e18-4d2a-8cf6-73c6206c5da6"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 28, DataTypeId = -133, ControlId = new Guid("6c738306-4c17-4d88-b9bd-6546f3771597"), DbType = "Ntext" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 29, DataTypeId = -134, ControlId = new Guid("928639ed-9c73-4028-920c-1e55dbb68783"), DbType = "Nvarchar" }); + //_database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 30, DataTypeId = -50, ControlId = new Guid("aaf99bb2-dbbe-444d-a296-185076bf0484"), DbType = "Date" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 31, DataTypeId = 1034, ControlId = new Guid("158aa029-24ed-4948-939e-c3da209e5fba"), DbType = "Integer" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 32, DataTypeId = 1035, ControlId = new Guid("ead69342-f06d-4253-83ac-28000225583b"), DbType = "Integer" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 33, DataTypeId = 1036, ControlId = new Guid("39f533e4-0551-4505-a64b-e0425c5ce775"), DbType = "Integer" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 35, DataTypeId = 1038, ControlId = new Guid("60b7dabf-99cd-41eb-b8e9-4d2e669bbde9"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 36, DataTypeId = 1039, ControlId = new Guid("cdbf0b5d-5cb2-445f-bc12-fcaaec07cf2c"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 37, DataTypeId = 1040, ControlId = new Guid("71b8ad1a-8dc2-425c-b6b8-faa158075e63"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 38, DataTypeId = 1041, ControlId = new Guid("4023e540-92f5-11dd-ad8b-0800200c9a66"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 39, DataTypeId = 1042, ControlId = new Guid("474FCFF8-9D2D-11DE-ABC6-AD7A56D89593"), DbType = "Ntext" }); + _database.Insert("cmsDataType", "pk", false, new DataTypeDto { PrimaryKey = 40, DataTypeId = 1043, ControlId = new Guid("7A2D436C-34C2-410F-898F-4A23B3D79F54"), DbType = "Ntext" }); + _database.Execute(new Sql("SET IDENTITY_INSERT [cmsDataType] OFF ")); + transaction.Complete(); + } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs index 748f422fa1..6aabc063a4 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseCreation.cs @@ -14,13 +14,52 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database = database; } + /// + /// The save event handler + /// + internal delegate void DatabaseEventHandler(DatabaseCreationEventArgs e); + + /// + /// Occurs when [before save]. + /// + internal static event DatabaseEventHandler BeforeCreation; + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected internal virtual void FireBeforeCreation(DatabaseCreationEventArgs e) + { + if (BeforeCreation != null) + { + BeforeCreation(e); + } + } + + /// + /// Occurs when [after save]. + /// + internal static event DatabaseEventHandler AfterCreation; + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected virtual void FireAfterCreation(DatabaseCreationEventArgs e) + { + if (AfterCreation != null) + { + AfterCreation(e); + } + } + /// /// Initialize the database by creating the umbraco db schema /// public void InitializeDatabaseSchema() { - //NOTE Please mind the order of the table creation, as some references requires other tables. - using(var transaction = _database.GetTransaction()) + var e = new DatabaseCreationEventArgs(); + FireBeforeCreation(e); + + if (!e.Cancel) { _database.CreateTable(); @@ -35,7 +74,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.CreateTable(); _database.CreateTable(); - + _database.CreateTable(); _database.CreateTable(); @@ -50,24 +89,24 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); - + _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); - + _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); - + _database.CreateTable(); _database.CreateTable(); - + _database.CreateTable(); _database.CreateTable(); @@ -84,9 +123,80 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.CreateTable(); _database.CreateTable(); _database.CreateTable(); - - transaction.Complete(); + + //NOTE Please mind the order of the table creation, as some references requires other tables. + /*using (var transaction = _database.GetTransaction()) + { + _database.CreateTable(); + + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + + _database.CreateTable(); + _database.CreateTable(); + _database.CreateTable(); + + transaction.Complete(); + }*/ } + + FireAfterCreation(e); } } + + internal class DatabaseCreationEventArgs : System.ComponentModel.CancelEventArgs{} } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/PetaPoco.cs b/src/Umbraco.Core/Persistence/PetaPoco.cs index 026366420f..13bf593dcb 100644 --- a/src/Umbraco.Core/Persistence/PetaPoco.cs +++ b/src/Umbraco.Core/Persistence/PetaPoco.cs @@ -1769,8 +1769,11 @@ namespace Umbraco.Core.Persistence // Work out bound properties bool ExplicitColumns = t.GetCustomAttributes(typeof(ExplicitColumnsAttribute), true).Length > 0; Columns = new Dictionary(StringComparer.OrdinalIgnoreCase); - //MCH NOTE: Changing bindingflags on GetProperties() to include internal properties - foreach (var pi in t.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) + + //MCH NOTE: Changing bindingflags and using GetAllProperties() to include internal + //properties as well as work for interfaces by flattening the hierarchy. + var properties = t.GetAllProperties(); + foreach (var pi in properties) { // Work out if properties is to be included var ColAttrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index 84422a2ae2..b0d20f16bc 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -7,6 +7,10 @@ namespace Umbraco.Core.Persistence { public static class PetaPocoExtensions { + internal delegate void CreateTableEventHandler(string tableName, Database db, TableCreationEventArgs e); + + internal static event CreateTableEventHandler NewTable; + public static void CreateTable(this Database db) where T : new() { @@ -54,6 +58,15 @@ namespace Umbraco.Core.Persistence { int created = db.Execute(new Sql(createSql)); + if (NewTable != null) + { + var e = new TableCreationEventArgs(); + NewTable(tableName, db, e); + } + + //TODO Figure out how to deal with base data before/after db and constraint creation + //Possibly add an internal task to trigger the data creation prior to creating constraints? + if(!string.IsNullOrEmpty(createPrimaryKeySql)) db.Execute(new Sql(createPrimaryKeySql)); @@ -96,14 +109,18 @@ namespace Umbraco.Core.Persistence public static void Initialize(this Database db) { + NewTable += PetaPocoExtensions_NewTable; + var creation = new DatabaseCreation(db); creation.InitializeDatabaseSchema(); } - public static void InstallBaseData(this Database db) + static void PetaPocoExtensions_NewTable(string tableName, Database db, TableCreationEventArgs e) { var baseDataCreation = new BaseDataCreation(db); - baseDataCreation.InitializeBaseData(); + baseDataCreation.InitializeBaseData(tableName); } } + + internal class TableCreationEventArgs : System.ComponentModel.CancelEventArgs{} } \ No newline at end of file diff --git a/src/Umbraco.Core/TypeExtensions.cs b/src/Umbraco.Core/TypeExtensions.cs index 47f876abf0..33d59ccb62 100644 --- a/src/Umbraco.Core/TypeExtensions.cs +++ b/src/Umbraco.Core/TypeExtensions.cs @@ -205,6 +205,52 @@ namespace Umbraco.Core } + /// + /// Gets all properties in a flat hierarchy + /// + /// Includes both Public and Non-Public properties + /// + /// + public static PropertyInfo[] GetAllProperties(this Type type) + { + if (type.IsInterface) + { + var propertyInfos = new List(); + + var considered = new List(); + var queue = new Queue(); + considered.Add(type); + queue.Enqueue(type); + while (queue.Count > 0) + { + var subType = queue.Dequeue(); + foreach (var subInterface in subType.GetInterfaces()) + { + if (considered.Contains(subInterface)) continue; + + considered.Add(subInterface); + queue.Enqueue(subInterface); + } + + var typeProperties = subType.GetProperties( + BindingFlags.FlattenHierarchy + | BindingFlags.Public + | BindingFlags.NonPublic + | BindingFlags.Instance); + + var newPropertyInfos = typeProperties + .Where(x => !propertyInfos.Contains(x)); + + propertyInfos.InsertRange(0, newPropertyInfos); + } + + return propertyInfos.ToArray(); + } + + return type.GetProperties(BindingFlags.FlattenHierarchy + | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + } + /// /// Determines whether the specified actual type is type. /// diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index df40bd7d2a..33067a71ad 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -9,11 +9,11 @@ namespace Umbraco.Tests.Services [TestFixture] public class ContentServiceTests : BaseDatabaseFactoryTest { - /*[Test]*/ + [Test] public void Can_Create_Content() { // Arrange - var contentService = new ContentService(); + var contentService = GetUmbracoContext("/test", 1234).Services.ContentService; // Act IContent content = contentService.CreateContent(-1, "umbTextpage"); diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index b593a1bae7..859d2a45c5 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -2,9 +2,18 @@ using System.Configuration; using System.Data.SqlServerCe; using System.IO; +using System.Web.Routing; +using System.Xml; using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.IO; +using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Tests.Stubs; +using Umbraco.Web; +using Umbraco.Web.Routing; +using umbraco.BusinessLogic; namespace Umbraco.Tests.TestHelpers { @@ -21,6 +30,14 @@ namespace Umbraco.Tests.TestHelpers string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); + Resolution.Freeze(); + ApplicationContext = new ApplicationContext() { IsReady = true }; + //we need to clear out all currently created template files + var masterPages = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Masterpages)); + masterPages.GetFiles().ForEach(x => x.Delete()); + var mvcViews = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.MvcViews)); + mvcViews.GetFiles().ForEach(x => x.Delete()); + //Delete database file before continueing string filePath = string.Concat(path, "\\test.sdf"); if (File.Exists(filePath)) @@ -39,7 +56,6 @@ namespace Umbraco.Tests.TestHelpers //Create the umbraco database DatabaseFactory.Current.Database.Initialize(); - DatabaseFactory.Current.Database.InstallBaseData(); } [TearDown] @@ -47,5 +63,89 @@ namespace Umbraco.Tests.TestHelpers { AppDomain.CurrentDomain.SetData("DataDirectory", null); } + + protected ApplicationContext ApplicationContext { get; private set; } + + protected UmbracoContext GetUmbracoContext(string url, int templateId, RouteData routeData = null) + { + var ctx = new UmbracoContext( + GetHttpContextFactory(url, routeData).HttpContext, + ApplicationContext, + GetRoutesCache()); + SetupUmbracoContextForTest(ctx, templateId); + return ctx; + } + + protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) + { + var factory = routeData != null + ? new FakeHttpContextFactory(url, routeData) + : new FakeHttpContextFactory(url); + + + //set the state helper + StateHelper.HttpContext = factory.HttpContext; + + return factory; + } + + internal virtual IRoutesCache GetRoutesCache() + { + return new FakeRoutesCache(); + } + + /// + /// Initlializes the UmbracoContext with specific XML + /// + /// + /// + protected void SetupUmbracoContextForTest(UmbracoContext umbracoContext, int templateId) + { + umbracoContext.GetXmlDelegate = () => + { + var xDoc = new XmlDocument(); + + //create a custom xml structure to return + + xDoc.LoadXml(GetXmlContent(templateId)); + //return the custom x doc + return xDoc; + }; + } + + protected virtual string GetXmlContent(int templateId) + { + return @" + + + + +]> + + + + + 1 + + This is some content]]> + + + + + + + + + + + + + + + + +"; + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Services/ContentService.cs b/src/Umbraco.Web/Services/ContentService.cs index de725970ba..7992e560bb 100644 --- a/src/Umbraco.Web/Services/ContentService.cs +++ b/src/Umbraco.Web/Services/ContentService.cs @@ -49,12 +49,12 @@ namespace Umbraco.Web.Services var contentTypes = repository.GetByQuery(query); if (!contentTypes.Any()) - throw new Exception(string.Format("No ContentType matching the passed in Alias: {0} was found", contentTypeAlias)); + throw new Exception(string.Format("No ContentType matching the passed in Alias: '{0}' was found", contentTypeAlias)); var contentType = contentTypes.First(); if (contentType == null) - throw new Exception(string.Format("No ContentType matching the passed in Alias: {0} was found", contentTypeAlias)); + throw new Exception(string.Format("No ContentType matching the passed in Alias: '{0}' was found", contentTypeAlias)); return new Content(parentId, contentType); } diff --git a/src/Umbraco.Web/Services/ServiceContext.cs b/src/Umbraco.Web/Services/ServiceContext.cs new file mode 100644 index 0000000000..6cd7016e3c --- /dev/null +++ b/src/Umbraco.Web/Services/ServiceContext.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Concurrent; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Web.Publishing; + +namespace Umbraco.Web.Services +{ + /// + /// The Umbraco ServiceContext, which provides access to the following services: + /// , , , + /// , and . + /// + public class ServiceContext + { + #region Singleton + private static readonly Lazy lazy = new Lazy(() => new ServiceContext()); + + public static ServiceContext Current { get { return lazy.Value; } } + + private ServiceContext() + { + if(_cache.IsEmpty) + { + BuildServiceCache(); + } + } + #endregion + + private readonly ConcurrentDictionary _cache = new ConcurrentDictionary(); + + /// + /// Builds the various services and adds them to the internal cache + /// + private void BuildServiceCache() + { + var provider = new PetaPocoUnitOfWorkProvider(); + var publishingStrategy = new PublishingStrategy(); + + var contentService = new ContentService(provider, publishingStrategy); + _cache.AddOrUpdate(typeof (IContentService).Name, contentService, (x, y) => contentService); + + var mediaService = new MediaService(provider); + _cache.AddOrUpdate(typeof(IMediaService).Name, mediaService, (x, y) => mediaService); + + var contentTypeService = new ContentTypeService(contentService, mediaService, provider); + _cache.AddOrUpdate(typeof(IContentTypeService).Name, contentTypeService, (x, y) => contentTypeService); + + var dataTypeService = new DataTypeService(provider); + _cache.AddOrUpdate(typeof(IDataTypeService).Name, dataTypeService, (x, y) => dataTypeService); + + var fileService = new FileService(provider); + _cache.AddOrUpdate(typeof(IFileService).Name, fileService, (x, y) => fileService); + + var localizationService = new LocalizationService(provider); + _cache.AddOrUpdate(typeof(ILocalizationService).Name, localizationService, (x, y) => localizationService); + } + + /// + /// Gets the + /// + public IContentService ContentService + { + get { return _cache[typeof (IContentService).Name] as IContentService; } + } + + /// + /// Gets the + /// + public IContentTypeService ContentTypeService + { + get { return _cache[typeof(IContentTypeService).Name] as IContentTypeService; } + } + + /// + /// Gets the + /// + public IDataTypeService DataTypeService + { + get { return _cache[typeof(IDataTypeService).Name] as IDataTypeService; } + } + + /// + /// Gets the + /// + public IFileService FileService + { + get { return _cache[typeof (IFileService).Name] as IFileService; } + } + + /// + /// Gets the + /// + public ILocalizationService LocalizationService + { + get { return _cache[typeof(ILocalizationService).Name] as ILocalizationService; } + } + + /// + /// Gets the + /// + public IMediaService MediaService + { + get { return _cache[typeof(IMediaService).Name] as IMediaService; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index aaaf0cdfa7..39b9dda9d4 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -327,6 +327,7 @@ + ASPXCodeBehind diff --git a/src/Umbraco.Web/UmbracoContext.cs b/src/Umbraco.Web/UmbracoContext.cs index a0ff73230b..a56e39c43e 100644 --- a/src/Umbraco.Web/UmbracoContext.cs +++ b/src/Umbraco.Web/UmbracoContext.cs @@ -2,6 +2,7 @@ using System.Web; using Umbraco.Core; using Umbraco.Web.Routing; +using Umbraco.Web.Services; using umbraco; using umbraco.IO; using umbraco.presentation; @@ -51,6 +52,8 @@ namespace Umbraco.Web Application = applicationContext; RoutesCache = routesCache; + Services = ServiceContext.Current; + // set the urls this.RequestUrl = httpContext.Request.Url; //RawUrl gets preserved across rewrites @@ -113,6 +116,11 @@ namespace Umbraco.Web /// public ApplicationContext Application { get; private set; } + /// + /// Gets the current ServiceContext, which exposes the various services + /// + public ServiceContext Services { get; private set; } + internal IRoutesCache RoutesCache { get; private set; } ///