reactredux/src/WeatherForecast/Models/Shop/Requests/PostShopItemRequestModel.cs

283 lines
7.4 KiB
C#

using System.ComponentModel.DataAnnotations;
using DomainObjects.Documents.Posts;
using DomainObjects.Enumerations;
using DomainObjects.L10n;
using DomainObjects;
using Core.Enumerations;
using Core.Abstractions.Models;
namespace WeatherForecast.Models.Requests {
/// <summary>
///
/// </summary>
public class PostMediaAttachmentL10nRequestModel : RequestModelBase {
/// <summary>
///
/// </summary>
public Locales Locale { get; set; } = Locales.Unknown;
/// <summary>
///
/// </summary>
public string Alt { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string? Target { get; set; }
/// <summary>
///
/// </summary>
public string? Title { get; set; }
/// <summary>
///
/// </summary>
public string? Description { get; set; }
}
/// <summary>
///
/// </summary>
public class PostMediaAttachmentRequestModel : RequestModelBase {
/// <summary>
///
/// </summary>
public string Src { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public MediaTypes MediaType { get; set; } = MediaTypes.Unknown;
/// <summary>
///
/// </summary>
public List<PostMediaAttachmentL10nRequestModel> L10n { get; set; } = new List<PostMediaAttachmentL10nRequestModel>();
}
/// <summary>
///
/// </summary>
public class PostShopItemL10nRequestModel : RequestModelBase {
/// <summary>
///
/// </summary>
public Locales Locale { get; set; } = Locales.Unknown;
/// <summary>
///
/// </summary>
public string Slug { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string ShortText { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string Text { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public string? PlainText { get; set; }
/// <summary>
///
/// </summary>
public TextFormat TextFormat { get; set; } = TextFormat.Unknown;
/// <summary>
///
/// </summary>
public List<string>? Badges { get; set; }
}
/// <summary>
///
/// </summary>
public class PostShopItemRequestModel : RequestModelBase, IValidatableObject {
/// <summary>
///
/// </summary>
public List<PostShopItemL10nRequestModel> L10n { get; set; } = new List<PostShopItemL10nRequestModel>();
/// <summary>
///
/// </summary>
public List<PostMediaAttachmentRequestModel> MediaAttachments { get; set; } = new List<PostMediaAttachmentRequestModel>();
/// <summary>
///
/// </summary>
public List<Guid> Categories { get; set; } = new List<Guid>();
/// <summary>
///
/// </summary>
public List<string>? Tags { get; set; }
/// <summary>
///
/// </summary>
public bool? FamilyFriendly { get; set; }
/// <summary>
///
/// </summary>
public string BrandName { get; set; } = string.Empty;
/// <summary>
///
/// </summary>
public decimal? Rating { get; set; }
/// <summary>
///
/// </summary>
public decimal Price { get; set; }
/// <summary>
///
/// </summary>
public decimal? NewPrice { get; set; }
/// <summary>
///
/// </summary>
public uint Quantity { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
public ShopDocument ToDomainObject(string sku, Guid userId, Guid siteId) => new ShopDocument() {
Sku = sku,
SiteId = siteId,
L10n = L10n.Select(x => new PostItemL10n() {
Locale = x.Locale,
Slug = x.Slug,
Description = x.Description,
Title = x.Title,
Text = x.Text,
ShortText = x.ShortText,
// TODO: create plain text creation logic
PlainText = "TODO",
TextFormat = x.TextFormat,
Badges = x.Badges
}).ToList(),
MediaAttachments = MediaAttachments.Select(x => new MediaAttachment {
Src = x.Src,
MediaType = x.MediaType,
L10n = x.L10n.Select(y => new MediaAttachmentL10n() {
Locale = y.Locale,
Alt = y.Alt,
Target = y.Target,
Title = y.Title,
Description = y.Description
}).ToList()
}).ToList(),
Author = userId,
Created = DateTime.UtcNow,
Tags = Tags,
FamilyFriendly = FamilyFriendly,
BrandName = BrandName,
Rating = Rating,
Price = Price,
NewPrice = NewPrice,
Quantity = Quantity
};
/// <summary>
///
/// </summary>
/// <param name="validationContext"></param>
/// <returns></returns>
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (L10n.Count == 0)
yield return new ValidationResult($"{nameof(L10n)} {Errors.NullOrEmpty.Name}");
foreach (var item in L10n) {
if (item.Locale == Locales.Unknown)
yield return new ValidationResult($"{nameof(item.Locale)} {Errors.UnableToParse.Name}");
if (string.IsNullOrWhiteSpace(item.Slug))
yield return new ValidationResult($"{nameof(item.Slug)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(item.Description))
yield return new ValidationResult($"{nameof(item.Description)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(item.Title))
yield return new ValidationResult($"{nameof(item.Title)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(item.Text))
yield return new ValidationResult($"{nameof(item.Text)} {Errors.NullOrWhiteSpace.Name}");
if (string.IsNullOrWhiteSpace(item.ShortText))
yield return new ValidationResult($"{nameof(item.ShortText)} {Errors.NullOrWhiteSpace.Name}");
if (item.TextFormat == TextFormat.Unknown)
yield return new ValidationResult($"{nameof(item.TextFormat)} {Errors.UnableToParse.Name}");
}
if (MediaAttachments.Count == 0)
yield return new ValidationResult($"{nameof(MediaAttachments)} {Errors.NullOrEmpty.Name}");
foreach (var att in MediaAttachments) {
if (string.IsNullOrWhiteSpace(att.Src))
yield return new ValidationResult($"{nameof(att.Src)} {Errors.NullOrWhiteSpace.Name}");
if (att.MediaType == MediaTypes.Unknown)
yield return new ValidationResult($"{nameof(att.MediaType)} {Errors.UnableToParse.Name}");
if (att.L10n.Count == 0)
yield return new ValidationResult($"{nameof(att.L10n)} {Errors.NullOrEmpty.Name}");
foreach (var res in att.L10n) {
if (res.Locale == Locales.Unknown)
yield return new ValidationResult($"{nameof(res.Locale)} {Errors.UnableToParse.Name}");
if (string.IsNullOrWhiteSpace(res.Alt))
yield return new ValidationResult($"{nameof(res.Alt)} {Errors.NullOrWhiteSpace.Name}");
}
}
if (string.IsNullOrWhiteSpace(BrandName))
yield return new ValidationResult($"{nameof(BrandName)} {Errors.NullOrWhiteSpace.Name}");
if (Price == 0)
yield return new ValidationResult($"{nameof(Price)} {Errors.NullOrEmpty.Name}");
if (Quantity == 0)
yield return new ValidationResult($"{nameof(Quantity)} {Errors.NullOrEmpty.Name}");
}
}
}