Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Encodings.Web;
using System.Text.Json.Serialization;
using System.Text.Json;
using System.Text.Unicode;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace CleanArchitecture.Blazor.Application.Common.Interfaces.Serialization;
public class DefaultJsonSerializerOptions
{
public static JsonSerializerOptions Options => new()
{

Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs),
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
PropertyNameCaseInsensitive = true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ IMapper mapper
_context = context;
_mapper = mapper;
}
#pragma warning disable CS8602
#pragma warning disable CS8604

public async Task<PaginatedData<KeyValueDto>> Handle(KeyValuesWithPaginationQuery request, CancellationToken cancellationToken)
{

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public async Task<Result<int>> Handle(AddEditProductCommand request, Cancellatio
var dto = _mapper.Map<ProductDto>(request);
if (request.Id > 0)
{
var item = await _context.Products.FindAsync(new object[] { request.Id }, cancellationToken) ?? throw new NotFoundException($"Product with id: {request.Id} not found.");
var item = await _context.Products.Include(x=>x.Pictures).SingleOrDefaultAsync(x=>x.Id==request.Id) ?? throw new NotFoundException($"Product with id: {request.Id} not found.");
item = _mapper.Map(dto, item);
item.AddDomainEvent(new UpdatedEvent<Product>(item));
await _context.SaveChangesAsync(cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public async Task<Result<byte[]>> Handle(ExportProductsQuery request, Cancellati
{
var data = await _context.Products.ApplyOrder(request)
.ProjectTo<ProductDto>(_mapper.ConfigurationProvider)
.AsNoTracking()
.ToListAsync(cancellationToken);


Expand Down
2 changes: 1 addition & 1 deletion src/Domain/Entities/Audit/AuditTrail.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class AuditTrail : IEntity
public DateTime DateTime { get; set; }
public Dictionary<string, object?>? OldValues { get; set; }
public Dictionary<string, object?>? NewValues { get; set; }
public ICollection<string>? AffectedColumns { get; set; }
public List<string>? AffectedColumns { get; set; }
public Dictionary<string, object> PrimaryKey { get; set; } = new();

public List<PropertyEntry> TemporaryProperties { get; } = new();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
using CleanArchitecture.Blazor.Application.Common.Interfaces.Serialization;
using CleanArchitecture.Blazor.Infrastructure.Services.Serialization;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using CleanArchitecture.Blazor.Infrastructure.Persistence.Conversions;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace CleanArchitecture.Blazor.Infrastructure.Persistence.Configurations;
Expand All @@ -22,31 +19,10 @@ public void Configure(EntityTypeBuilder<AuditTrail> builder)
builder.Navigation(e => e.Owner).AutoInclude();
builder.Property(t => t.AuditType)
.HasConversion<string>();
builder.Property(e => e.AffectedColumns)
.HasConversion(
v => JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options),
v => JsonSerializer.Deserialize<List<string>>(v, DefaultJsonSerializerOptions.Options),
new ValueComparer<ICollection<string>>(
(c1, c2) => c1.SequenceEqual(c2),
c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
c => (ICollection<string>)c.ToList()));

builder.Property(u => u.OldValues)
.HasConversion(
d => JsonSerializer.Serialize(d, DefaultJsonSerializerOptions.Options),
s => JsonSerializer.Deserialize<Dictionary<string, object>>(s, DefaultJsonSerializerOptions.Options)
);
builder.Property(u => u.NewValues)
.HasConversion(
d => JsonSerializer.Serialize(d, DefaultJsonSerializerOptions.Options),
s => JsonSerializer.Deserialize<Dictionary<string, object>>(s, DefaultJsonSerializerOptions.Options)
);
builder.Property(u => u.PrimaryKey)
.HasConversion(
d => JsonSerializer.Serialize(d, DefaultJsonSerializerOptions.Options),
s => JsonSerializer.Deserialize<Dictionary<string, object>>(s, DefaultJsonSerializerOptions.Options)
);

builder.Property(e => e.AffectedColumns).HasStringListConversion();
builder.Property(u => u.OldValues).HasJsonConversion();
builder.Property(u => u.NewValues).HasJsonConversion();
builder.Property(u => u.PrimaryKey).HasJsonConversion();
builder.Ignore(x => x.TemporaryProperties);
builder.Ignore(x => x.HasTemporaryProperties);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Text.Json;
using CleanArchitecture.Blazor.Application.Common.Interfaces.Serialization;
using CleanArchitecture.Blazor.Infrastructure.Persistence.Conversions;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

Expand All @@ -14,5 +15,7 @@ public void Configure(EntityTypeBuilder<Product> builder)
{
builder.Ignore(e => e.DomainEvents);
builder.OwnsMany(e => e.Pictures, build => build.ToJson());
//builder.Property(x=>x.Pictures).HasJsonConversion();

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using CleanArchitecture.Blazor.Application.Common.Interfaces.Serialization;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

namespace CleanArchitecture.Blazor.Infrastructure.Persistence.Conversions;
public static class ValueConversionExtensions
{
public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> propertyBuilder)
{
ValueConverter<T, String> converter = new ValueConverter<T, String>(
v => JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options),
v => string.IsNullOrEmpty(v)? default: JsonSerializer.Deserialize<T>(v, DefaultJsonSerializerOptions.Options));

ValueComparer<T> comparer = new ValueComparer<T>(
(l, r) => JsonSerializer.Serialize(l, DefaultJsonSerializerOptions.Options) == JsonSerializer.Serialize(r, DefaultJsonSerializerOptions.Options),
v => v == null ? 0 : JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options).GetHashCode(),
v => JsonSerializer.Deserialize<T>(JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options), DefaultJsonSerializerOptions.Options));

propertyBuilder.HasConversion(converter);
propertyBuilder.Metadata.SetValueConverter(converter);
propertyBuilder.Metadata.SetValueComparer(comparer);
return propertyBuilder;
}

public static PropertyBuilder<List<string>> HasStringListConversion(this PropertyBuilder<List<string>> propertyBuilder)
{
ValueConverter<List<string>, String> converter = new ValueConverter<List<string>, String>(
v => JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options),
v => string.IsNullOrEmpty(v) ? default : JsonSerializer.Deserialize<List<string>>(v, DefaultJsonSerializerOptions.Options));

ValueComparer<List<string>> comparer = new ValueComparer<List<string>>(
(l, r) => JsonSerializer.Serialize(l, DefaultJsonSerializerOptions.Options) == JsonSerializer.Serialize(r, DefaultJsonSerializerOptions.Options),
v => v == null ? 0 : JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options).GetHashCode(),
v => JsonSerializer.Deserialize<List<string>>(JsonSerializer.Serialize(v, DefaultJsonSerializerOptions.Options), DefaultJsonSerializerOptions.Options));

propertyBuilder.HasConversion(converter);
propertyBuilder.Metadata.SetValueConverter(converter);
propertyBuilder.Metadata.SetValueComparer(comparer);
return propertyBuilder;
}
}