mirror of https://github.com/Squidex/squidex.git
27 changed files with 771 additions and 427 deletions
@ -0,0 +1,133 @@ |
|||
// ==========================================================================
|
|||
// NamedContentData.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using Newtonsoft.Json.Linq; |
|||
using Squidex.Core.Schemas; |
|||
using Squidex.Infrastructure; |
|||
|
|||
// ReSharper disable InvertIf
|
|||
|
|||
namespace Squidex.Core.Contents |
|||
{ |
|||
public sealed class IdContentData : ContentData<long>, IEquatable<IdContentData> |
|||
{ |
|||
public IdContentData() |
|||
: base(EqualityComparer<long>.Default) |
|||
{ |
|||
} |
|||
|
|||
public IdContentData(IdContentData copy) |
|||
: base(copy, EqualityComparer<long>.Default) |
|||
{ |
|||
} |
|||
|
|||
public IdContentData MergeInto(IdContentData target) |
|||
{ |
|||
return Merge(this, target); |
|||
} |
|||
|
|||
public IdContentData ToCleaned() |
|||
{ |
|||
return Clean(this, new IdContentData()); |
|||
} |
|||
|
|||
public IdContentData AddField(long id, ContentFieldData data) |
|||
{ |
|||
Guard.GreaterThan(id, 0, nameof(id)); |
|||
|
|||
this[id] = data; |
|||
|
|||
return this; |
|||
} |
|||
|
|||
public IdContentData ToCleanedReferences(Schema schema, ISet<Guid> deletedReferencedIds) |
|||
{ |
|||
var result = new IdContentData(this); |
|||
|
|||
foreach (var field in schema.Fields) |
|||
{ |
|||
if (field is IReferenceField referenceField) |
|||
{ |
|||
var fieldKey = GetKey(field); |
|||
var fieldData = this.GetOrDefault(fieldKey); |
|||
|
|||
if (fieldData == null) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
foreach (var partitionValue in fieldData.Where(x => IsNotNull(x.Value)).ToList()) |
|||
{ |
|||
var newValue = referenceField.RemoveDeletedReferences(partitionValue.Value, deletedReferencedIds); |
|||
|
|||
fieldData[partitionValue.Key] = newValue; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
public NamedContentData ToNameModel(Schema schema, bool decodeJsonField) |
|||
{ |
|||
Guard.NotNull(schema, nameof(schema)); |
|||
|
|||
var result = new NamedContentData(); |
|||
|
|||
foreach (var fieldValue in this) |
|||
{ |
|||
if (!schema.FieldsById.TryGetValue(fieldValue.Key, out Field field)) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
if (decodeJsonField && field is JsonField) |
|||
{ |
|||
var encodedValue = new ContentFieldData(); |
|||
|
|||
foreach (var partitionValue in fieldValue.Value) |
|||
{ |
|||
if (IsNull(partitionValue.Value)) |
|||
{ |
|||
encodedValue[partitionValue.Key] = null; |
|||
} |
|||
else |
|||
{ |
|||
var value = Encoding.UTF8.GetString(Convert.FromBase64String(partitionValue.Value.ToString())); |
|||
|
|||
encodedValue[partitionValue.Key] = JToken.Parse(value); |
|||
} |
|||
} |
|||
|
|||
result[field.Name] = encodedValue; |
|||
} |
|||
else |
|||
{ |
|||
|
|||
result[field.Name] = fieldValue.Value; |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
public bool Equals(IdContentData other) |
|||
{ |
|||
return base.Equals(other); |
|||
} |
|||
|
|||
public override long GetKey(Field field) |
|||
{ |
|||
return field.Id; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,193 @@ |
|||
// ==========================================================================
|
|||
// NamedContentData.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using Newtonsoft.Json.Linq; |
|||
using Squidex.Core.Schemas; |
|||
using Squidex.Infrastructure; |
|||
|
|||
// ReSharper disable InvertIf
|
|||
|
|||
namespace Squidex.Core.Contents |
|||
{ |
|||
public sealed class NamedContentData : ContentData<string>, IEquatable<NamedContentData> |
|||
{ |
|||
public NamedContentData() |
|||
: base(StringComparer.OrdinalIgnoreCase) |
|||
{ |
|||
} |
|||
|
|||
public NamedContentData MergeInto(NamedContentData target) |
|||
{ |
|||
return Merge(this, target); |
|||
} |
|||
|
|||
public NamedContentData ToCleaned() |
|||
{ |
|||
return Clean(this, new NamedContentData()); |
|||
} |
|||
|
|||
public NamedContentData AddField(string name, ContentFieldData data) |
|||
{ |
|||
Guard.NotNullOrEmpty(name, nameof(name)); |
|||
|
|||
this[name] = data; |
|||
|
|||
return this; |
|||
} |
|||
|
|||
public IdContentData ToIdModel(Schema schema, bool encodeJsonField) |
|||
{ |
|||
Guard.NotNull(schema, nameof(schema)); |
|||
|
|||
var result = new IdContentData(); |
|||
|
|||
foreach (var fieldValue in this) |
|||
{ |
|||
if (!schema.FieldsByName.TryGetValue(fieldValue.Key, out Field field)) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
var fieldId = field.Id; |
|||
|
|||
if (encodeJsonField && field is JsonField) |
|||
{ |
|||
var encodedValue = new ContentFieldData(); |
|||
|
|||
foreach (var partitionValue in fieldValue.Value) |
|||
{ |
|||
if (IsNull(partitionValue.Value)) |
|||
{ |
|||
encodedValue[partitionValue.Key] = null; |
|||
} |
|||
else |
|||
{ |
|||
var value = Convert.ToBase64String(Encoding.UTF8.GetBytes(partitionValue.Value.ToString())); |
|||
|
|||
encodedValue[partitionValue.Key] = value; |
|||
} |
|||
} |
|||
|
|||
result[fieldId] = encodedValue; |
|||
} |
|||
else |
|||
{ |
|||
result[fieldId] = fieldValue.Value; |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
public NamedContentData ToApiModel(Schema schema, LanguagesConfig languagesConfig, IReadOnlyCollection<Language> languagePreferences = null, bool excludeHidden = true) |
|||
{ |
|||
Guard.NotNull(schema, nameof(schema)); |
|||
Guard.NotNull(languagesConfig, nameof(languagesConfig)); |
|||
|
|||
var codeForInvariant = InvariantPartitioning.Instance.Master.Key; |
|||
var codeForMasterLanguage = languagesConfig.Master.Language.Iso2Code; |
|||
|
|||
var result = new NamedContentData(); |
|||
|
|||
foreach (var fieldValue in this) |
|||
{ |
|||
if (!schema.FieldsByName.TryGetValue(fieldValue.Key, out Field field) || (excludeHidden && field.IsHidden)) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
var fieldResult = new ContentFieldData(); |
|||
var fieldValues = fieldValue.Value; |
|||
|
|||
if (field.Paritioning.Equals(Partitioning.Language)) |
|||
{ |
|||
foreach (var languageConfig in languagesConfig) |
|||
{ |
|||
var languageCode = languageConfig.Key; |
|||
|
|||
if (fieldValues.TryGetValue(languageCode, out JToken value)) |
|||
{ |
|||
fieldResult.Add(languageCode, value); |
|||
} |
|||
else if (languageConfig == languagesConfig.Master && fieldValues.TryGetValue(codeForInvariant, out value)) |
|||
{ |
|||
fieldResult.Add(languageCode, value); |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (fieldValues.TryGetValue(codeForInvariant, out JToken value)) |
|||
{ |
|||
fieldResult.Add(codeForInvariant, value); |
|||
} |
|||
else if (fieldValues.TryGetValue(codeForMasterLanguage, out value)) |
|||
{ |
|||
fieldResult.Add(codeForInvariant, value); |
|||
} |
|||
else if (fieldValues.Count > 0) |
|||
{ |
|||
fieldResult.Add(codeForInvariant, fieldValues.Values.First()); |
|||
} |
|||
} |
|||
|
|||
result.Add(GetKey(field), fieldResult); |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
public object ToLanguageModel(LanguagesConfig languagesConfig, IReadOnlyCollection<Language> languagePreferences = null) |
|||
{ |
|||
Guard.NotNull(languagesConfig, nameof(languagesConfig)); |
|||
|
|||
if (languagePreferences == null || languagePreferences.Count == 0) |
|||
{ |
|||
return this; |
|||
} |
|||
|
|||
if (languagePreferences.Count == 1 && languagesConfig.TryGetConfig(languagePreferences.First(), out var languageConfig)) |
|||
{ |
|||
languagePreferences = languagePreferences.Union(languageConfig.Fallback).ToList(); |
|||
} |
|||
|
|||
var result = new Dictionary<string, JToken>(); |
|||
|
|||
foreach (var fieldValue in this) |
|||
{ |
|||
var fieldValues = fieldValue.Value; |
|||
|
|||
foreach (var language in languagePreferences) |
|||
{ |
|||
if (fieldValues.TryGetValue(language, out JToken value) && value != null) |
|||
{ |
|||
result[fieldValue.Key] = value; |
|||
|
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
public bool Equals(NamedContentData other) |
|||
{ |
|||
return base.Equals(other); |
|||
} |
|||
|
|||
public override string GetKey(Field field) |
|||
{ |
|||
return field.Name; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
// ==========================================================================
|
|||
// IMongoEntity.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using NodaTime; |
|||
|
|||
namespace Squidex.Infrastructure.MongoDb |
|||
{ |
|||
public interface IMongoEntity |
|||
{ |
|||
Guid Id { get; set; } |
|||
|
|||
Instant Created { get; set; } |
|||
|
|||
Instant LastModified { get; set; } |
|||
} |
|||
} |
|||
Loading…
Reference in new issue