Browse Source

1) Use String for Guids in MongoDB

2) Bugfix with reference cleaning.
pull/214/head
Sebastian Stehle 8 years ago
parent
commit
206dd60c93
  1. 17
      src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs
  2. 10
      src/Squidex.Domain.Apps.Entities.MongoDb/Apps/MongoAppEntity.cs
  3. 7
      src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetStatsEntity.cs
  4. 60
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs
  5. 2
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs
  6. 2
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_EventHandling.cs
  7. 4
      src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventEntity.cs
  8. 11
      src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEntity.cs
  9. 20
      src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventEntity.cs
  10. 11
      src/Squidex.Domain.Apps.Entities.MongoDb/Schemas/MongoSchemaEntity.cs
  11. 6
      src/Squidex.Infrastructure.MongoDb/States/MongoState.cs
  12. 2
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs

17
src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs

@ -17,6 +17,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds
{ {
public static class ReferencesCleaner public static class ReferencesCleaner
{ {
private static readonly List<Guid> EmptyIds = new List<Guid>();
public static JToken CleanReferences(this Field field, JToken value, ISet<Guid> oldReferences) public static JToken CleanReferences(this Field field, JToken value, ISet<Guid> oldReferences)
{ {
if ((field is AssetsField || field is ReferencesField) && !value.IsNull()) if ((field is AssetsField || field is ReferencesField) && !value.IsNull())
@ -36,7 +37,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds
private static JToken Visit(AssetsField field, JToken value, IEnumerable<Guid> oldReferences) private static JToken Visit(AssetsField field, JToken value, IEnumerable<Guid> oldReferences)
{ {
var oldIds = field.ExtractReferences(value).ToList(); var oldIds = GetIds(value);
var newIds = oldIds.Except(oldReferences).ToList(); var newIds = oldIds.Except(oldReferences).ToList();
return oldIds.Count != newIds.Count ? JToken.FromObject(newIds) : value; return oldIds.Count != newIds.Count ? JToken.FromObject(newIds) : value;
@ -49,10 +50,22 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds
return new JArray(); return new JArray();
} }
var oldIds = field.ExtractReferences(value).ToList(); var oldIds = GetIds(value);
var newIds = oldIds.Except(oldReferences).ToList(); var newIds = oldIds.Except(oldReferences).ToList();
return oldIds.Count != newIds.Count ? JToken.FromObject(newIds) : value; return oldIds.Count != newIds.Count ? JToken.FromObject(newIds) : value;
} }
private static List<Guid> GetIds(JToken value)
{
try
{
return value?.ToObject<List<Guid>>() ?? EmptyIds;
}
catch
{
return EmptyIds;
}
}
} }
} }

10
src/Squidex.Domain.Apps.Entities.MongoDb/Apps/MongoAppEntity.cs

@ -23,19 +23,19 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Apps
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public int Version { get; set; } [BsonJson]
public AppState State { get; set; }
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public string Name { get; set; } public int Version { get; set; }
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public string[] UserIds { get; set; } public string Name { get; set; }
[BsonJson]
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public AppState State { get; set; } public string[] UserIds { get; set; }
} }
} }

7
src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetStatsEntity.cs

@ -22,12 +22,13 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
[BsonDateTimeOptions(DateOnly = true)] [BsonRepresentation(BsonType.String)]
public DateTime Date { get; set; } public Guid AssetId { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public Guid AssetId { get; set; } [BsonDateTimeOptions(DateOnly = true)]
public DateTime Date { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]

60
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs

@ -24,13 +24,45 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
private NamedContentData data; private NamedContentData data;
[BsonId] [BsonId]
[BsonRequired]
[BsonElement] [BsonElement]
public string DocumentId { get; set; } public string DocumentId { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement("id")]
[BsonRepresentation(BsonType.String)]
public Guid Id { get; set; } public Guid Id { get; set; }
[BsonRequired]
[BsonElement("ai")]
[BsonRepresentation(BsonType.String)]
public Guid AppId { get; set; }
[BsonRequired]
[BsonElement("si")]
[BsonRepresentation(BsonType.String)]
public Guid SchemaId { get; set; }
[BsonRequired]
[BsonElement("rf")]
[BsonRepresentation(BsonType.String)]
public List<Guid> ReferencedIds { get; set; }
[BsonRequired]
[BsonElement("rd")]
[BsonRepresentation(BsonType.String)]
public List<Guid> ReferencedIdsDeleted { get; set; } = new List<Guid>();
[BsonRequired]
[BsonElement("st")]
[BsonRepresentation(BsonType.String)]
public Status Status { get; set; }
[BsonRequired]
[BsonElement("do")]
[BsonJson]
public IdContentData DataByIds { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement("ct")] [BsonElement("ct")]
public Instant Created { get; set; } public Instant Created { get; set; }
@ -47,14 +79,6 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
[BsonElement("vs")] [BsonElement("vs")]
public long Version { get; set; } public long Version { get; set; }
[BsonRequired]
[BsonElement("ai")]
public Guid AppId { get; set; }
[BsonRequired]
[BsonElement("si")]
public Guid SchemaId { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement("cb")] [BsonElement("cb")]
public RefToken CreatedBy { get; set; } public RefToken CreatedBy { get; set; }
@ -63,28 +87,10 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
[BsonElement("mb")] [BsonElement("mb")]
public RefToken LastModifiedBy { get; set; } public RefToken LastModifiedBy { get; set; }
[BsonRequired]
[BsonElement("rf")]
public List<Guid> ReferencedIds { get; set; }
[BsonRequired]
[BsonElement("rd")]
public List<Guid> ReferencedIdsDeleted { get; set; } = new List<Guid>();
[BsonRequired] [BsonRequired]
[BsonElement("lt")] [BsonElement("lt")]
public bool IsLatest { get; set; } public bool IsLatest { get; set; }
[BsonRequired]
[BsonElement("st")]
[BsonRepresentation(BsonType.String)]
public Status Status { get; set; }
[BsonRequired]
[BsonElement("do")]
[BsonJson]
public IdContentData DataByIds { get; set; }
[BsonIgnore] [BsonIgnore]
public NamedContentData Data public NamedContentData Data
{ {

2
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs

@ -225,7 +225,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
await Collection.Find(x => contentIds.Contains(x.Id) && x.AppId == appId).Only(x => x.Id) await Collection.Find(x => contentIds.Contains(x.Id) && x.AppId == appId).Only(x => x.Id)
.ToListAsync(); .ToListAsync();
return contentIds.Except(contentEntities.Select(x => x["Id"].AsGuid)).ToList(); return contentIds.Except(contentEntities.Select(x => Guid.Parse(x["id"].AsString))).ToList();
} }
public async Task<IContentEntity> FindContentAsync(IAppEntity app, ISchemaEntity schema, Guid id, long version) public async Task<IContentEntity> FindContentAsync(IAppEntity app, ISchemaEntity schema, Guid id, long version)

2
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_EventHandling.cs

@ -34,7 +34,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
public Task On(Envelope<IEvent> @event) public Task On(Envelope<IEvent> @event)
{ {
return this.DispatchActionAsync(@event.Payload, @event.Headers); return this.DispatchActionAsync(@event.Payload);
} }
protected Task On(AssetDeleted @event) protected Task On(AssetDeleted @event)

4
src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventEntity.cs

@ -8,6 +8,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.MongoDb;
@ -22,8 +23,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.History
IUpdateableEntityWithCreatedBy, IUpdateableEntityWithCreatedBy,
IUpdateableEntityWithAppRef IUpdateableEntityWithAppRef
{ {
[BsonRequired]
[BsonElement] [BsonElement]
[BsonRequired]
[BsonRepresentation(BsonType.String)]
public Guid AppId { get; set; } public Guid AppId { get; set; }
[BsonRequired] [BsonRequired]

11
src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEntity.cs

@ -23,19 +23,20 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Rules
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public int Version { get; set; } [BsonRepresentation(BsonType.String)]
public Guid AppId { get; set; }
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public Guid AppId { get; set; } [BsonJson]
public RuleState State { get; set; }
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public bool IsDeleted { get; set; } public int Version { get; set; }
[BsonJson]
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public RuleState State { get; set; } public bool IsDeleted { get; set; }
} }
} }

20
src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventEntity.cs

@ -7,6 +7,7 @@
// ========================================================================== // ==========================================================================
using System; using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
@ -20,35 +21,38 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Rules
{ {
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
[BsonRepresentation(BsonType.String)]
public Guid AppId { get; set; } public Guid AppId { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public string LastDump { get; set; } [BsonRepresentation(BsonType.String)]
public RuleResult Result { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public int NumCalls { get; set; } [BsonRepresentation(BsonType.String)]
public RuleJobResult JobResult { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public Instant Expires { get; set; } [BsonJson]
public RuleJob Job { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public Instant? NextAttempt { get; set; } public string LastDump { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public RuleResult Result { get; set; } public int NumCalls { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public RuleJobResult JobResult { get; set; } public Instant Expires { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
[BsonJson] public Instant? NextAttempt { get; set; }
public RuleJob Job { get; set; }
} }
} }

11
src/Squidex.Domain.Apps.Entities.MongoDb/Schemas/MongoSchemaEntity.cs

@ -23,19 +23,20 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Schemas
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public string Name { get; set; } [BsonRepresentation(BsonType.String)]
public Guid AppId { get; set; }
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public int Version { get; set; } [BsonJson]
public SchemaState State { get; set; }
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public Guid AppId { get; set; } public string Name { get; set; }
[BsonJson]
[BsonElement] [BsonElement]
[BsonRequired] [BsonRequired]
public SchemaState State { get; set; } public int Version { get; set; }
} }
} }

6
src/Squidex.Infrastructure.MongoDb/States/MongoState.cs

@ -21,11 +21,11 @@ namespace Squidex.Infrastructure.States
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
public long Version { get; set; } [BsonJson]
public T Doc { get; set; }
[BsonRequired] [BsonRequired]
[BsonElement] [BsonElement]
[BsonJson] public long Version { get; set; }
public T Doc { get; set; }
} }
} }

2
tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs

@ -204,7 +204,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds
var result = sut.CleanReferences(CreateValue(id1, id2), new HashSet<Guid>(new[] { id2 })); var result = sut.CleanReferences(CreateValue(id1, id2), new HashSet<Guid>(new[] { id2 }));
Assert.Equal(CreateValue(id1, schemaId), result); Assert.Equal(CreateValue(id1), result);
} }
[Fact] [Fact]

Loading…
Cancel
Save