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