Browse Source

Mongo Queries fixed

pull/206/head
Sebastian Stehle 8 years ago
parent
commit
03a5fbe09b
  1. 3
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentEntity.cs
  2. 25
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs
  3. 3
      src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs
  4. 4
      src/Squidex.Domain.Apps.Entities/Contents/QueryContext.cs
  5. 4
      src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs
  6. 2
      src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs
  7. 1
      src/Squidex/Config/Domain/WriteServices.cs

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

@ -85,7 +85,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
[BsonJson] [BsonJson]
public IdContentData DataByIds { get; set; } public IdContentData DataByIds { get; set; }
NamedContentData IContentEntity.Data [BsonIgnore]
public NamedContentData Data
{ {
get { return data; } get { return data; }
} }

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

@ -50,6 +50,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
protected override async Task SetupCollectionAsync(IMongoCollection<MongoContentEntity> collection) protected override async Task SetupCollectionAsync(IMongoCollection<MongoContentEntity> collection)
{ {
await collection.Indexes.CreateOneAsync(
Index
.Ascending(x => x.Id)
.Ascending(x => x.Version));
await collection.Indexes.CreateOneAsync( await collection.Indexes.CreateOneAsync(
Index Index
.Ascending(x => x.Id) .Ascending(x => x.Id)
@ -84,12 +89,15 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
DocumentId = documentId, DocumentId = documentId,
DataText = idData?.ToFullText(), DataText = idData?.ToFullText(),
DataByIds = idData, DataByIds = idData,
IsLatest = true,
ReferencedIds = idData?.ToReferencedIds(schema.SchemaDef), ReferencedIds = idData?.ToReferencedIds(schema.SchemaDef),
}); });
try try
{ {
await Collection.InsertOneAsync(document); await Collection.InsertOneAsync(document);
await Collection.UpdateManyAsync(x => x.Id == value.Id && x.Version < value.Version, Update.Set(x => x.IsLatest, false));
} }
catch (MongoWriteException ex) catch (MongoWriteException ex)
{ {
@ -115,13 +123,22 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
{ {
var id = Guid.Parse(key); var id = Guid.Parse(key);
var existing = var contentEntity =
await Collection.Find(x => x.Id == id && x.IsLatest) await Collection.Find(x => x.Id == id && x.IsLatest)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (existing != null) if (contentEntity != null)
{ {
return (SimpleMapper.Map(existing, new ContentState()), existing.Version); var schema = await appProvider.GetSchemaAsync(contentEntity.AppId, contentEntity.SchemaId);
if (schema == null)
{
throw new InvalidOperationException($"Cannot find schema {contentEntity.SchemaId}");
}
contentEntity?.ParseData(schema.SchemaDef);
return (SimpleMapper.Map(contentEntity, new ContentState()), contentEntity.Version);
} }
return (null, EtagVersion.NotFound); return (null, EtagVersion.NotFound);
@ -212,7 +229,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
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)
{ {
var contentEntity = var contentEntity =
await Collection.Find(x => x.Id == id && x.Version == version) await Collection.Find(x => x.Id == id && x.Version >= version).SortBy(x => x.Version)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
contentEntity?.ParseData(schema.SchemaDef); contentEntity?.ParseData(schema.SchemaDef);

3
src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs

@ -17,7 +17,8 @@ using Squidex.Infrastructure.Reflection;
namespace Squidex.Domain.Apps.Entities.Apps.State namespace Squidex.Domain.Apps.Entities.Apps.State
{ {
public class AppState : DomainObjectState<AppState>, IAppEntity public class AppState : DomainObjectState<AppState>,
IAppEntity
{ {
private static readonly LanguagesConfig English = LanguagesConfig.Build(Language.EN); private static readonly LanguagesConfig English = LanguagesConfig.Build(Language.EN);

4
src/Squidex.Domain.Apps.Entities/Contents/QueryContext.cs

@ -121,7 +121,7 @@ namespace Squidex.Domain.Apps.Entities.Contents
} }
} }
return ids.Select(id => cachedAssets.GetOrDefault(id)).Where(x => x != null).ToList(); return ids.Select(cachedAssets.GetOrDefault).Where(x => x != null).ToList();
} }
public async Task<IReadOnlyList<IContentEntity>> GetReferencedContentsAsync(Guid schemaId, ICollection<Guid> ids) public async Task<IReadOnlyList<IContentEntity>> GetReferencedContentsAsync(Guid schemaId, ICollection<Guid> ids)
@ -140,7 +140,7 @@ namespace Squidex.Domain.Apps.Entities.Contents
} }
} }
return ids.Select(id => cachedContents.GetOrDefault(id)).Where(x => x != null).ToList(); return ids.Select(cachedContents.GetOrDefault).Where(x => x != null).ToList();
} }
} }
} }

4
src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs

@ -16,7 +16,9 @@ using Squidex.Infrastructure.EventSourcing;
namespace Squidex.Domain.Apps.Entities.Contents.State namespace Squidex.Domain.Apps.Entities.Contents.State
{ {
public class ContentState : DomainObjectState<ContentState>, IContentEntity public class ContentState : DomainObjectState<ContentState>,
IContentEntity,
IUpdateableEntityWithAppRef
{ {
[JsonProperty] [JsonProperty]
public NamedContentData Data { get; set; } public NamedContentData Data { get; set; }

2
src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs

@ -151,7 +151,7 @@ namespace Squidex.Areas.Api.Controllers.Contents
Response.Headers["ETag"] = new StringValues(version.ToString()); Response.Headers["ETag"] = new StringValues(version.ToString());
return Ok(response); return Ok(response.Data);
} }
[MustBeAppEditor] [MustBeAppEditor]

1
src/Squidex/Config/Domain/WriteServices.cs

@ -13,7 +13,6 @@ using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Rules; using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Domain.Apps.Entities.State.SchemaDefs;
using Squidex.Domain.Users; using Squidex.Domain.Users;
using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Commands;
using Squidex.Pipeline.CommandMiddlewares; using Squidex.Pipeline.CommandMiddlewares;

Loading…
Cancel
Save