(refactor): code review

This commit is contained in:
Maksym Sadovnychyy 2022-09-03 21:47:58 +02:00
parent d7fcc49e72
commit 9c97e50c53
37 changed files with 1281 additions and 867 deletions

File diff suppressed because it is too large Load Diff

View File

@ -17,8 +17,11 @@ namespace Core.DomainObjects.Documents {
hash = hash * 23 + Images.Sum(x => x.GetHashCode());
hash = hash * 23 + Author.GetHashCode();
hash = hash * 23 + Created.GetHashCode();
hash = hash * 23 + Tags.Sum(x => x.GetHashCode());
hash = hash * 23 + Categories.Sum(x => x.GetHashCode());
if(Tags != null)
hash = hash * 23 + Tags.Sum(x => x.GetHashCode());
if(Categories != null)
hash = hash * 23 + Categories.Sum(x => x.GetHashCode());
hash = hash * 23 + ReadTime.GetHashCode();
hash = hash * 23 + Likes.GetHashCode();

View File

@ -65,6 +65,6 @@ namespace DataProviders {
DeleteWithPredicate(x => x.Id == id, _collectionName);
public IDomainResult DeleteAll(Guid siteId) =>
DeleteWithPredicate(x => x.SiteId == siteId, _collectionName);
DeleteManyWithPredicate(x => x.SiteId == siteId, _collectionName);
}
}

View File

@ -50,6 +50,6 @@ namespace DataProviders {
DeleteWithPredicate(x => x.Id == id, _collectionName);
public IDomainResult DeleteAll(Guid siteId, Guid userId) =>
DeleteWithPredicate(x => x.SiteId == siteId && x.UserId == userId, _collectionName);
DeleteManyWithPredicate(x => x.SiteId == siteId && x.UserId == userId, _collectionName);
}
}

View File

@ -19,7 +19,14 @@ namespace ExtensionsTests {
}
public override int GetHashCode() {
return Test.GetHashCode();
unchecked {
int hash = 17;
if (Test != null)
hash = hash * 23 + Test.GetHashCode();
return hash;
}
}
}

View File

@ -7,7 +7,7 @@ namespace ExtensionsTests {
public class ObjectExtensions {
private class DummyClass {
public string Test { get; set; }
public string? Test { get; set; }
}
[Fact]

View File

@ -17,12 +17,12 @@ using System.Threading.Tasks;
namespace ExtensionsTests {
public class StringExtensions : ServicesBase {
private readonly Configuration _configuration;
// private readonly Configuration _configuration;
public StringExtensions() {
_configuration = ServiceProvider.GetService<IOptions<Configuration>>()?.Value
?? throw new NullReferenceException("Configuration not found");
}
// public StringExtensions() {
// _configuration = ServiceProvider.GetService<IOptions<Configuration>>()?.Value
// ?? throw new NullReferenceException("Configuration not found");
// }
[Fact]
@ -93,7 +93,7 @@ namespace ExtensionsTests {
[Fact]
public void ToNullableInt() {
var value = "0".ToNullableInt();
Assert.True(value.GetType() == typeof(int) && value == 0 && "".ToNullableInt() == null);
Assert.True(value != null && value.GetType() == typeof(int?) && value == 0 && "".ToNullableInt() == null);
}
[Fact]
@ -105,7 +105,7 @@ namespace ExtensionsTests {
[Fact]
public void ToNullableUint() {
var value = "0".ToNullableUint();
Assert.True(value.GetType() == typeof(uint) && value == 0 && "".ToNullableUint() == null);
Assert.True(value != null && value.GetType() == typeof(uint) && value == 0 && "".ToNullableUint() == null);
}
[Fact]
@ -117,7 +117,7 @@ namespace ExtensionsTests {
[Fact]
public void ToNullableDecimal() {
var value = "0".ToNullableDecimal();
Assert.True(value.GetType() == typeof(decimal) && "".ToNullableDecimal() == null);
Assert.True(value != null && value.GetType() == typeof(decimal) && "".ToNullableDecimal() == null);
}
[Fact]
@ -129,7 +129,7 @@ namespace ExtensionsTests {
[Fact]
public void ToNullableDouble() {
var value = "0".ToNullableDouble();
Assert.True(value.GetType() == typeof(double) && value == 0 && "".ToNullableDouble() == null);
Assert.True(value != null && value.GetType() == typeof(double) && value == 0 && "".ToNullableDouble() == null);
}
[Fact]
@ -163,7 +163,12 @@ namespace ExtensionsTests {
[Fact]
public void ToNullalbeBool() {
Assert.True("true".ToNullableBool().Value && !"false".ToNullableBool().Value && "".ToNullableBool() == null);
var trueTest = "true".ToNullableBool();
var falseTest = "false".ToNullableBool();
if (trueTest == null || falseTest == null)
Assert.False(true);
else
Assert.True(trueTest.Value && !falseTest.Value && "".ToNullableBool() == null);
}
[Fact]
@ -195,13 +200,17 @@ namespace ExtensionsTests {
public void Excerpt() => Assert.Equal("M...", "MAKS-IT".Excerpt(4));
private class DummyClass {
public string Test { get; set; }
public string? Test { get; set; }
}
[Fact]
public void ToObject() {
var obj = "{ \"Test\": \"Test\" }".ToObject<DummyClass>();
Assert.Equal("Test", obj.Test);
if (obj == null)
Assert.False(true);
else
Assert.Equal("Test", obj.Test);
}
public static IEnumerable<object[]> GetEmailValidationData() {

View File

@ -23,11 +23,6 @@ namespace WeatherForecast.Models.Abstractions {
/// </summary>
public TitleSectionModel? TitleSection { get; set; }
/// <summary>
///
/// </summary>
public PageModelBase() { }
/// <summary>
///
/// </summary>

View File

@ -18,7 +18,7 @@ namespace WeatherForecast.Models.Abstractions {
/// <summary>
///
/// </summary>
public ImageModel? Image { get; set; }
public ImageResponseModel? Image { get; set; }
/// <summary>
///

View File

@ -2,6 +2,7 @@
using Core.Abstractions.Models;
using Core.DomainObjects;
using Core.Enumerations;
using WeatherForecast.Models.Responses;
using WeatherForecast.Models.Responses.L10n;
namespace WeatherForecast.Models.Abstractions {
@ -73,7 +74,7 @@ namespace WeatherForecast.Models.Abstractions {
/// <summary>
///
/// </summary>
public List<ImageModel>? Images { get; set; }
public List<ImageResponseModel>? Images { get; set; }
/// <summary>
///
@ -93,7 +94,7 @@ namespace WeatherForecast.Models.Abstractions {
/// <summary>
///
/// </summary>
public List<CategoryModel>? Categories { get; set; }
public List<CategoryItemResponseModel>? Categories { get; set; }
/// <summary>
///
@ -121,8 +122,8 @@ namespace WeatherForecast.Models.Abstractions {
/// <param name="categories"></param>
public PostItemResponseModelBase(PostItemBase<T> postItem, List<Category> categories) : this(postItem) {
L10n = postItem.L10n.Select(x => new PostItemL10nModel(x)).ToList();
Categories = categories.Select(x => new CategoryModel(x)).ToList();
Images = postItem.Images?.Select(x => new ImageModel(x)).ToList();
Categories = categories.Select(x => new CategoryItemResponseModel(x)).ToList();
Images = postItem.Images?.Select(x => new ImageResponseModel(x)).ToList();
}
/// <summary>
@ -133,7 +134,8 @@ namespace WeatherForecast.Models.Abstractions {
/// <param name="locale"></param>
public PostItemResponseModelBase(PostItemBase<T> postItem, List<Category> categories, Locales locale) : this(postItem) {
var postItemL10n = postItem.L10n.SingleOrDefault(x => x.Locale == locale);
var postItemL10n = postItem.L10n.Single(x => x.Locale == locale);
if (postItemL10n != null) {
Slug = postItemL10n.Slug;
Badges = postItemL10n.Badges;
@ -144,8 +146,8 @@ namespace WeatherForecast.Models.Abstractions {
Badges = postItemL10n.Badges;
}
Categories = categories.Select(x => new CategoryModel(x, locale)).ToList();
Images = postItem.Images?.Select(x => new ImageModel(x, locale)).ToList();
Categories = categories.Select(x => new CategoryItemResponseModel(x, locale)).ToList();
Images = postItem.Images?.Select(x => new ImageResponseModel(x, locale)).ToList();
}
}
}

View File

@ -1,48 +0,0 @@
using Core.DomainObjects;
using Core.Enumerations;
using WeatherForecast.Models.L10n;
namespace WeatherForecast.Models {
/// <summary>
///
/// </summary>
public class CategoryModel {
/// <summary>
///
/// </summary>
public List<CategoryL10nModel>? L10n { get; set; }
/// <summary>
///
/// </summary>
public string? Slug { get; set; }
/// <summary>
///
/// </summary>
public string? Text { get; set; }
/// <summary>
///
/// </summary>
/// <param name="category"></param>
public CategoryModel(Category category) {
L10n = category.L10n.Select(x => new CategoryL10nModel(x)).ToList();
}
/// <summary>
///
/// </summary>
/// <param name="category"></param>
/// <param name="locale"></param>
public CategoryModel(Category category, Locales locale) {
var categoryL10n = category.L10n.SingleOrDefault(x => x.Locale == locale);
if (categoryL10n != null) {
Slug = categoryL10n.Slug;
Text = categoryL10n.Text;
}
}
}
}

View File

@ -1,4 +1,6 @@
namespace WeatherForecast.Models {
using Core.DomainObjects;
namespace WeatherForecast.Models {
/// <summary>
///
@ -8,16 +10,18 @@
/// <summary>
///
/// </summary>
public AuthorModel Author { get; set; }
public AuthorModel? Author { get; set; }
/// <summary>
///
/// </summary>
public string Comment { get; set; }
public string? Comment { get; set; }
/// <summary>
///
/// </summary>
public List<CommentModel>? Responses { get; set; }
}
}

View File

@ -13,11 +13,6 @@ namespace WeatherForecast.Models.PageSections {
/// </summary>
public string ReadTime { get; set; }
/// <summary>
///
/// </summary>
public FeaturedBlogSectionModel() : base() { }
/// <summary>
///
/// </summary>

View File

@ -11,7 +11,7 @@ namespace WeatherForecast.Models.PageSections {
/// <summary>
///
/// </summary>
public ImageModel? Image { get; set; }
public ImageResponseModel? Image { get; set; }
/// <summary>
///

View File

@ -26,7 +26,8 @@ namespace WeatherForecast.Models.Requests {
/// </summary>
/// <returns></returns>
public override BlogItem ToDomainObject() {
if (HasValidationErrors(this) || HasValidationErrorsBase(HasValidationErrors(this))) throw new ValidationException();
if (HasValidationErrors(this) || HasValidationErrorsBase(HasValidationErrors(this)))
throw new ValidationException();
return new BlogItem() {
L10n = L10n.Select(x => x.ToDomainObject()).ToList(),
@ -48,16 +49,11 @@ namespace WeatherForecast.Models.Requests {
/// </summary>
/// <param name="validationContext"></param>
/// <returns></returns>
public override IEnumerable<ValidationResult> Validate( ValidationContext validationContext) {
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (L10n.IsNullOrEmpty())
yield return new ValidationResult($"{validationContext.DisplayName} ${Errors.NullOrEmpty}");
else {
foreach (var item in L10n)
foreach (var validationResult in item.Validate(validationContext))
yield return validationResult;
}
yield return new ValidationResult($"{nameof(L10n)} ${Errors.NullOrEmpty}");
}
private bool HasValidationErrors(BlogItemRequestModel validationContext) => Validate(new ValidationContext(validationContext)).Any();
private bool HasValidationErrors(BlogItemRequestModel model) => Validate(new ValidationContext(model)).Any();
}
}

View File

@ -38,12 +38,7 @@ namespace WeatherForecast.Models.Requests {
/// <returns></returns>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (L10n.IsNullOrEmpty())
yield return new ValidationResult($"{validationContext.DisplayName} ${Errors.NullOrEmpty}");
else {
foreach (var item in L10n)
foreach (var validationResult in item.Validate(validationContext))
yield return validationResult;
}
yield return new ValidationResult($"{nameof(L10n)} ${Errors.NullOrEmpty}");
}
[MemberNotNullWhen(false, new[] { nameof(L10n) })]

View File

@ -0,0 +1,56 @@
using Core.Abstractions.Models;
using Core.DomainObjects;
using Core.Enumerations;
using Extensions;
using System.ComponentModel.DataAnnotations;
using WeatherForecast.Models.Requests.L10n;
namespace WeatherForecast.Models {
/// <summary>
///
/// </summary>
public class ImageRequestModel : RequestModelBase<Image> {
/// <summary>
///
/// </summary>
public List<ImageL10nModel>? L10n { get; set; }
/// <summary>
///
/// </summary>
public string? Src { get; set; }
/// <summary>
///
/// </summary>
public string? Alt { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public override Image ToDomainObject() {
throw new NotImplementedException();
}
/// <summary>
///
/// </summary>
/// <param name="validationContext"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (L10n.IsNullOrEmpty())
yield return new ValidationResult($"{nameof(L10n)} ${Errors.NullOrEmpty}");
if (string.IsNullOrWhiteSpace(Src))
yield return new ValidationResult($"{nameof(Src)} ${Errors.NullOrWhiteSpace}");
if (string.IsNullOrWhiteSpace(Alt))
yield return new ValidationResult($"{nameof(Alt)} ${Errors.NullOrWhiteSpace}");
}
}
}

View File

@ -50,15 +50,15 @@ namespace WeatherForecast.Models.Requests.L10n {
/// <exception cref="NotImplementedException"></exception>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (string.IsNullOrWhiteSpace(Locale))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Locale)} {Errors.NullOrWhiteSpace.Name}");
else if (Enumeration.FromDisplayName<Locales>(Locale) == null)
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.WrongOrNotManaged}");
yield return new ValidationResult($"{nameof(Locale)} {Errors.WrongOrNotManaged}");
if (string.IsNullOrWhiteSpace(Slug))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Slug)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(Text))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Text)} {Errors.NullOrWhiteSpace.Name}");
}
// https://www.meziantou.net/csharp-8-nullable-reference-types.htm

View File

@ -42,13 +42,12 @@ namespace WeatherForecast.Models.Requests.L10n {
/// <returns></returns>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (string.IsNullOrWhiteSpace(Locale))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Locale)} {Errors.NullOrWhiteSpace.Name}");
else if (Enumeration.FromDisplayName<Locales>(Locale) == null)
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.WrongOrNotManaged}");
yield return new ValidationResult($"{nameof(Locale)} {Errors.WrongOrNotManaged}");
if (string.IsNullOrWhiteSpace(Alt))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Alt)} {Errors.NullOrWhiteSpace.Name}");
}
[MemberNotNullWhen(false, new[] { nameof(Locale), nameof(Alt) })]

View File

@ -87,29 +87,29 @@ namespace WeatherForecast.Models.Requests.L10n {
/// <returns></returns>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (string.IsNullOrWhiteSpace(Locale))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Locale)} {Errors.NullOrWhiteSpace.Name}");
else if (Enumeration.FromDisplayName<Locales>(Locale) == null)
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.WrongOrNotManaged}");
yield return new ValidationResult($"{nameof(Locale)} {Errors.WrongOrNotManaged}");
if (string.IsNullOrWhiteSpace(Slug))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Slug)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(Description))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Description)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(Title))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Title)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(Text))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(Text)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(ShortText))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(ShortText)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(ContentType))
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrWhiteSpace.Name}");
yield return new ValidationResult($"{nameof(ContentType)} {Errors.NullOrWhiteSpace.Name}");
else if (Enumeration.FromDisplayName<ContentTypes>(ContentType) == null)
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.WrongOrNotManaged}");
yield return new ValidationResult($"{nameof(ContentType)} {Errors.WrongOrNotManaged}");
}
[MemberNotNullWhen(false, new[] { nameof(Locale), nameof(Slug), nameof(Description), nameof(Title), nameof(Text), nameof(ShortText), nameof(ContentType) })]

View File

@ -36,8 +36,8 @@ namespace WeatherForecast.Models.Requests {
/// <param name="validationContext"></param>
/// <returns></returns>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (Quantity == null)
yield return new ValidationResult($"{validationContext.DisplayName} ${Errors.NullOrEmpty}");
if (Quantity == null || (Quantity != null && Quantity == 0))
yield return new ValidationResult($"{nameof(Quantity)} ${Errors.NullOrEmpty}");
}
[MemberNotNullWhen(false, new[] { nameof(Quantity) })]

View File

@ -1,13 +1,11 @@
using Core.Abstractions.Models;
using Core.DomainObjects;
using Core.DomainObjects.Documents;
using Core.DomainObjects.L10n;
using Core.Enumerations;
using ExtensionMethods;
using Extensions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using WeatherForecast.Models.Abstractions;
using Core.DomainObjects.Documents;
using Core.Enumerations;
using Extensions;
namespace WeatherForecast.Models.Requests {
@ -46,7 +44,8 @@ namespace WeatherForecast.Models.Requests {
/// </summary>
/// <returns></returns>
public override ShopItem ToDomainObject() {
if (HasValidationErrors(this) || HasValidationErrorsBase(HasValidationErrors(this))) throw new ValidationException();
if (HasValidationErrors(this) || HasValidationErrorsBase(HasValidationErrors(this)))
throw new ValidationException();
return new ShopItem() {
L10n = L10n.Select(x => x.ToDomainObject()).ToList(),
@ -72,24 +71,19 @@ namespace WeatherForecast.Models.Requests {
/// <returns></returns>
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (L10n.IsNullOrEmpty())
yield return new ValidationResult($"{validationContext.DisplayName} ${Errors.NullOrEmpty}");
else {
foreach (var item in L10n)
foreach (var validationResult in item.Validate(validationContext))
yield return validationResult;
}
yield return new ValidationResult($"{nameof(L10n)} ${Errors.NullOrEmpty}");
if (string.IsNullOrWhiteSpace(BrandName))
yield return new ValidationResult($"{validationContext.DisplayName} ${Errors.NullOrWhiteSpace}");
yield return new ValidationResult($"{nameof(BrandName)} ${Errors.NullOrWhiteSpace}");
if (Price == null)
yield return new ValidationResult($"{validationContext.DisplayName} {Errors.NullOrEmpty.Name}");
if (Price == null || (Price != null && Price == 0))
yield return new ValidationResult($"{nameof(Price)} {Errors.NullOrEmpty.Name}");
if (Quantity == null)
yield return new ValidationResult($"{validationContext.DisplayName} ${Errors.NullOrEmpty}");
if (Quantity == null || (Quantity != null && Quantity == 0))
yield return new ValidationResult($"{nameof(Quantity)} ${Errors.NullOrEmpty}");
}
[MemberNotNullWhen(false, new[] { nameof(BrandName), nameof(Price), nameof(Quantity) })]
private bool HasValidationErrors(ShopItemRequestModel validationContext) => Validate(new ValidationContext(validationContext)).Any();
private bool HasValidationErrors(ShopItemRequestModel model) => Validate(new ValidationContext(model)).Any();
}
}

View File

@ -1,15 +0,0 @@
using Core.Abstractions.Models;
namespace WeatherForecast.Models.Responses {
/// <summary>
///
/// </summary>
public class BlogCategoriesResponseModel : ResponseModelBase {
/// <summary>
///
/// </summary>
public List<CategoryModel>? Items { get; set; }
}
}

View File

@ -1,23 +0,0 @@
using Core.Abstractions.Models;
namespace WeatherForecast.Models.Responses {
/// <summary>
///
/// </summary>
public class BlogFeaturedResponseModel : ResponseModelBase {
/// <summary>
///
/// </summary>
public List<BlogItemModel> Items { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="items"></param>
public BlogFeaturedResponseModel(List<BlogItemModel> items) {
Items = items;
}
}
}

View File

@ -8,12 +8,6 @@ namespace WeatherForecast.Models.Responses {
/// </summary>
public class BlogItemsResponseModel : PaginationModelBase<BlogItemResponseModel> {
//public BlogItemModel FeaturedBlog { get; set; }
//public List<CategoryModel> Categories { get; set; }
/// <summary>
///
/// </summary>
@ -22,6 +16,5 @@ namespace WeatherForecast.Models.Responses {
/// <param name="items"></param>
public BlogItemsResponseModel(int currentPage, int totalPages, List<BlogItemResponseModel> items)
: base(currentPage, totalPages, items) { }
}
}

View File

@ -1,7 +1,7 @@
using Core.Abstractions.Models;
using Core.DomainObjects;
using Core.Enumerations;
using WeatherForecast.Models.L10n;
using WeatherForecast.Models.Responses.L10n;
namespace WeatherForecast.Models.Responses {

View File

@ -1,13 +1,13 @@
using Core.DomainObjects;
using Core.Enumerations;
using WeatherForecast.Models.L10n;
using WeatherForecast.Models.Responses.L10n;
namespace WeatherForecast.Models {
/// <summary>
///
/// </summary>
public class ImageModel {
public class ImageResponseModel {
/// <summary>
///
@ -28,7 +28,7 @@ namespace WeatherForecast.Models {
///
/// </summary>
/// <param name="image"></param>
public ImageModel(Image image) {
public ImageResponseModel(Image image) {
L10n = image.L10n.Select(x => new ImageL10nModel(x)).ToList();
}
@ -37,10 +37,11 @@ namespace WeatherForecast.Models {
/// </summary>
/// <param name="image"></param>
/// <param name="locale"></param>
public ImageModel(Image image, Locales locale) {
public ImageResponseModel(Image image, Locales locale) {
Src = image.Src;
var l10n = image.L10n.SingleOrDefault(x => x.Locale == locale);
var l10n = image.L10n.Single(x => x.Locale == locale);
if (l10n != null) {
Alt = l10n.Alt;
}

View File

@ -22,7 +22,7 @@ namespace WeatherForecast.Models.Responses {
/// <summary>
///
/// </summary>
public ImageModel Image { get; set; }
public ImageResponseModel? Image { get; set; }
/// <summary>
///
@ -59,11 +59,6 @@ namespace WeatherForecast.Models.Responses {
/// </summary>
public uint? Quantity { get; set; }
/// <summary>
///
/// </summary>
public ShopCartItemResponseModel() { }
/// <summary>
///
/// </summary>
@ -79,13 +74,16 @@ namespace WeatherForecast.Models.Responses {
NewPrice = shopItem.NewPrice;
Quantity = shopCartItem.Quantity;
var l10n = shopItem.L10n.SingleOrDefault(x => x.Locale == locale);
var shopItemL10n = shopItem.L10n.Single(x => x.Locale == locale);
Slug = shopItemL10n.Slug;
Title = shopItemL10n.Title;
ShortText = shopItemL10n.ShortText;
if (l10n != null) {
Slug = l10n.Slug;
Title = l10n.Title;
ShortText = l10n.ShortText;
}
Image = new ImageModel(shopItem.Images.First(), locale);
if(shopItem.Images != null)
Image = new ImageResponseModel(shopItem.Images.First(), locale);
}
}

View File

@ -1,7 +1,12 @@
using Core.DomainObjects;
using Core.Enumerations;
using DomainResults.Common;
using ExtensionMethods;
using DataProviders;
using DomainResults.Common;
using Core.DomainObjects;
using Core.DomainObjects.L10n;
using Core.Enumerations;
using WeatherForecast.Models.Requests;
using WeatherForecast.Models.Responses;
@ -85,7 +90,44 @@ namespace WeatherForecast.Services {
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public (Guid?, IDomainResult) Post(Guid siteId, BlogItemRequestModel requestModel) {
throw new NotImplementedException();
try {
var item = requestModel.ToDomainObject();
item.SiteId = siteId;
var (_, getResult) = _blogCatalogDataProvider.GetBySlugs(item.SiteId, item.L10n.Select(x => x.Slug).ToList());
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
// TODO: should be recovered from users by jwt
item.Author = "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60".ToGuid();
// TODO: should be placed to object storage
item.Images = new List<Image>() {
new Image {
Src = "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
L10n = new List<ImageL10n> {
new ImageL10n {
Locale = Locales.Us,
Alt = "..."
}
}
}
};
// TODO: default value shoud not be hardcoded by database id
item.Categories ??= new List<Guid> { "e154e33f-3cc7-468d-bb66-e0390ddb9ae0".ToGuid() };
var (id, insertResult) = _blogCatalogDataProvider.Insert(item);
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
return IDomainResult.Success(id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
}
/// <summary>
@ -95,21 +137,29 @@ namespace WeatherForecast.Services {
/// <param name="blogId"></param>
/// <returns></returns>
public (BlogItemResponseModel?, IDomainResult) Get(Guid siteId, Guid blogId) {
var (item, result) = _blogCatalogDataProvider.Get(siteId, blogId);
try {
var (item, result) = _blogCatalogDataProvider.Get(siteId, blogId);
if (!result.IsSuccess || item == null)
return (null, result);
if (!result.IsSuccess || item == null)
return (null, result);
var categories = new List<Category>();
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
var categories = new List<Category>();
categories.Add(category);
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
categories.Add(category);
}
}
return IDomainResult.Success(new BlogItemResponseModel(item, categories));
}
catch (Exception ex) {
return IDomainResult.Failed<BlogItemResponseModel?>(ex.Message);
}
return IDomainResult.Success(new BlogItemResponseModel(item, categories));
}
/// <summary>
@ -119,23 +169,31 @@ namespace WeatherForecast.Services {
/// <param name="slug"></param>
/// <returns></returns>
public (BlogItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) {
var (item, result) = _blogCatalogDataProvider.GetBySlug(siteId, slug);
try {
var (item, result) = _blogCatalogDataProvider.GetBySlug(siteId, slug);
if (!result.IsSuccess || item == null)
return (null, result);
if (!result.IsSuccess || item == null)
return (null, result);
var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us;
var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us;
var categories = new List<Category>();
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
var categories = new List<Category>();
categories.Add(category);
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
categories.Add(category);
}
}
return IDomainResult.Success(new BlogItemResponseModel(item, categories, locale));
}
catch (Exception ex) {
return IDomainResult.Failed<BlogItemResponseModel>(ex.Message);
}
return IDomainResult.Success(new BlogItemResponseModel(item, categories, locale));
}
/// <summary>
@ -147,7 +205,30 @@ namespace WeatherForecast.Services {
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public (Guid?, IDomainResult) Update(Guid siteId, Guid blogId, BlogItemRequestModel requestData) {
throw new NotImplementedException();
try {
var (item, getResult) = _blogCatalogDataProvider.Get(siteId, blogId);
if (!getResult.IsSuccess || item == null)
return (null, getResult);
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = siteId;
newItem.Created = item.Created;
newItem.Author = item.Author;
if (!item.Equals(newItem)) {
var (id, updateResult) = _blogCatalogDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
}
return IDomainResult.Success(item.Id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
}
/// <summary>
@ -158,7 +239,20 @@ namespace WeatherForecast.Services {
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public IDomainResult Delete(Guid siteId, Guid blogId) {
throw new NotImplementedException();
try {
var (item, getResult) = _blogCatalogDataProvider.Get(siteId, blogId);
if (!getResult.IsSuccess || item == null)
return getResult;
var result = _blogCatalogDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
return IDomainResult.Success();
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,8 +1,11 @@
using Core.Abstractions;
using DomainResults.Common;
using DataProviders;
using Core.Abstractions;
using Core.DomainObjects;
using Core.Enumerations;
using DataProviders;
using DomainResults.Common;
using WeatherForecast.Models.Responses;
namespace WeatherForecast.Services {
@ -68,30 +71,38 @@ namespace WeatherForecast.Services {
/// <param name="searchText"></param>
/// <returns></returns>
public (BlogItemsResponseModel?, IDomainResult) Get(Guid siteId, Guid? category, int currentPage, int itemsPerPage, string? locale, string? searchText) {
var (items, result) = _blogCatalogDataProvider.GetAll(siteId, currentPage > 0 ? ((currentPage - 1) * itemsPerPage) : 0, itemsPerPage);
if (!result.IsSuccess || items == null)
return (null, result);
try {
var (items, result) = _blogCatalogDataProvider.GetAll(siteId, currentPage > 0 ? ((currentPage - 1) * itemsPerPage) : 0, itemsPerPage);
if (!result.IsSuccess || items == null)
return (null, result);
var blogItems = new List<BlogItemResponseModel>();
foreach (var item in items) {
var categories = new List<Category>();
foreach (var catId in item.Categories) {
var (cat, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || cat == null)
return (null, getCategoryResult);
var blogItems = new List<BlogItemResponseModel>();
foreach (var item in items) {
var categories = new List<Category>();
categories.Add(cat);
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (cat, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || cat == null)
return (null, getCategoryResult);
categories.Add(cat);
}
}
if (locale != null)
blogItems.Add(new BlogItemResponseModel(item, categories, Enumeration.FromDisplayName<Locales>(locale) ?? Locales.Us));
else
blogItems.Add(new BlogItemResponseModel(item, categories));
}
if(locale != null)
blogItems.Add(new BlogItemResponseModel(item, categories, Enumeration.FromDisplayName<Locales>(locale) ?? Locales.Us));
else
blogItems.Add(new BlogItemResponseModel(item, categories));
return blogItems.Count > 0
? IDomainResult.Success(new BlogItemsResponseModel(currentPage, 0, blogItems))
: IDomainResult.NotFound<BlogItemsResponseModel?>();
}
catch (Exception ex) {
return IDomainResult.Failed<BlogItemsResponseModel?>(ex.Message);
}
return blogItems.Count > 0
? IDomainResult.Success(new BlogItemsResponseModel(currentPage, 0, blogItems))
: IDomainResult.NotFound<BlogItemsResponseModel?>();
}
/// <summary>
@ -99,6 +110,13 @@ namespace WeatherForecast.Services {
/// </summary>
/// <param name="siteId"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId) => _blogCatalogDataProvider.DeleteAll(siteId);
public IDomainResult Delete(Guid siteId) {
try {
return _blogCatalogDataProvider.DeleteAll(siteId);
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,6 +1,9 @@
using Core.Enumerations;
using DomainResults.Common;
using DataProviders;
using DomainResults.Common;
using Core.Enumerations;
using WeatherForecast.Models.Requests;
using WeatherForecast.Models.Responses;
@ -81,20 +84,24 @@ namespace WeatherForecast.Services {
/// <param name="requestModel"></param>
/// <returns></returns>
public (Guid?, IDomainResult) Post(Guid siteId, CategoryItemRequestModel requestModel) {
var (_, getResult) = _categoryDataProvider.GetBySlugs(siteId, requestModel.L10n.Select(x => x.Slug).ToList());
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
try {
var item = requestModel.ToDomainObject();
item.SiteId = siteId;
var item = requestModel.ToDomainObject();
item.SiteId = siteId;
var (_, getResult) = _categoryDataProvider.GetBySlugs(item.SiteId, item.L10n.Select(x => x.Slug).ToList());
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
var (id, insertResult) = _categoryDataProvider.Insert(item);
var (id, insertResult) = _categoryDataProvider.Insert(item);
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
return IDomainResult.Success(id);
return IDomainResult.Success(id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
}
/// <summary>
@ -104,11 +111,16 @@ namespace WeatherForecast.Services {
/// <param name="categoryId"></param>
/// <returns></returns>
public (CategoryItemResponseModel?, IDomainResult) Get(Guid siteId, Guid categoryId) {
var (item, result) = _categoryDataProvider.Get(siteId, categoryId);
if (!result.IsSuccess || item == null)
return (null, result);
try {
var (item, result) = _categoryDataProvider.Get(siteId, categoryId);
if (!result.IsSuccess || item == null)
return (null, result);
return IDomainResult.Success(new CategoryItemResponseModel(item));
return IDomainResult.Success(new CategoryItemResponseModel(item));
}
catch (Exception ex) {
return IDomainResult.Failed<CategoryItemResponseModel?>(ex.Message);
}
}
/// <summary>
@ -118,13 +130,18 @@ namespace WeatherForecast.Services {
/// <param name="slug"></param>
/// <returns></returns>
public (CategoryItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) {
var (item, result) = _categoryDataProvider.GetBySlug(siteId, slug);
if (!result.IsSuccess || item == null)
return (null, result);
try {
var (item, result) = _categoryDataProvider.GetBySlug(siteId, slug);
if (!result.IsSuccess || item == null)
return (null, result);
var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us;
var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us;
return IDomainResult.Success(new CategoryItemResponseModel(item, locale));
return IDomainResult.Success(new CategoryItemResponseModel(item, locale));
}
catch (Exception ex) {
return IDomainResult.Failed<CategoryItemResponseModel?>(ex.Message);
}
}
/// <summary>
@ -135,22 +152,27 @@ namespace WeatherForecast.Services {
/// <param name="requestData"></param>
/// <returns></returns>
public (Guid?, IDomainResult) Update(Guid siteId, Guid categoryId, CategoryItemRequestModel requestData) {
var (item, result) = _categoryDataProvider.Get(siteId, categoryId);
if (!result.IsSuccess || item == null)
return (null, result);
try {
var (item, result) = _categoryDataProvider.Get(siteId, categoryId);
if (!result.IsSuccess || item == null)
return (null, result);
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = item.SiteId;
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = item.SiteId;
if (!item.Equals(newItem)) {
var (id, updateResult) = _categoryDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
if (!item.Equals(newItem)) {
var (id, updateResult) = _categoryDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
}
return IDomainResult.Success(item.Id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
return IDomainResult.Success(item.Id);
}
/// <summary>
@ -160,15 +182,20 @@ namespace WeatherForecast.Services {
/// <param name="categoryId"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId, Guid categoryId) {
var (item, getResult) = _categoryDataProvider.Get(siteId, categoryId);
if (!getResult.IsSuccess || item == null)
return getResult;
try {
var (item, getResult) = _categoryDataProvider.Get(siteId, categoryId);
if (!getResult.IsSuccess || item == null)
return getResult;
var result = _categoryDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
var result = _categoryDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
return IDomainResult.Success();
return IDomainResult.Success();
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,7 +1,10 @@
using Core.Abstractions;
using Core.Enumerations;
using DomainResults.Common;
using DataProviders;
using DomainResults.Common;
using Core.Abstractions;
using Core.Enumerations;
using WeatherForecast.Models.Responses;
namespace WeatherForecast.Services {
@ -55,15 +58,20 @@ namespace WeatherForecast.Services {
/// <param name="locale"></param>
/// <returns></returns>
public (List<CategoryItemResponseModel>?, IDomainResult) Get(Guid siteId, string? locale) {
var (items, result) = _categoryDataProvider.GetAll(siteId);
if (!result.IsSuccess || items == null)
return (null, result);
try {
var (items, result) = _categoryDataProvider.GetAll(siteId);
if (!result.IsSuccess || items == null)
return (null, result);
if (locale != null) {
return IDomainResult.Success(items.Select(x => new CategoryItemResponseModel(x, Enumeration.FromDisplayName<Locales>(locale) ?? Locales.Us)).ToList());
if (locale != null) {
return IDomainResult.Success(items.Select(x => new CategoryItemResponseModel(x, Enumeration.FromDisplayName<Locales>(locale) ?? Locales.Us)).ToList());
}
return IDomainResult.Success(items.Select(x => new CategoryItemResponseModel(x)).ToList());
}
catch (Exception ex) {
return IDomainResult.Failed<List<CategoryItemResponseModel>?>(ex.Message);
}
return IDomainResult.Success(items.Select(x => new CategoryItemResponseModel(x)).ToList());
}
/// <summary>
@ -71,6 +79,13 @@ namespace WeatherForecast.Services {
/// </summary>
/// <param name="siteId"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId) => _categoryDataProvider.DeleteAll(siteId);
public IDomainResult Delete(Guid siteId) {
try {
return _categoryDataProvider.DeleteAll(siteId);
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,5 +1,6 @@
using DataProviders;
using DomainResults.Common;
using DomainResults.Common;
using DataProviders;
using WeatherForecast.Models.Responses;
@ -47,12 +48,17 @@ namespace WeatherForecast.Services {
/// <param name="locale"></param>
/// <returns></returns>
public (ContentResponseModel?, IDomainResult) GetContent(Guid siteId, string locale) {
var (content, result) = _contentDataProvider.Get(siteId, locale);
try {
var (content, result) = _contentDataProvider.Get(siteId, locale);
if (!result.IsSuccess || content == null)
return (null, result);
if (!result.IsSuccess || content == null)
return (null, result);
return IDomainResult.Success(new ContentResponseModel(content));
return IDomainResult.Success(new ContentResponseModel(content));
}
catch (Exception ex) {
return IDomainResult.Failed<ContentResponseModel?>(ex.Message);
}
}
}
}

View File

@ -1,8 +1,9 @@
using Core.Abstractions;
using Core.DomainObjects.Documents;
using Core.Enumerations;
using DomainResults.Common;
using DataProviders;
using DomainResults.Common;
using Core.Abstractions;
using Core.Enumerations;
using WeatherForecast.Models.Requests;
using WeatherForecast.Models.Responses;
@ -32,7 +33,7 @@ namespace WeatherForecast.Services {
/// <param name="sku"></param>
/// <param name="locale"></param>
/// <returns></returns>
(ShopCartItemResponseModel?, IDomainResult) Get(Guid siteId, Guid userId, string sku, string locale = "en-US");
(ShopCartItemResponseModel?, IDomainResult) Get(Guid siteId, Guid userId, string sku, string? locale);
/// <summary>
///
@ -88,22 +89,27 @@ namespace WeatherForecast.Services {
/// <param name="requestModel"></param>
/// <returns></returns>
public (Guid?, IDomainResult) Post(Guid siteId, Guid userId, string sku, ShopCartItemRequestModel requestModel) {
var (_, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
try {
var (_, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
var item = requestModel.ToDomainObject();
var item = requestModel.ToDomainObject();
item.SiteId = siteId;
item.UserId = userId;
item.Sku = sku;
item.SiteId = siteId;
item.UserId = userId;
item.Sku = sku;
var (id, insertResult) = _shopCartDataProvider.Insert(item);
var (id, insertResult) = _shopCartDataProvider.Insert(item);
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
return IDomainResult.Success(id);
return IDomainResult.Success(id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
}
/// <summary>
@ -114,17 +120,26 @@ namespace WeatherForecast.Services {
/// <param name="sku"></param>
/// <param name="locale"></param>
/// <returns></returns>
public (ShopCartItemResponseModel?, IDomainResult) Get(Guid siteId, Guid userId, string sku, string locale = "en-US") {
public (ShopCartItemResponseModel?, IDomainResult) Get(Guid siteId, Guid userId, string sku, string? locale) {
try {
var (cartItem, getCartItemResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (!getCartItemResult.IsSuccess || cartItem == null)
return (null, getCartItemResult);
var (cartItem, getCartItemResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (!getCartItemResult.IsSuccess || cartItem == null)
return (null, getCartItemResult);
var (item, result) = _shopCatalogDataProvider.Get(siteId, cartItem.Sku);
if (!result.IsSuccess || item == null) {
var delteResult = _shopCartDataProvider.Delete(cartItem.Id);
if (!delteResult.IsSuccess)
return (null, delteResult);
var (item, result) = _shopCatalogDataProvider.Get(siteId, cartItem.Sku);
if (!result.IsSuccess || item == null)
return (null, result);
return IDomainResult.Success(new ShopCartItemResponseModel(item, cartItem, Enumeration.FromDisplayName<Locales>(locale)));
return IDomainResult.NotFound<ShopCartItemResponseModel?>();
}
else
return IDomainResult.Success(new ShopCartItemResponseModel(item, cartItem, Enumeration.FromDisplayName<Locales>(locale ?? "en-US")));
}
catch (Exception ex) {
return IDomainResult.Failed<ShopCartItemResponseModel?>(ex.Message);
}
}
/// <summary>
@ -136,25 +151,30 @@ namespace WeatherForecast.Services {
/// <param name="requestData"></param>
/// <returns></returns>
public (Guid?, IDomainResult) Update(Guid siteId, Guid userId, string sku, ShopCartItemRequestModel requestData) {
var (item, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (!getResult.IsSuccess || item == null)
return (null, getResult);
try {
var (item, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (!getResult.IsSuccess || item == null)
return (null, getResult);
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = siteId;
newItem.UserId = userId;
newItem.Sku = sku;
newItem.Created = item.Created;
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = siteId;
newItem.UserId = userId;
newItem.Sku = sku;
newItem.Created = item.Created;
if (!item.Equals(newItem)) {
var (id, updateResult) = _shopCartDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
if (!item.Equals(newItem)) {
var (id, updateResult) = _shopCartDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
}
return IDomainResult.Success(item.Id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
return IDomainResult.Success(item.Id);
}
/// <summary>
@ -165,15 +185,20 @@ namespace WeatherForecast.Services {
/// <param name="sku"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId, Guid userId, string sku) {
var (item, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (!getResult.IsSuccess || item == null)
return getResult;
try {
var (item, getResult) = _shopCartDataProvider.Get(siteId, userId, sku);
if (!getResult.IsSuccess || item == null)
return getResult;
var result = _shopCartDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
var result = _shopCartDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
return IDomainResult.Success();
return IDomainResult.Success();
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,12 +1,12 @@
using DomainResults.Common;
using WeatherForecast.Models.Responses;
using DataProviders;
using Core.Enumerations;
using Core.Abstractions;
using WeatherForecast.Models.Responses;
namespace WeatherForecast.Services {
/// <summary>
@ -21,7 +21,7 @@ namespace WeatherForecast.Services {
/// <param name="userId"></param>
/// <param name="locale"></param>
/// <returns></returns>
(List<ShopCartItemResponseModel>?, IDomainResult) Get(Guid siteId, Guid userId, string locale = "en-US");
(List<ShopCartItemResponseModel>?, IDomainResult) Get(Guid siteId, Guid userId, string? locale);
/// <summary>
///
@ -64,24 +64,31 @@ namespace WeatherForecast.Services {
/// <param name="userId"></param>
/// <param name="locale"></param>
/// <returns></returns>
public (List<ShopCartItemResponseModel>?, IDomainResult) Get(Guid siteId, Guid userId, string locale = "en-US") {
public (List<ShopCartItemResponseModel>?, IDomainResult) Get(Guid siteId, Guid userId, string? locale) {
try {
var (cartItems, getCartItemsResult) = _shopCartDataProvider.GetAll(siteId, userId);
if (!getCartItemsResult.IsSuccess || cartItems == null)
return (null, getCartItemsResult);
var (cartItems, getCartItemsResult) = _shopCartDataProvider.GetAll(siteId, userId);
if (!getCartItemsResult.IsSuccess || cartItems == null)
return (null, getCartItemsResult);
var items = new List<ShopCartItemResponseModel>();
foreach (var cartItem in cartItems) {
var (item, result) = _shopCatalogDataProvider.Get(siteId, cartItem.Sku);
if (!result.IsSuccess || item == null) {
var delteResult = _shopCartDataProvider.Delete(cartItem.Id);
if (!delteResult.IsSuccess)
return (null, delteResult);
}
else
items.Add(new ShopCartItemResponseModel(item, cartItem, Enumeration.FromDisplayName<Locales>(locale ?? "en-US")));
}
var items = new List<ShopCartItemResponseModel>();
foreach (var cartItem in cartItems) {
var (item, result) = _shopCatalogDataProvider.Get(siteId, cartItem.Sku);
if (!result.IsSuccess || item == null)
return (null, result);
items.Add(new ShopCartItemResponseModel(item, cartItem, Enumeration.FromDisplayName<Locales>(locale)));
return items.Count > 0
? IDomainResult.Success(items)
: IDomainResult.NotFound<List<ShopCartItemResponseModel>?>();
}
catch (Exception ex) {
return IDomainResult.Failed<List<ShopCartItemResponseModel>?>(ex.Message);
}
return items.Count > 0
? IDomainResult.Success(items)
: IDomainResult.NotFound<List<ShopCartItemResponseModel>?>();
}
/// <summary>
@ -90,6 +97,13 @@ namespace WeatherForecast.Services {
/// <param name="siteId"></param>
/// <param name="userId"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId, Guid userId) => _shopCartDataProvider.DeleteAll(siteId, userId);
public IDomainResult Delete(Guid siteId, Guid userId) {
try {
return _shopCartDataProvider.DeleteAll(siteId, userId);
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,9 +1,13 @@
using Core.DomainObjects;
using DomainResults.Common;
using DataProviders;
using ExtensionMethods;
using Core.DomainObjects;
using Core.DomainObjects.L10n;
using Core.Enumerations;
using DataProviders;
using DomainResults.Common;
using ExtensionMethods;
using WeatherForecast.Models;
using WeatherForecast.Models.Requests;
@ -90,40 +94,47 @@ namespace WeatherForecast.Services {
/// <param name="requestModel"></param>
/// <returns></returns>
public (Guid?, IDomainResult) Post(Guid siteId, string sku, ShopItemRequestModel requestModel) {
var (_, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
try {
var item = requestModel.ToDomainObject();
var item = requestModel.ToDomainObject();
item.SiteId = siteId;
item.Sku = sku;
item.SiteId = siteId;
item.Sku = sku;
var (_, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
if (getResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
// TODO: should be recovered from users by jwt
item.Author = "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60".ToGuid();
// TODO: should be recovered from users by jwt
item.Author = "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60".ToGuid();
// TODO: should be placed to object storage
item.Images = new List<Image>() {
new Image {
Src = "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
L10n = new List<ImageL10n> {
new ImageL10n {
Locale = Locales.Us,
Alt = "..."
// TODO: should be placed to object storage
item.Images = new List<Image>() {
new Image {
Src = "https://dummyimage.com/450x300/dee2e6/6c757d.jpg",
L10n = new List<ImageL10n> {
new ImageL10n {
Locale = Locales.Us,
Alt = "..."
}
}
}
}
};
};
// TODO: default value shoud not be hardcoded by database id
item.Categories ??= new List<Guid> { "e154e33f-3cc7-468d-bb66-e0390ddb9ae0".ToGuid() };
// TODO: default value shoud not be hardcoded by database id
item.Categories ??= new List<Guid> { "e154e33f-3cc7-468d-bb66-e0390ddb9ae0".ToGuid() };
var (id, insertResult) = _shopCatalogDataProvider.Insert(item);
var (id, insertResult) = _shopCatalogDataProvider.Insert(item);
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
return IDomainResult.Success(id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
if (!insertResult.IsSuccess)
return IDomainResult.Failed<Guid?>();
return IDomainResult.Success(id);
}
/// <summary>
@ -133,23 +144,28 @@ namespace WeatherForecast.Services {
/// <param name="sku"></param>
/// <returns></returns>
public (ShopItemResponseModel?, IDomainResult) Get(Guid siteId, string sku) {
var (item, result) = _shopCatalogDataProvider.Get(siteId, sku);
try {
var (item, result) = _shopCatalogDataProvider.Get(siteId, sku);
if (!result.IsSuccess || item == null)
return (null, result);
if (!result.IsSuccess || item == null)
return (null, result);
var categories = new List<Category>();
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
var categories = new List<Category>();
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
categories.Add(category);
categories.Add(category);
}
}
}
return IDomainResult.Success(new ShopItemResponseModel(item, categories));
return IDomainResult.Success(new ShopItemResponseModel(item, categories));
}
catch (Exception ex) {
return IDomainResult.Failed<ShopItemResponseModel?>(ex.Message);
}
}
/// <summary>
@ -159,25 +175,30 @@ namespace WeatherForecast.Services {
/// <param name="slug"></param>
/// <returns></returns>
public (ShopItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) {
var (item, result) = _shopCatalogDataProvider.GetBySlug(siteId, slug);
try {
var (item, result) = _shopCatalogDataProvider.GetBySlug(siteId, slug);
if (!result.IsSuccess || item == null)
return (null, result);
if (!result.IsSuccess || item == null)
return (null, result);
var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us;
var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us;
var categories = new List<Category>();
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
var categories = new List<Category>();
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || category == null)
return (null, getCategoryResult);
categories.Add(category);
categories.Add(category);
}
}
}
return IDomainResult.Success(new ShopItemResponseModel(item, categories, locale));
return IDomainResult.Success(new ShopItemResponseModel(item, categories, locale));
}
catch (Exception ex) {
return IDomainResult.Failed<ShopItemResponseModel?>(ex.Message);
}
}
/// <summary>
@ -188,25 +209,30 @@ namespace WeatherForecast.Services {
/// <param name="requestData"></param>
/// <returns></returns>
public (Guid?, IDomainResult) Update(Guid siteId, string sku, ShopItemRequestModel requestData) {
var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
if (!getResult.IsSuccess || item == null)
return (null, getResult);
try {
var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
if (!getResult.IsSuccess || item == null)
return (null, getResult);
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = siteId;
newItem.Sku = sku;
newItem.Created = item.Created;
newItem.Author = item.Author;
// construct domain object from model
var newItem = requestData.ToDomainObject();
newItem.Id = item.Id;
newItem.SiteId = siteId;
newItem.Sku = sku;
newItem.Created = item.Created;
newItem.Author = item.Author;
if (!item.Equals(newItem)) {
var (id, updateResult) = _shopCatalogDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
if (!item.Equals(newItem)) {
var (id, updateResult) = _shopCatalogDataProvider.Update(newItem);
if (!updateResult.IsSuccess || id == null)
return (null, updateResult);
}
return IDomainResult.Success(item.Id);
}
catch (Exception ex) {
return IDomainResult.Failed<Guid?>(ex.Message);
}
return IDomainResult.Success(item.Id);
}
/// <summary>
@ -216,16 +242,20 @@ namespace WeatherForecast.Services {
/// <param name="sku"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId, string sku) {
var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
if (!getResult.IsSuccess || item == null)
return getResult;
try {
var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku);
if (!getResult.IsSuccess || item == null)
return getResult;
var result = _shopCatalogDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
var result = _shopCatalogDataProvider.Delete(item.Id);
if (!result.IsSuccess)
return result;
return IDomainResult.Success();
return IDomainResult.Success();
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}

View File

@ -1,8 +1,11 @@
using Core.Abstractions;
using DomainResults.Common;
using DataProviders;
using Core.Abstractions;
using Core.DomainObjects;
using Core.Enumerations;
using DataProviders;
using DomainResults.Common;
using WeatherForecast.Models;
using WeatherForecast.Models.Responses;
@ -68,35 +71,40 @@ namespace WeatherForecast.Services {
/// <param name="searchText"></param>
/// <returns></returns>
public (ShopItemsResponseModel?, IDomainResult) Get(Guid siteId, Guid? category, int currentPage, int itemsPerPage, string? locale, string? searchText) {
var (items, result) = _shopCatalogDataProvider.GetAll(siteId, currentPage > 0 ? ((currentPage - 1) * itemsPerPage) : 0, itemsPerPage);
try {
var (items, result) = _shopCatalogDataProvider.GetAll(siteId, currentPage > 0 ? ((currentPage - 1) * itemsPerPage) : 0, itemsPerPage);
if (!result.IsSuccess || items == null)
return (null, result);
if (!result.IsSuccess || items == null)
return (null, result);
var shopItems = new List<ShopItemResponseModel>();
foreach (var item in items) {
var shopItems = new List<ShopItemResponseModel>();
foreach (var item in items) {
var categories = new List<Category>();
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (cat, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || cat == null)
return (null, getCategoryResult);
var categories = new List<Category>();
if (item.Categories != null) {
foreach (var catId in item.Categories) {
var (cat, getCategoryResult) = _categoryDataProvider.Get(siteId, catId);
if (!getCategoryResult.IsSuccess || cat == null)
return (null, getCategoryResult);
categories.Add(cat);
categories.Add(cat);
}
}
if(locale != null)
shopItems.Add(new ShopItemResponseModel(item, categories, Enumeration.FromDisplayName<Locales>(locale) ?? Locales.Us));
else
shopItems.Add(new ShopItemResponseModel(item, categories));
}
if(locale != null)
shopItems.Add(new ShopItemResponseModel(item, categories, Enumeration.FromDisplayName<Locales>(locale) ?? Locales.Us));
else
shopItems.Add(new ShopItemResponseModel(item, categories));
return shopItems.Count > 0
? IDomainResult.Success(new ShopItemsResponseModel(currentPage, 0, shopItems))
: IDomainResult.NotFound<ShopItemsResponseModel?>();
}
catch (Exception ex) {
return IDomainResult.Failed<ShopItemsResponseModel?>(ex.Message);
}
return shopItems.Count > 0
? IDomainResult.Success(new ShopItemsResponseModel(currentPage, 0, shopItems))
: IDomainResult.NotFound<ShopItemsResponseModel?>();
}
/// <summary>
@ -104,6 +112,13 @@ namespace WeatherForecast.Services {
/// </summary>
/// <param name="siteId"></param>
/// <returns></returns>
public IDomainResult Delete(Guid siteId) => _shopCatalogDataProvider.DeleteAll(siteId);
public IDomainResult Delete(Guid siteId) {
try {
return _shopCatalogDataProvider.DeleteAll(siteId);
}
catch (Exception ex) {
return IDomainResult.Failed(ex.Message);
}
}
}
}