diff --git a/zero.Core/Api/BackofficeApi.cs b/zero.Core/Api/BackofficeApi.cs index 17e2d5d4..6156e227 100644 --- a/zero.Core/Api/BackofficeApi.cs +++ b/zero.Core/Api/BackofficeApi.cs @@ -199,19 +199,19 @@ namespace zero.Core.Api isCreate = true; model.CreatedDate = DateTimeOffset.Now; - model.CreatedById = userId; + model.CreatedById = userId.Ref(); if (model is ILanguageAwareEntity) { - (model as ILanguageAwareEntity).LanguageId = "languages.1-A"; // TODO correct language id + (model as ILanguageAwareEntity).LanguageId = "languages.1-A".Ref(); // TODO correct language id } } // update name alias and last modified model.Alias = Safenames.Alias(model.Name); - model.LastModifiedById = userId; + model.LastModifiedById = userId.Ref(); model.LastModifiedDate = DateTimeOffset.Now; - model.CreatedById ??= userId; + model.CreatedById ??= userId.Ref(); using IAsyncDocumentSession session = Raven.OpenAsyncSession(); session.Advanced.WaitForIndexesAfterSaveChanges(throwOnTimeout: false); diff --git a/zero.Core/Api/MediaApi.cs b/zero.Core/Api/MediaApi.cs index 9a974a7e..21d5f957 100644 --- a/zero.Core/Api/MediaApi.cs +++ b/zero.Core/Api/MediaApi.cs @@ -145,7 +145,7 @@ namespace zero.Core.Api return EntityResult.Fail("@errors.idnotfound"); } - model.FolderId = parent?.Id; + model.FolderId = parent?.Id.Ref(); return await Save(model); } @@ -172,7 +172,7 @@ namespace zero.Core.Api // generate file id which is used as the folder name on disk media.FileId = Guid.NewGuid().ToString(); - media.FolderId = folderId; + media.FolderId = folderId.Ref(); // generate file name media.Name = Safenames.File(file.FileName); diff --git a/zero.Core/Api/MediaFolderApi.cs b/zero.Core/Api/MediaFolderApi.cs index 478e021c..1f751ba5 100644 --- a/zero.Core/Api/MediaFolderApi.cs +++ b/zero.Core/Api/MediaFolderApi.cs @@ -170,7 +170,7 @@ namespace zero.Core.Api return EntityResult.Fail("@errors.idnotfound"); } - model.ParentId = parent?.Id; + model.ParentId = parent?.Id.Ref(); return await Save(model); } diff --git a/zero.Core/Api/PagesApi.cs b/zero.Core/Api/PagesApi.cs index e7355352..070fa2ad 100644 --- a/zero.Core/Api/PagesApi.cs +++ b/zero.Core/Api/PagesApi.cs @@ -133,7 +133,7 @@ namespace zero.Core.Api return EntityResult.Fail("@errors.page.parentnotallowed"); } - model.ParentId = parent?.Id; + model.ParentId = parent?.Id.Ref(); return await Save(model); } @@ -154,7 +154,7 @@ namespace zero.Core.Api // update new page properties model.Id = null; - model.ParentId = parent?.Id; + model.ParentId = parent?.Id.Ref(); model.IsActive = false; model.CreatedDate = DateTimeOffset.Now; @@ -192,7 +192,7 @@ namespace zero.Core.Api IPage childPage = child.Value.Clone(); childPage.Id = null; childPage.IsActive = false; - childPage.ParentId = newParentId; + childPage.ParentId = newParentId.Ref(); childPage.CreatedDate = DateTimeOffset.Now; await session.StoreAsync(childPage); @@ -258,7 +258,7 @@ namespace zero.Core.Api string[] ids = entities.Select(x => x.OriginalId).ToArray(); // check if parents are available - string[] parentIds = entities.Select(x => x.Content as IPage).Where(x => x != null).Select(x => x.ParentId).ToArray(); + string[] parentIds = entities.Select(x => x.Content as IPage).Where(x => x != null && x.ParentId != null).Select(x => x.ParentId?.Id).ToArray(); parentIds = (await GetByIds(parentIds)).Where(x => x.Value != null).Select(x => x.Value.Id).ToArray(); // validate and restore all items @@ -276,7 +276,7 @@ namespace zero.Core.Api page.IsActive = false; // validate app and parent - if (!Scope.IsAllowed(page.AppId) || (!page.ParentId.IsNullOrEmpty() && !ids.Contains(page.ParentId) && !parentIds.Contains(page.ParentId))) + if (!Scope.IsAllowed(page.AppId) || (!page.ParentId.Id.IsNullOrEmpty() && !ids.Contains(page.ParentId) && !parentIds.Contains(page.ParentId))) { // TODO correct error message continue; diff --git a/zero.Core/Api/RevisionsApi.cs b/zero.Core/Api/RevisionsApi.cs index fb379166..f015833b 100644 --- a/zero.Core/Api/RevisionsApi.cs +++ b/zero.Core/Api/RevisionsApi.cs @@ -60,7 +60,7 @@ namespace zero.Core.Api List revisions = new List(); // load affected users as the revisions could have been edited by other users too - string[] userIds = items.Select(x => x.LastModifiedById).Distinct().ToArray(); + string[] userIds = items.Where(x => x.LastModifiedById != null).Select(x => x.LastModifiedById.Id).Distinct().ToArray(); Dictionary users = await session.LoadAsync(userIds); // create revision objects diff --git a/zero.Core/Api/SetupApi.cs b/zero.Core/Api/SetupApi.cs index 6057152c..b5dee927 100644 --- a/zero.Core/Api/SetupApi.cs +++ b/zero.Core/Api/SetupApi.cs @@ -75,7 +75,7 @@ namespace zero.Core.Api Email = model.User.Email, Name = model.User.Name, IsActive = true, - LanguageId = Options.DefaultLanguage, + LanguageId = Options.DefaultLanguage.Ref(), Alias = Safenames.Alias(model.User.Name), IsEmailConfirmed = true }; diff --git a/zero.Core/Entities/ILanguageAwareEntity.cs b/zero.Core/Entities/ILanguageAwareEntity.cs index 3f22c487..5777f948 100644 --- a/zero.Core/Entities/ILanguageAwareEntity.cs +++ b/zero.Core/Entities/ILanguageAwareEntity.cs @@ -10,6 +10,6 @@ /// /// Language of the entity /// - string LanguageId { get; set; } + Ref LanguageId { get; set; } } } diff --git a/zero.Core/Entities/Language.cs b/zero.Core/Entities/Language.cs index 336a7532..a7e4c5dd 100644 --- a/zero.Core/Entities/Language.cs +++ b/zero.Core/Entities/Language.cs @@ -14,7 +14,7 @@ namespace zero.Core.Entities public bool IsOptional { get; set; } /// - public string InheritedLanguageId { get; set; } + public Ref InheritedLanguageId { get; set; } } [Collection("Languages")] @@ -38,6 +38,6 @@ namespace zero.Core.Entities /// /// If this language is inherited it gets all missing properties from its parent /// - string InheritedLanguageId { get; set; } + Ref InheritedLanguageId { get; set; } } } \ No newline at end of file diff --git a/zero.Core/Entities/Media/Media.cs b/zero.Core/Entities/Media/Media.cs index 0df91dab..2c4c4127 100644 --- a/zero.Core/Entities/Media/Media.cs +++ b/zero.Core/Entities/Media/Media.cs @@ -10,7 +10,7 @@ namespace zero.Core.Entities public string FileId { get; set; } /// - public string FolderId { get; set; } + public Ref FolderId { get; set; } /// public string AlternativeText { get; set; } @@ -55,7 +55,7 @@ namespace zero.Core.Entities /// /// Id of the media folder /// - public string FolderId { get; set; } + public Ref FolderId { get; set; } /// /// Alternative text which is used when the image can't be loaded diff --git a/zero.Core/Entities/Media/MediaFolder.cs b/zero.Core/Entities/Media/MediaFolder.cs index 70bb5b87..24efa907 100644 --- a/zero.Core/Entities/Media/MediaFolder.cs +++ b/zero.Core/Entities/Media/MediaFolder.cs @@ -6,7 +6,7 @@ namespace zero.Core.Entities public class MediaFolder : ZeroEntity, IMediaFolder { /// - public string ParentId { get; set; } + public Ref ParentId { get; set; } } @@ -19,6 +19,6 @@ namespace zero.Core.Entities /// /// Parent folder id /// - string ParentId { get; set; } + Ref ParentId { get; set; } } } \ No newline at end of file diff --git a/zero.Core/Entities/Pages/Page.cs b/zero.Core/Entities/Pages/Page.cs index 68a20038..d0f78476 100644 --- a/zero.Core/Entities/Pages/Page.cs +++ b/zero.Core/Entities/Pages/Page.cs @@ -1,5 +1,4 @@ -using Microsoft.AspNetCore.Mvc; -using System; +using System; using zero.Core.Attributes; namespace zero.Core.Entities @@ -11,7 +10,7 @@ namespace zero.Core.Entities public class Page : ZeroEntity, IPage { /// - public string ParentId { get; set; } + public Ref ParentId { get; set; } /// public string PageTypeAlias { get; set; } @@ -30,7 +29,7 @@ namespace zero.Core.Entities /// /// Id of the parent page /// - string ParentId { get; set; } + Ref ParentId { get; set; } /// /// Alias of the used page type diff --git a/zero.Core/Entities/Ref.cs b/zero.Core/Entities/Ref.cs index 9d9cc460..791a2157 100644 --- a/zero.Core/Entities/Ref.cs +++ b/zero.Core/Entities/Ref.cs @@ -1,4 +1,5 @@ using System; +using zero.Core.Extensions; namespace zero.Core.Entities { @@ -6,6 +7,9 @@ namespace zero.Core.Entities { public Ref() : base() { } public Ref(string id) : base(id) { } + + public static implicit operator string(Ref obj) => obj.Id; + public static explicit operator Ref(string obj) => new Ref(obj); } @@ -32,6 +36,39 @@ namespace zero.Core.Entities { return Id; } + + + public bool Equals(Ref other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return string.Equals(Id, other.Id, StringComparison.InvariantCultureIgnoreCase); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + return ReferenceEquals(this, obj) || Equals((Ref)obj); + } + + public override int GetHashCode() + { + unchecked + { + return StringComparer.InvariantCultureIgnoreCase.GetHashCode(Id); + } + } + + public static bool operator ==(Ref left, Ref right) => Equals(left, right); + public static bool operator !=(Ref left, Ref right) => !Equals(left, right); + public static bool operator ==(Ref left, string right) => string.Equals(left?.Id, right, StringComparison.InvariantCultureIgnoreCase); + public static bool operator !=(Ref left, string right) => !string.Equals(left?.Id, right, StringComparison.InvariantCultureIgnoreCase); + public static bool operator ==(string left, Ref right) => string.Equals(left, right?.Id, StringComparison.InvariantCultureIgnoreCase); + public static bool operator !=(string left, Ref right) => !string.Equals(left, right?.Id, StringComparison.InvariantCultureIgnoreCase); + + public static implicit operator string(Ref obj) => obj.Id; + public static explicit operator Ref(string obj) => new Ref(obj); } @@ -46,4 +83,17 @@ namespace zero.Core.Entities public string[] Ids { get; set; } = new string[0] { }; } + + + public static class RefExtensions + { + public static Ref Ref(this string str) where T : IZeroIdEntity + { + if (str.IsNullOrEmpty()) + { + return null; + } + return new Ref(str); + } + } } diff --git a/zero.Core/Entities/Translation.cs b/zero.Core/Entities/Translation.cs index 51428c7d..2a995cbd 100644 --- a/zero.Core/Entities/Translation.cs +++ b/zero.Core/Entities/Translation.cs @@ -5,7 +5,7 @@ namespace zero.Core.Entities public class Translation : ZeroEntity, ITranslation { /// - public string LanguageId { get; set; } + public Ref LanguageId { get; set; } /// public string Key { get; set; } diff --git a/zero.Core/Entities/User/User.cs b/zero.Core/Entities/User/User.cs index 10d2e14e..ae4e13e2 100644 --- a/zero.Core/Entities/User/User.cs +++ b/zero.Core/Entities/User/User.cs @@ -25,10 +25,10 @@ namespace zero.Core.Entities public string SecurityStamp { get; set; } /// - public string AvatarId { get; set; } + public Ref AvatarId { get; set; } /// - public string LanguageId { get; set; } + public Ref LanguageId { get; set; } @@ -107,12 +107,12 @@ namespace zero.Core.Entities /// /// Avatar image /// - string AvatarId { get; set; } + Ref AvatarId { get; set; } /// /// Backoffice display language /// - string LanguageId { get; set; } + Ref LanguageId { get; set; } diff --git a/zero.Core/Entities/ZeroEntity.cs b/zero.Core/Entities/ZeroEntity.cs index f10e9791..f8c1adf9 100644 --- a/zero.Core/Entities/ZeroEntity.cs +++ b/zero.Core/Entities/ZeroEntity.cs @@ -25,13 +25,13 @@ namespace zero.Core.Entities public bool IsActive { get; set; } /// - public string LastModifiedById { get; set; } + public Ref LastModifiedById { get; set; } /// public DateTimeOffset LastModifiedDate { get; set; } /// - public string CreatedById { get; set; } + public Ref CreatedById { get; set; } /// public DateTimeOffset CreatedDate { get; set; } @@ -67,7 +67,7 @@ namespace zero.Core.Entities /// /// Backoffice user who last modified this content /// - public string LastModifiedById { get; set; } + public Ref LastModifiedById { get; set; } /// /// Date of last modification @@ -77,8 +77,7 @@ namespace zero.Core.Entities /// /// Backoffice user who created this content /// - [Overwrite] - public string CreatedById { get; set; } + public Ref CreatedById { get; set; } /// /// Date of creation diff --git a/zero.Core/Extensions/StringExtensions.cs b/zero.Core/Extensions/StringExtensions.cs index 18efe918..02655e95 100644 --- a/zero.Core/Extensions/StringExtensions.cs +++ b/zero.Core/Extensions/StringExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using System.Linq; +using zero.Core.Entities; namespace zero.Core.Extensions { @@ -80,6 +81,18 @@ namespace zero.Core.Extensions return String.IsNullOrWhiteSpace(input); } + + public static bool IsNullOrEmpty(this Ref input) + { + return input == null || String.IsNullOrEmpty(input); + } + + + public static bool IsNullOrWhiteSpace(this Ref input) + { + return input == null || String.IsNullOrWhiteSpace(input); + } + public static string ToCamelCase(this string input) { if (!String.IsNullOrEmpty(input) && input.Length > 1) diff --git a/zero.Core/Extensions/ValidatorExtensions.cs b/zero.Core/Extensions/ValidatorExtensions.cs index 7b1509bd..78a72a5f 100644 --- a/zero.Core/Extensions/ValidatorExtensions.cs +++ b/zero.Core/Extensions/ValidatorExtensions.cs @@ -149,6 +149,15 @@ namespace zero.Core.Extensions } + /// + /// Check if this reference exists and is an entity which can be referenced (appId = shared for shareable entities or appId = current) + /// + public static IRuleBuilderOptions> Exists(this IRuleBuilder ruleBuilder, IBackofficeStore store) where T : IZeroEntity where TRef : IZeroIdEntity + { + return ruleBuilder.Exists(store); + } + + /// /// Check if this reference exists and is an entity which can be referenced (appId = shared for shareable entities or appId = current) /// @@ -168,7 +177,34 @@ namespace zero.Core.Extensions if (typeof(IAppAwareEntity).IsAssignableFrom(typeof(TReference))) { - return model != null && ((IAppAwareEntity)model).InScope(entity.AppId); + return model != null && ((IAppAwareEntity)model).InScope(store.AppContext.AppId); + } + + return model != null; + }).WithMessage("@errors.forms.reference_notfound"); + } + + + /// + /// Check if this reference exists and is an entity which can be referenced (appId = shared for shareable entities or appId = current) + /// + public static IRuleBuilderOptions> Exists(this IRuleBuilder> ruleBuilder, IBackofficeStore store) where T : IZeroEntity where TReference : IZeroEntity + { + return ruleBuilder.MustAsync(async (entity, id, context, cancellation) => + { + if (id is null || id.Id.IsNullOrWhiteSpace()) + { + return true; + } + + bool includeShared = typeof(IAppAwareShareableEntity).IsAssignableFrom(typeof(T)); + + using IAsyncDocumentSession session = store.Raven.OpenAsyncSession(); + TReference model = await session.LoadAsync(id.Id); + + if (typeof(IAppAwareEntity).IsAssignableFrom(typeof(TReference))) + { + return model != null && ((IAppAwareEntity)model).InScope(store.AppContext.AppId); } return model != null; diff --git a/zero.Core/Utils/RefJsonConverter.cs b/zero.Core/Utils/RefJsonConverter.cs index 247d7bb3..776cad4c 100644 --- a/zero.Core/Utils/RefJsonConverter.cs +++ b/zero.Core/Utils/RefJsonConverter.cs @@ -10,12 +10,12 @@ namespace zero.Core.Utils { private readonly Type type; - private readonly string idProperty; + //private readonly string idProperty; public RefJsonConverter() { type = typeof(Ref<>); - idProperty = nameof(Ref.Id); + //idProperty = nameof(Ref.Id); } diff --git a/zero.Core/Validation/LanguageValidator.cs b/zero.Core/Validation/LanguageValidator.cs index 2a1b9c37..f77d4a3f 100644 --- a/zero.Core/Validation/LanguageValidator.cs +++ b/zero.Core/Validation/LanguageValidator.cs @@ -15,7 +15,7 @@ namespace zero.Core.Validation RuleFor(x => x.IsDefault).Unique(store).When(x => x.IsDefault).WithMessage("@language.errors.default_unique"); RuleFor(x => x.IsDefault).ExpectAnyUnique(store, expectedValue: true).When(x => !x.IsDefault).WithMessage("@language.errors.needs_default"); RuleFor(x => x.InheritedLanguageId).Must((entity, value) => !entity.Id.Equals(value, StringComparison.InvariantCultureIgnoreCase)).When(x => !x.Id.IsNullOrEmpty()).WithMessage("@language.errors.fallback_invalid"); - RuleFor(x => x.InheritedLanguageId).Equal((string)null).When(x => x.IsDefault).WithMessage("@language.errors.default_no_fallback"); + RuleFor(x => x.InheritedLanguageId).Equal((Ref)null).When(x => x.IsDefault).WithMessage("@language.errors.default_no_fallback"); RuleFor(x => x.InheritedLanguageId).Exists(store); RuleFor(x => x.IsOptional).Equal(false).When(x => x.IsDefault).WithMessage("@language.errors.default_not_optional"); } diff --git a/zero.Debug/Controllers/HomeController.cs b/zero.Debug/Controllers/HomeController.cs index 655948d6..a09ba290 100644 --- a/zero.Debug/Controllers/HomeController.cs +++ b/zero.Debug/Controllers/HomeController.cs @@ -77,7 +77,7 @@ namespace zero.Debug.Controllers Text = "What the fuckk", PublishDate = DateTimeOffset.Now.AddDays(3), AppId = app.Id, - ParentId = newsPage.Id + ParentId = newsPage.Id.Ref() }); await session.StoreAsync(new NewsPage() @@ -90,7 +90,7 @@ namespace zero.Debug.Controllers Text = "What the fuckkii", PublishDate = DateTimeOffset.Now.AddDays(-20), AppId = app.Id, - ParentId = newsPage.Id + ParentId = newsPage.Id.Ref() }); await session.StoreAsync(new RedirectPage() @@ -101,7 +101,7 @@ namespace zero.Debug.Controllers IsActive = true, PageTypeAlias = "redirect", AppId = app.Id, - ParentId = newsPage.Id, + ParentId = newsPage.Id.Ref(), Link = "https://brothers.studio" }); diff --git a/zero.Debug/Controllers/MigrationController.cs b/zero.Debug/Controllers/MigrationController.cs index abb29202..d3855894 100644 --- a/zero.Debug/Controllers/MigrationController.cs +++ b/zero.Debug/Controllers/MigrationController.cs @@ -120,7 +120,7 @@ namespace zero.Debug.Controllers { hasChange = true; zeroEntity.CreatedDate = zeroEntity.CreatedDate == default ? DateTimeOffset.Now : zeroEntity.CreatedDate; - zeroEntity.CreatedById = userId; + zeroEntity.CreatedById = userId.Ref(); } if (model is ITranslation && zeroEntity.Name.IsNullOrEmpty()) { @@ -135,7 +135,7 @@ namespace zero.Debug.Controllers if (zeroEntity.LastModifiedById == default) { hasChange = true; - zeroEntity.LastModifiedById = userId; + zeroEntity.LastModifiedById = userId.Ref(); } if (zeroEntity.LastModifiedDate == default) { diff --git a/zero.Debug/Controllers/TestController.cs b/zero.Debug/Controllers/TestController.cs index d56ea36b..4c37e80a 100644 --- a/zero.Debug/Controllers/TestController.cs +++ b/zero.Debug/Controllers/TestController.cs @@ -116,136 +116,136 @@ namespace zero.Debug.Controllers } - [HttpGet] - public async Task AddOrder([FromServices] IOrdersApi ordersApi) - { - OrderAddress address = new OrderAddress() - { - Email = "cee@live.at", - FirstName = "Tobias", - LastName = "Klika", - Company = "brothers Klika OG", - Gender = Gender.Male, - VatNo = "ATU68334803", - PhoneNumber = "+43 660 2594892", - Address = "Laabstraße 9", - AddressLine1 = "Top 2", - Zip = "5280", - City = "Braunau am Inn", - Country = "Österreich", - CountryId = "countries.256-A" - }; + //[HttpGet] + //public async Task AddOrder([FromServices] IOrdersApi ordersApi) + //{ + // OrderAddress address = new OrderAddress() + // { + // Email = "cee@live.at", + // FirstName = "Tobias", + // LastName = "Klika", + // Company = "brothers Klika OG", + // Gender = Gender.Male, + // VatNo = "ATU68334803", + // PhoneNumber = "+43 660 2594892", + // Address = "Laabstraße 9", + // AddressLine1 = "Top 2", + // Zip = "5280", + // City = "Braunau am Inn", + // Country = "Österreich", + // CountryId = "countries.256-A" + // }; - OrderAddress shippingAddress = new OrderAddress() - { - Email = "cee@live.at", - FirstName = "Tobias", - LastName = "Klika", - Company = "brothers Klika OG", - Gender = Gender.Male, - VatNo = "ATU68334803", - PhoneNumber = "+43 660 2594892", - Address = "Salzburger Strasse 44", - Zip = "5280", - City = "Braunau am Inn", - Country = "Österreich", - CountryId = "countries.256-A" - }; + // OrderAddress shippingAddress = new OrderAddress() + // { + // Email = "cee@live.at", + // FirstName = "Tobias", + // LastName = "Klika", + // Company = "brothers Klika OG", + // Gender = Gender.Male, + // VatNo = "ATU68334803", + // PhoneNumber = "+43 660 2594892", + // Address = "Salzburger Strasse 44", + // Zip = "5280", + // City = "Braunau am Inn", + // Country = "Österreich", + // CountryId = "countries.256-A" + // }; - Order order = new Order() - { - ChannelId = "channels.1-A", - Name = "23-0002", - Number = "23-0002", - LanguageId = "languages.2-A", - CurrencyId = "currencies.33-A", - State = OrderState.Completed, - DetailStateId = "orderDetailStates.3-A", - IsRequest = false, - CustomerId = "customers.1-A", - CustomerNote = "Danke für die Hilfe. Das war wirklich dringend nötig <3", - AssignedToUserId = "users.1-A", - Address = address, - Items = new List() - { - new OrderItem() - { - Id = IdGenerator.Create(), - ProductId = "products.1-A", - VariantId = "4a5ddabc-8158-43f5-90eb-1d115cc062cc", - Name = "Nike Jersey 2.0", - Description = "Polyester / XS", - Sort = 0, - Quantity = 3, - Discount = 0, - Price = 17, - TaxRate = 20 - }, - new OrderItem() - { - Id = IdGenerator.Create(), - ProductId = "products.1-A", - VariantId = "4a5ddabc-8158-43f5-90eb-1d115cc062cc", - Name = "Nike Jersey 2.0", - Description = "Polyester / s", - Sort = 1, - Quantity = 1, - Discount = 5, - Price = 12, - TaxRate = 20 - }, - new OrderItem() - { - Id = IdGenerator.Create(), - Name = "Flex-Druck", - Sort = 2, - Price = 1.99m, - Quantity = 2, - TaxRate = 12 - } - }, - Price = 72.98m - }; + // Order order = new Order() + // { + // ChannelId = "channels.1-A", + // Name = "23-0002", + // Number = "23-0002", + // LanguageId = "languages.2-A", + // CurrencyId = "currencies.33-A", + // State = OrderState.Completed, + // DetailStateId = "orderDetailStates.3-A", + // IsRequest = false, + // CustomerId = "customers.1-A", + // CustomerNote = "Danke für die Hilfe. Das war wirklich dringend nötig <3", + // AssignedToUserId = "users.1-A", + // Address = address, + // Items = new List() + // { + // new OrderItem() + // { + // Id = IdGenerator.Create(), + // ProductId = "products.1-A", + // VariantId = "4a5ddabc-8158-43f5-90eb-1d115cc062cc", + // Name = "Nike Jersey 2.0", + // Description = "Polyester / XS", + // Sort = 0, + // Quantity = 3, + // Discount = 0, + // Price = 17, + // TaxRate = 20 + // }, + // new OrderItem() + // { + // Id = IdGenerator.Create(), + // ProductId = "products.1-A", + // VariantId = "4a5ddabc-8158-43f5-90eb-1d115cc062cc", + // Name = "Nike Jersey 2.0", + // Description = "Polyester / s", + // Sort = 1, + // Quantity = 1, + // Discount = 5, + // Price = 12, + // TaxRate = 20 + // }, + // new OrderItem() + // { + // Id = IdGenerator.Create(), + // Name = "Flex-Druck", + // Sort = 2, + // Price = 1.99m, + // Quantity = 2, + // TaxRate = 12 + // } + // }, + // Price = 72.98m + // }; - order.Shipping = new OrderShipping() - { - Name = "Österreichische Post", - ShippingOptionId = "shippingOptions.1-A", - Price = 7.99m, - Lines = new List() - { - new OrderShippingLine() { Key = "Postfach", Value = "7-A" } - }, - Address = shippingAddress, - Deliveries = new List() - { - new OrderDelivery() - { - CreatedDate = DateTimeOffset.Now, - TrackingNumber = "1035304005500970252807", - TrackingUrl = "https://www.post.at/sv/sendungsdetails?snr=1035304005500970252807", - Description = "Waren sind im Lager 2 (Regal 23)", - ShipmentDate = DateTimeOffset.Now.AddDays(2), - Items = new List() - { - new OrderDeliveryProduct() { Id = order.Items[0].Id, Quantity = 2 }, - new OrderDeliveryProduct() { Id = order.Items[1].Id, Quantity = 1 } - } - }, - new OrderDelivery() - { - CreatedDate = DateTimeOffset.Now, - ShipmentDate = DateTimeOffset.Now.AddDays(4), - Items = new List() - { - new OrderDeliveryProduct() { Id = order.Items[0].Id, Quantity = 1 } - } - } - } - }; + // order.Shipping = new OrderShipping() + // { + // Name = "Österreichische Post", + // ShippingOptionId = "shippingOptions.1-A", + // Price = 7.99m, + // Lines = new List() + // { + // new OrderShippingLine() { Key = "Postfach", Value = "7-A" } + // }, + // Address = shippingAddress, + // Deliveries = new List() + // { + // new OrderDelivery() + // { + // CreatedDate = DateTimeOffset.Now, + // TrackingNumber = "1035304005500970252807", + // TrackingUrl = "https://www.post.at/sv/sendungsdetails?snr=1035304005500970252807", + // Description = "Waren sind im Lager 2 (Regal 23)", + // ShipmentDate = DateTimeOffset.Now.AddDays(2), + // Items = new List() + // { + // new OrderDeliveryProduct() { Id = order.Items[0].Id, Quantity = 2 }, + // new OrderDeliveryProduct() { Id = order.Items[1].Id, Quantity = 1 } + // } + // }, + // new OrderDelivery() + // { + // CreatedDate = DateTimeOffset.Now, + // ShipmentDate = DateTimeOffset.Now.AddDays(4), + // Items = new List() + // { + // new OrderDeliveryProduct() { Id = order.Items[0].Id, Quantity = 1 } + // } + // } + // } + // }; - return Json(await ordersApi.Save(order)); - } + // return Json(await ordersApi.Save(order)); + //} } internal class RouteModel diff --git a/zero.Debug/Sync/LanguageBlueprintHandler.cs b/zero.Debug/Sync/LanguageBlueprintHandler.cs new file mode 100644 index 00000000..7e247276 --- /dev/null +++ b/zero.Debug/Sync/LanguageBlueprintHandler.cs @@ -0,0 +1,16 @@ +using Raven.Client.Documents.Session; +using zero.Core.Entities; + +namespace zero.Debug.Sync +{ + public class LanguageBlueprintHandler : BlueprintHandler + { + protected override void OnBlueprintCreate(ILanguage blueprint, ILanguage model) + { + model.Code = blueprint.Code; + model.IsOptional = blueprint.IsOptional; + model.IsDefault = blueprint.IsDefault; + model.InheritedLanguageId = blueprint.InheritedLanguageId; + } + } +} diff --git a/zero.Debug/TestData/TestPluginStartup.cs b/zero.Debug/TestData/TestPluginStartup.cs index bbecdc5a..d146a6bb 100644 --- a/zero.Debug/TestData/TestPluginStartup.cs +++ b/zero.Debug/TestData/TestPluginStartup.cs @@ -24,6 +24,7 @@ namespace zero.TestData { Messages.Subscribe, CountryBlueprintHandler>(); Messages.Subscribe, PropertyBlueprintHandler>(); + Messages.Subscribe, LanguageBlueprintHandler>(); return Task.CompletedTask; } diff --git a/zero.Web.UI/App/pages/settings/languages.vue b/zero.Web.UI/App/pages/settings/languages.vue index 94939cbd..f21a61e6 100644 --- a/zero.Web.UI/App/pages/settings/languages.vue +++ b/zero.Web.UI/App/pages/settings/languages.vue @@ -2,7 +2,7 @@
- +
diff --git a/zero.Web/Controllers/PagesController.cs b/zero.Web/Controllers/PagesController.cs index 1e7a3707..54c2e095 100644 --- a/zero.Web/Controllers/PagesController.cs +++ b/zero.Web/Controllers/PagesController.cs @@ -48,7 +48,7 @@ namespace zero.Web.Controllers IPage model = Activator.CreateInstance(pageType.ContentType) as IPage; model.PageTypeAlias = type; - model.ParentId = parent; + model.ParentId = parent.Ref(); return Edit(model); }