mirror of https://github.com/Squidex/squidex.git
140 changed files with 1146 additions and 1151 deletions
@ -0,0 +1,231 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Apps; |
|||
using Squidex.Domain.Apps.Core.Contents; |
|||
using Squidex.Domain.Apps.Events.Apps; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Commands; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
using Squidex.Infrastructure.States; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Apps.DomainObject |
|||
{ |
|||
public sealed partial class AppDomainObject |
|||
{ |
|||
[CollectionName("Apps")] |
|||
public sealed class State : DomainObjectState<State>, IAppEntity |
|||
{ |
|||
public string Name { get; set; } |
|||
|
|||
public string Label { get; set; } |
|||
|
|||
public string Description { get; set; } |
|||
|
|||
public Roles Roles { get; set; } = Roles.Empty; |
|||
|
|||
public AppImage? Image { get; set; } |
|||
|
|||
public AppPlan? Plan { get; set; } |
|||
|
|||
public AppClients Clients { get; set; } = AppClients.Empty; |
|||
|
|||
public AppPatterns Patterns { get; set; } = AppPatterns.Empty; |
|||
|
|||
public AppContributors Contributors { get; set; } = AppContributors.Empty; |
|||
|
|||
public LanguagesConfig Languages { get; set; } = LanguagesConfig.English; |
|||
|
|||
public Workflows Workflows { get; set; } = Workflows.Empty; |
|||
|
|||
public bool IsArchived { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return Id; } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case AppCreated e: |
|||
{ |
|||
Id = e.AppId.Id; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AppUpdated e when Is.Change(Label, e.Label) || Is.Change(Description, e.Description): |
|||
{ |
|||
SimpleMapper.Map(e, this); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AppImageUploaded e: |
|||
return UpdateImage(e, ev => ev.Image); |
|||
|
|||
case AppImageRemoved e when Image != null: |
|||
return UpdateImage(e, ev => null); |
|||
|
|||
case AppPlanChanged e when Is.Change(Plan?.PlanId, e.PlanId): |
|||
return UpdatePlan(e, ev => ev.ToAppPlan()); |
|||
|
|||
case AppPlanReset e when Plan != null: |
|||
return UpdatePlan(e, ev => null); |
|||
|
|||
case AppContributorAssigned e: |
|||
return UpdateContributors(e, (ev, c) => c.Assign(ev.ContributorId, ev.Role)); |
|||
|
|||
case AppContributorRemoved e: |
|||
return UpdateContributors(e, (ev, c) => c.Remove(ev.ContributorId)); |
|||
|
|||
case AppClientAttached e: |
|||
return UpdateClients(e, (ev, c) => c.Add(ev.Id, ev.Secret)); |
|||
|
|||
case AppClientUpdated e: |
|||
return UpdateClients(e, (ev, c) => c.Update(ev.Id, ev.Name, ev.Role, ev.ApiCallsLimit, ev.ApiTrafficLimit, ev.AllowAnonymous)); |
|||
|
|||
case AppClientRevoked e: |
|||
return UpdateClients(e, (ev, c) => c.Revoke(ev.Id)); |
|||
|
|||
case AppWorkflowAdded e: |
|||
return UpdateWorkflows(e, (ev, w) => w.Add(ev.WorkflowId, ev.Name)); |
|||
|
|||
case AppWorkflowUpdated e: |
|||
return UpdateWorkflows(e, (ev, w) => w.Update(ev.WorkflowId, ev.Workflow)); |
|||
|
|||
case AppWorkflowDeleted e: |
|||
return UpdateWorkflows(e, (ev, w) => w.Remove(ev.WorkflowId)); |
|||
|
|||
case AppPatternAdded e: |
|||
return UpdatePatterns(e, (ev, p) => p.Add(ev.PatternId, ev.Name, ev.Pattern, ev.Message)); |
|||
|
|||
case AppPatternDeleted e: |
|||
return UpdatePatterns(e, (ev, p) => p.Remove(ev.PatternId)); |
|||
|
|||
case AppPatternUpdated e: |
|||
return UpdatePatterns(e, (ev, p) => p.Update(ev.PatternId, ev.Name, ev.Pattern, ev.Message)); |
|||
|
|||
case AppRoleAdded e: |
|||
return UpdateRoles(e, (ev, r) => r.Add(ev.Name)); |
|||
|
|||
case AppRoleUpdated e: |
|||
return UpdateRoles(e, (ev, r) => r.Update(ev.Name, ev.ToPermissions(), ev.Properties)); |
|||
|
|||
case AppRoleDeleted e: |
|||
return UpdateRoles(e, (ev, r) => r.Remove(ev.Name)); |
|||
|
|||
case AppLanguageAdded e: |
|||
return UpdateLanguages(e, (ev, l) => l.Set(ev.Language)); |
|||
|
|||
case AppLanguageRemoved e: |
|||
return UpdateLanguages(e, (ev, l) => l.Remove(ev.Language)); |
|||
|
|||
case AppLanguageUpdated e: |
|||
return UpdateLanguages(e, (ev, l) => |
|||
{ |
|||
l = l.Set(ev.Language, ev.IsOptional, ev.Fallback); |
|||
|
|||
if (ev.IsMaster) |
|||
{ |
|||
l = Languages.MakeMaster(ev.Language); |
|||
} |
|||
|
|||
return l; |
|||
}); |
|||
|
|||
case AppArchived _: |
|||
{ |
|||
Plan = null; |
|||
|
|||
IsArchived = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
private bool UpdateContributors<T>(T @event, Func<T, AppContributors, AppContributors> update) |
|||
{ |
|||
var previous = Contributors; |
|||
|
|||
Contributors = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Contributors); |
|||
} |
|||
|
|||
private bool UpdateClients<T>(T @event, Func<T, AppClients, AppClients> update) |
|||
{ |
|||
var previous = Clients; |
|||
|
|||
Clients = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Clients); |
|||
} |
|||
|
|||
private bool UpdateLanguages<T>(T @event, Func<T, LanguagesConfig, LanguagesConfig> update) |
|||
{ |
|||
var previous = Languages; |
|||
|
|||
Languages = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Languages); |
|||
} |
|||
|
|||
private bool UpdatePatterns<T>(T @event, Func<T, AppPatterns, AppPatterns> update) |
|||
{ |
|||
var previous = Patterns; |
|||
|
|||
Patterns = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Patterns); |
|||
} |
|||
|
|||
private bool UpdateRoles<T>(T @event, Func<T, Roles, Roles> update) |
|||
{ |
|||
var previous = Roles; |
|||
|
|||
Roles = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Roles); |
|||
} |
|||
|
|||
private bool UpdateWorkflows<T>(T @event, Func<T, Workflows, Workflows> update) |
|||
{ |
|||
var previous = Workflows; |
|||
|
|||
Workflows = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Workflows); |
|||
} |
|||
|
|||
private bool UpdateImage<T>(T @event, Func<T, AppImage?> update) |
|||
{ |
|||
Image = update(@event); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
private bool UpdatePlan<T>(T @event, Func<T, AppPlan?> update) |
|||
{ |
|||
Plan = update(@event); |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,228 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Apps; |
|||
using Squidex.Domain.Apps.Core.Contents; |
|||
using Squidex.Domain.Apps.Events.Apps; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Commands; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
using Squidex.Infrastructure.States; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Apps.State |
|||
{ |
|||
[CollectionName("Apps")] |
|||
public class AppState : DomainObjectState<AppState>, IAppEntity |
|||
{ |
|||
public string Name { get; set; } |
|||
|
|||
public string Label { get; set; } |
|||
|
|||
public string Description { get; set; } |
|||
|
|||
public Roles Roles { get; set; } = Roles.Empty; |
|||
|
|||
public AppImage? Image { get; set; } |
|||
|
|||
public AppPlan? Plan { get; set; } |
|||
|
|||
public AppClients Clients { get; set; } = AppClients.Empty; |
|||
|
|||
public AppPatterns Patterns { get; set; } = AppPatterns.Empty; |
|||
|
|||
public AppContributors Contributors { get; set; } = AppContributors.Empty; |
|||
|
|||
public LanguagesConfig Languages { get; set; } = LanguagesConfig.English; |
|||
|
|||
public Workflows Workflows { get; set; } = Workflows.Empty; |
|||
|
|||
public bool IsArchived { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return Id; } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case AppCreated e: |
|||
{ |
|||
Id = e.AppId.Id; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AppUpdated e when Is.Change(Label, e.Label) || Is.Change(Description, e.Description): |
|||
{ |
|||
SimpleMapper.Map(e, this); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AppImageUploaded e: |
|||
return UpdateImage(e, ev => ev.Image); |
|||
|
|||
case AppImageRemoved e when Image != null: |
|||
return UpdateImage(e, ev => null); |
|||
|
|||
case AppPlanChanged e when Is.Change(Plan?.PlanId, e.PlanId): |
|||
return UpdatePlan(e, ev => ev.ToAppPlan()); |
|||
|
|||
case AppPlanReset e when Plan != null: |
|||
return UpdatePlan(e, ev => null); |
|||
|
|||
case AppContributorAssigned e: |
|||
return UpdateContributors(e, (ev, c) => c.Assign(ev.ContributorId, ev.Role)); |
|||
|
|||
case AppContributorRemoved e: |
|||
return UpdateContributors(e, (ev, c) => c.Remove(ev.ContributorId)); |
|||
|
|||
case AppClientAttached e: |
|||
return UpdateClients(e, (ev, c) => c.Add(ev.Id, ev.Secret)); |
|||
|
|||
case AppClientUpdated e: |
|||
return UpdateClients(e, (ev, c) => c.Update(ev.Id, ev.Name, ev.Role, ev.ApiCallsLimit, ev.ApiTrafficLimit, ev.AllowAnonymous)); |
|||
|
|||
case AppClientRevoked e: |
|||
return UpdateClients(e, (ev, c) => c.Revoke(ev.Id)); |
|||
|
|||
case AppWorkflowAdded e: |
|||
return UpdateWorkflows(e, (ev, w) => w.Add(ev.WorkflowId, ev.Name)); |
|||
|
|||
case AppWorkflowUpdated e: |
|||
return UpdateWorkflows(e, (ev, w) => w.Update(ev.WorkflowId, ev.Workflow)); |
|||
|
|||
case AppWorkflowDeleted e: |
|||
return UpdateWorkflows(e, (ev, w) => w.Remove(ev.WorkflowId)); |
|||
|
|||
case AppPatternAdded e: |
|||
return UpdatePatterns(e, (ev, p) => p.Add(ev.PatternId, ev.Name, ev.Pattern, ev.Message)); |
|||
|
|||
case AppPatternDeleted e: |
|||
return UpdatePatterns(e, (ev, p) => p.Remove(ev.PatternId)); |
|||
|
|||
case AppPatternUpdated e: |
|||
return UpdatePatterns(e, (ev, p) => p.Update(ev.PatternId, ev.Name, ev.Pattern, ev.Message)); |
|||
|
|||
case AppRoleAdded e: |
|||
return UpdateRoles(e, (ev, r) => r.Add(ev.Name)); |
|||
|
|||
case AppRoleUpdated e: |
|||
return UpdateRoles(e, (ev, r) => r.Update(ev.Name, ev.ToPermissions(), ev.Properties)); |
|||
|
|||
case AppRoleDeleted e: |
|||
return UpdateRoles(e, (ev, r) => r.Remove(ev.Name)); |
|||
|
|||
case AppLanguageAdded e: |
|||
return UpdateLanguages(e, (ev, l) => l.Set(ev.Language)); |
|||
|
|||
case AppLanguageRemoved e: |
|||
return UpdateLanguages(e, (ev, l) => l.Remove(ev.Language)); |
|||
|
|||
case AppLanguageUpdated e: |
|||
return UpdateLanguages(e, (ev, l) => |
|||
{ |
|||
l = l.Set(ev.Language, ev.IsOptional, ev.Fallback); |
|||
|
|||
if (ev.IsMaster) |
|||
{ |
|||
l = Languages.MakeMaster(ev.Language); |
|||
} |
|||
|
|||
return l; |
|||
}); |
|||
|
|||
case AppArchived _: |
|||
{ |
|||
Plan = null; |
|||
|
|||
IsArchived = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
private bool UpdateContributors<T>(T @event, Func<T, AppContributors, AppContributors> update) |
|||
{ |
|||
var previous = Contributors; |
|||
|
|||
Contributors = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Contributors); |
|||
} |
|||
|
|||
private bool UpdateClients<T>(T @event, Func<T, AppClients, AppClients> update) |
|||
{ |
|||
var previous = Clients; |
|||
|
|||
Clients = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Clients); |
|||
} |
|||
|
|||
private bool UpdateLanguages<T>(T @event, Func<T, LanguagesConfig, LanguagesConfig> update) |
|||
{ |
|||
var previous = Languages; |
|||
|
|||
Languages = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Languages); |
|||
} |
|||
|
|||
private bool UpdatePatterns<T>(T @event, Func<T, AppPatterns, AppPatterns> update) |
|||
{ |
|||
var previous = Patterns; |
|||
|
|||
Patterns = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Patterns); |
|||
} |
|||
|
|||
private bool UpdateRoles<T>(T @event, Func<T, Roles, Roles> update) |
|||
{ |
|||
var previous = Roles; |
|||
|
|||
Roles = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Roles); |
|||
} |
|||
|
|||
private bool UpdateWorkflows<T>(T @event, Func<T, Workflows, Workflows> update) |
|||
{ |
|||
var previous = Workflows; |
|||
|
|||
Workflows = update(@event, previous); |
|||
|
|||
return !ReferenceEquals(previous, Workflows); |
|||
} |
|||
|
|||
private bool UpdateImage<T>(T @event, Func<T, AppImage?> update) |
|||
{ |
|||
Image = update(@event); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
private bool UpdatePlan<T>(T @event, Func<T, AppPlan?> update) |
|||
{ |
|||
Plan = update(@event); |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,178 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Collections.Generic; |
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Assets; |
|||
using Squidex.Domain.Apps.Events.Assets; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Commands; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Assets.DomainObject |
|||
{ |
|||
public sealed partial class AssetDomainObject |
|||
{ |
|||
public sealed class State : DomainObjectState<State>, IAssetEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public DomainId ParentId { get; set; } |
|||
|
|||
public string FileName { get; set; } |
|||
|
|||
public string FileHash { get; set; } |
|||
|
|||
public string MimeType { get; set; } |
|||
|
|||
public string Slug { get; set; } |
|||
|
|||
public long FileVersion { get; set; } |
|||
|
|||
public long FileSize { get; set; } |
|||
|
|||
public long TotalSize { get; set; } |
|||
|
|||
public bool IsProtected { get; set; } |
|||
|
|||
public HashSet<string> Tags { get; set; } |
|||
|
|||
public AssetMetadata Metadata { get; set; } |
|||
|
|||
public AssetType Type { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId AssetId |
|||
{ |
|||
get { return Id; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case AssetCreated e: |
|||
{ |
|||
Id = e.AssetId; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
FileName = e.FileName; |
|||
|
|||
if (string.IsNullOrWhiteSpace(e.Slug)) |
|||
{ |
|||
Slug = e.FileName.ToAssetSlug(); |
|||
} |
|||
else |
|||
{ |
|||
Slug = e.Slug; |
|||
} |
|||
|
|||
TotalSize += e.FileSize; |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetUpdated e: |
|||
{ |
|||
SimpleMapper.Map(e, this); |
|||
|
|||
TotalSize += e.FileSize; |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetAnnotated e: |
|||
{ |
|||
var hasChanged = false; |
|||
|
|||
if (Is.OptionalChange(FileName, e.FileName)) |
|||
{ |
|||
FileName = e.FileName; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(Slug, e.Slug)) |
|||
{ |
|||
Slug = e.Slug; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(IsProtected, e.IsProtected)) |
|||
{ |
|||
IsProtected = e.IsProtected.Value; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(Tags, e.Tags)) |
|||
{ |
|||
Tags = e.Tags; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(Metadata, e.Metadata)) |
|||
{ |
|||
Metadata = e.Metadata; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return hasChanged; |
|||
} |
|||
|
|||
case AssetMoved e when e.ParentId != ParentId: |
|||
{ |
|||
ParentId = e.ParentId; |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
private void EnsureProperties() |
|||
{ |
|||
if (Tags == null) |
|||
{ |
|||
Tags = new HashSet<string>(); |
|||
} |
|||
|
|||
if (Metadata == null) |
|||
{ |
|||
Metadata = new AssetMetadata(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,72 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Events.Assets; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Commands; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Assets.DomainObject |
|||
{ |
|||
public sealed partial class AssetFolderDomainObject |
|||
{ |
|||
public sealed class State : DomainObjectState<State>, IAssetFolderEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public string FolderName { get; set; } |
|||
|
|||
public DomainId ParentId { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case AssetFolderCreated e: |
|||
{ |
|||
Id = e.AssetFolderId; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetFolderRenamed e when Is.OptionalChange(FolderName, e.FolderName): |
|||
{ |
|||
FolderName = e.FolderName; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetFolderMoved e when Is.Change(ParentId, e.ParentId): |
|||
{ |
|||
ParentId = e.ParentId; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetFolderDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,69 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Events.Assets; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Commands; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Assets.State |
|||
{ |
|||
public sealed class AssetFolderState : DomainObjectState<AssetFolderState>, IAssetFolderEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public string FolderName { get; set; } |
|||
|
|||
public DomainId ParentId { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case AssetFolderCreated e: |
|||
{ |
|||
Id = e.AssetFolderId; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetFolderRenamed e when Is.OptionalChange(FolderName, e.FolderName): |
|||
{ |
|||
FolderName = e.FolderName; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetFolderMoved e when Is.Change(ParentId, e.ParentId): |
|||
{ |
|||
ParentId = e.ParentId; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetFolderDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
@ -1,175 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Collections.Generic; |
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Assets; |
|||
using Squidex.Domain.Apps.Events.Assets; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Commands; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Assets.State |
|||
{ |
|||
public class AssetState : DomainObjectState<AssetState>, IAssetEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public DomainId ParentId { get; set; } |
|||
|
|||
public string FileName { get; set; } |
|||
|
|||
public string FileHash { get; set; } |
|||
|
|||
public string MimeType { get; set; } |
|||
|
|||
public string Slug { get; set; } |
|||
|
|||
public long FileVersion { get; set; } |
|||
|
|||
public long FileSize { get; set; } |
|||
|
|||
public long TotalSize { get; set; } |
|||
|
|||
public bool IsProtected { get; set; } |
|||
|
|||
public HashSet<string> Tags { get; set; } |
|||
|
|||
public AssetMetadata Metadata { get; set; } |
|||
|
|||
public AssetType Type { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId AssetId |
|||
{ |
|||
get { return Id; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case AssetCreated e: |
|||
{ |
|||
Id = e.AssetId; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
FileName = e.FileName; |
|||
|
|||
if (string.IsNullOrWhiteSpace(e.Slug)) |
|||
{ |
|||
Slug = e.FileName.ToAssetSlug(); |
|||
} |
|||
else |
|||
{ |
|||
Slug = e.Slug; |
|||
} |
|||
|
|||
TotalSize += e.FileSize; |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetUpdated e: |
|||
{ |
|||
SimpleMapper.Map(e, this); |
|||
|
|||
TotalSize += e.FileSize; |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetAnnotated e: |
|||
{ |
|||
var hasChanged = false; |
|||
|
|||
if (Is.OptionalChange(FileName, e.FileName)) |
|||
{ |
|||
FileName = e.FileName; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(Slug, e.Slug)) |
|||
{ |
|||
Slug = e.Slug; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(IsProtected, e.IsProtected)) |
|||
{ |
|||
IsProtected = e.IsProtected.Value; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(Tags, e.Tags)) |
|||
{ |
|||
Tags = e.Tags; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
if (Is.OptionalChange(Metadata, e.Metadata)) |
|||
{ |
|||
Metadata = e.Metadata; |
|||
|
|||
hasChanged = true; |
|||
} |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return hasChanged; |
|||
} |
|||
|
|||
case AssetMoved e when e.ParentId != ParentId: |
|||
{ |
|||
ParentId = e.ParentId; |
|||
|
|||
EnsureProperties(); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case AssetDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
private void EnsureProperties() |
|||
{ |
|||
if (Tags == null) |
|||
{ |
|||
Tags = new HashSet<string>(); |
|||
} |
|||
|
|||
if (Metadata == null) |
|||
{ |
|||
Metadata = new AssetMetadata(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,159 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Contents; |
|||
using Squidex.Domain.Apps.Events.Contents; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Contents.DomainObject |
|||
{ |
|||
public sealed partial class ContentDomainObject |
|||
{ |
|||
public sealed class State : DomainObjectState<State>, IContentEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public NamedId<DomainId> SchemaId { get; set; } |
|||
|
|||
public ContentVersion? NewVersion { get; set; } |
|||
|
|||
public ContentVersion CurrentVersion { get; set; } |
|||
|
|||
public ScheduleJob? ScheduleJob { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public NamedContentData Data |
|||
{ |
|||
get { return NewVersion?.Data ?? CurrentVersion.Data; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public Status EditingStatus |
|||
{ |
|||
get { return NewStatus ?? Status; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public Status Status |
|||
{ |
|||
get { return CurrentVersion.Status; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public Status? NewStatus |
|||
{ |
|||
get { return NewVersion?.Status; } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event, EnvelopeHeaders headers) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case ContentCreated e: |
|||
{ |
|||
Id = e.ContentId; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
CurrentVersion = new ContentVersion(e.Status, e.Data); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentDraftCreated e: |
|||
{ |
|||
NewVersion = new ContentVersion(e.Status, e.MigratedData ?? CurrentVersion.Data); |
|||
|
|||
ScheduleJob = null; |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentDraftDeleted _: |
|||
{ |
|||
NewVersion = null; |
|||
|
|||
ScheduleJob = null; |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentStatusChanged e: |
|||
{ |
|||
ScheduleJob = null; |
|||
|
|||
if (NewVersion != null) |
|||
{ |
|||
if (e.Status == Status.Published) |
|||
{ |
|||
CurrentVersion = new ContentVersion(e.Status, NewVersion.Data); |
|||
|
|||
NewVersion = null; |
|||
} |
|||
else |
|||
{ |
|||
NewVersion = NewVersion.WithStatus(e.Status); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
CurrentVersion = CurrentVersion.WithStatus(e.Status); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentSchedulingCancelled _: |
|||
{ |
|||
ScheduleJob = null; |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentStatusScheduled e: |
|||
{ |
|||
ScheduleJob = ScheduleJob.Build(e.Status, e.Actor, e.DueTime); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentUpdated e: |
|||
{ |
|||
if (NewVersion != null) |
|||
{ |
|||
NewVersion = NewVersion.WithData(e.Data); |
|||
} |
|||
else |
|||
{ |
|||
CurrentVersion = CurrentVersion.WithData(e.Data); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,156 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Contents; |
|||
using Squidex.Domain.Apps.Events.Contents; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Reflection; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Contents.State |
|||
{ |
|||
public sealed class ContentState : DomainObjectState<ContentState>, IContentEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public NamedId<DomainId> SchemaId { get; set; } |
|||
|
|||
public ContentVersion? NewVersion { get; set; } |
|||
|
|||
public ContentVersion CurrentVersion { get; set; } |
|||
|
|||
public ScheduleJob? ScheduleJob { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public NamedContentData Data |
|||
{ |
|||
get { return NewVersion?.Data ?? CurrentVersion.Data; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public Status EditingStatus |
|||
{ |
|||
get { return NewStatus ?? Status; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public Status Status |
|||
{ |
|||
get { return CurrentVersion.Status; } |
|||
} |
|||
|
|||
[IgnoreDataMember] |
|||
public Status? NewStatus |
|||
{ |
|||
get { return NewVersion?.Status; } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event, EnvelopeHeaders headers) |
|||
{ |
|||
switch (@event) |
|||
{ |
|||
case ContentCreated e: |
|||
{ |
|||
Id = e.ContentId; |
|||
|
|||
SimpleMapper.Map(e, this); |
|||
|
|||
CurrentVersion = new ContentVersion(e.Status, e.Data); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentDraftCreated e: |
|||
{ |
|||
NewVersion = new ContentVersion(e.Status, e.MigratedData ?? CurrentVersion.Data); |
|||
|
|||
ScheduleJob = null; |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentDraftDeleted _: |
|||
{ |
|||
NewVersion = null; |
|||
|
|||
ScheduleJob = null; |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentStatusChanged e: |
|||
{ |
|||
ScheduleJob = null; |
|||
|
|||
if (NewVersion != null) |
|||
{ |
|||
if (e.Status == Status.Published) |
|||
{ |
|||
CurrentVersion = new ContentVersion(e.Status, NewVersion.Data); |
|||
|
|||
NewVersion = null; |
|||
} |
|||
else |
|||
{ |
|||
NewVersion = NewVersion.WithStatus(e.Status); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
CurrentVersion = CurrentVersion.WithStatus(e.Status); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentSchedulingCancelled _: |
|||
{ |
|||
ScheduleJob = null; |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentStatusScheduled e: |
|||
{ |
|||
ScheduleJob = ScheduleJob.Build(e.Status, e.Actor, e.DueTime); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentUpdated e: |
|||
{ |
|||
if (NewVersion != null) |
|||
{ |
|||
NewVersion = NewVersion.WithData(e.Data); |
|||
} |
|||
else |
|||
{ |
|||
CurrentVersion = CurrentVersion.WithData(e.Data); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case ContentDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,96 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Rules; |
|||
using Squidex.Domain.Apps.Events.Rules; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.States; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Rules.DomainObject |
|||
{ |
|||
public sealed partial class RuleDomainObject |
|||
{ |
|||
[CollectionName("Rules")] |
|||
public sealed class State : DomainObjectState<State>, IRuleEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public Rule RuleDef { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
var previousRule = RuleDef; |
|||
|
|||
switch (@event) |
|||
{ |
|||
case RuleCreated e: |
|||
{ |
|||
Id = e.RuleId; |
|||
|
|||
RuleDef = new Rule(e.Trigger, e.Action); |
|||
RuleDef = RuleDef.Rename(e.Name); |
|||
|
|||
AppId = e.AppId; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case RuleUpdated e: |
|||
{ |
|||
if (e.Trigger != null) |
|||
{ |
|||
RuleDef = RuleDef.Update(e.Trigger); |
|||
} |
|||
|
|||
if (e.Action != null) |
|||
{ |
|||
RuleDef = RuleDef.Update(e.Action); |
|||
} |
|||
|
|||
if (e.Name != null) |
|||
{ |
|||
RuleDef = RuleDef.Rename(e.Name); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case RuleEnabled _: |
|||
{ |
|||
RuleDef = RuleDef.Enable(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case RuleDisabled _: |
|||
{ |
|||
RuleDef = RuleDef.Disable(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case RuleDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return !ReferenceEquals(previousRule, RuleDef); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,93 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core.Rules; |
|||
using Squidex.Domain.Apps.Events.Rules; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.States; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Rules.State |
|||
{ |
|||
[CollectionName("Rules")] |
|||
public sealed class RuleState : DomainObjectState<RuleState>, IRuleEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public Rule RuleDef { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
var previousRule = RuleDef; |
|||
|
|||
switch (@event) |
|||
{ |
|||
case RuleCreated e: |
|||
{ |
|||
Id = e.RuleId; |
|||
|
|||
RuleDef = new Rule(e.Trigger, e.Action); |
|||
RuleDef = RuleDef.Rename(e.Name); |
|||
|
|||
AppId = e.AppId; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case RuleUpdated e: |
|||
{ |
|||
if (e.Trigger != null) |
|||
{ |
|||
RuleDef = RuleDef.Update(e.Trigger); |
|||
} |
|||
|
|||
if (e.Action != null) |
|||
{ |
|||
RuleDef = RuleDef.Update(e.Action); |
|||
} |
|||
|
|||
if (e.Name != null) |
|||
{ |
|||
RuleDef = RuleDef.Rename(e.Name); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case RuleEnabled _: |
|||
{ |
|||
RuleDef = RuleDef.Enable(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case RuleDisabled _: |
|||
{ |
|||
RuleDef = RuleDef.Disable(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case RuleDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return !ReferenceEquals(previousRule, RuleDef); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,210 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Linq; |
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core; |
|||
using Squidex.Domain.Apps.Core.Schemas; |
|||
using Squidex.Domain.Apps.Events.Schemas; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.States; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Schemas.DomainObject |
|||
{ |
|||
public sealed partial class SchemaDomainObject |
|||
{ |
|||
[CollectionName("Schemas")] |
|||
public sealed class State : DomainObjectState<State>, ISchemaEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public Schema SchemaDef { get; set; } |
|||
|
|||
public long SchemaFieldsTotal { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
var previousSchema = SchemaDef; |
|||
|
|||
switch (@event) |
|||
{ |
|||
case SchemaCreated e: |
|||
{ |
|||
Id = e.SchemaId.Id; |
|||
|
|||
SchemaDef = e.Schema; |
|||
SchemaFieldsTotal = e.Schema.MaxId(); |
|||
|
|||
AppId = e.AppId; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case FieldAdded e: |
|||
{ |
|||
if (e.ParentFieldId != null) |
|||
{ |
|||
var field = e.Properties.CreateNestedField(e.FieldId.Id, e.Name); |
|||
|
|||
SchemaDef = SchemaDef.UpdateField(e.ParentFieldId.Id, x => ((ArrayField)x).AddField(field)); |
|||
} |
|||
else |
|||
{ |
|||
var partitioning = Partitioning.FromString(e.Partitioning); |
|||
|
|||
var field = e.Properties.CreateRootField(e.FieldId.Id, e.Name, partitioning); |
|||
|
|||
SchemaDef = SchemaDef.DeleteField(e.FieldId.Id); |
|||
SchemaDef = SchemaDef.AddField(field); |
|||
} |
|||
|
|||
SchemaFieldsTotal = Math.Max(SchemaFieldsTotal, e.FieldId.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaUIFieldsConfigured e: |
|||
{ |
|||
if (e.FieldsInLists != null) |
|||
{ |
|||
SchemaDef = SchemaDef.SetFieldsInLists(e.FieldsInLists); |
|||
} |
|||
|
|||
if (e.FieldsInReferences != null) |
|||
{ |
|||
SchemaDef = SchemaDef.SetFieldsInReferences(e.FieldsInReferences); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaCategoryChanged e: |
|||
{ |
|||
SchemaDef = SchemaDef.ChangeCategory(e.Name); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaPreviewUrlsConfigured e: |
|||
{ |
|||
SchemaDef = SchemaDef.SetPreviewUrls(e.PreviewUrls); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaScriptsConfigured e: |
|||
{ |
|||
SchemaDef = SchemaDef.SetScripts(e.Scripts); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaFieldRulesConfigured e: |
|||
{ |
|||
SchemaDef = SchemaDef.SetFieldRules(e.FieldRules); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaPublished _: |
|||
{ |
|||
SchemaDef = SchemaDef.Publish(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaUnpublished _: |
|||
{ |
|||
SchemaDef = SchemaDef.Unpublish(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaUpdated e: |
|||
{ |
|||
SchemaDef = SchemaDef.Update(e.Properties); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaFieldsReordered e: |
|||
{ |
|||
SchemaDef = SchemaDef.ReorderFields(e.FieldIds.ToList(), e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldUpdated e: |
|||
{ |
|||
SchemaDef = SchemaDef.UpdateField(e.FieldId.Id, e.Properties, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldLocked e: |
|||
{ |
|||
SchemaDef = SchemaDef.LockField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldDisabled e: |
|||
{ |
|||
SchemaDef = SchemaDef.DisableField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldEnabled e: |
|||
{ |
|||
SchemaDef = SchemaDef.EnableField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldHidden e: |
|||
{ |
|||
SchemaDef = SchemaDef.HideField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldShown e: |
|||
{ |
|||
SchemaDef = SchemaDef.ShowField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldDeleted e: |
|||
{ |
|||
SchemaDef = SchemaDef.DeleteField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return !ReferenceEquals(previousSchema, SchemaDef); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,207 +0,0 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Linq; |
|||
using System.Runtime.Serialization; |
|||
using Squidex.Domain.Apps.Core; |
|||
using Squidex.Domain.Apps.Core.Schemas; |
|||
using Squidex.Domain.Apps.Events.Schemas; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.States; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Schemas.State |
|||
{ |
|||
[CollectionName("Schemas")] |
|||
public sealed class SchemaState : DomainObjectState<SchemaState>, ISchemaEntity |
|||
{ |
|||
public NamedId<DomainId> AppId { get; set; } |
|||
|
|||
public Schema SchemaDef { get; set; } |
|||
|
|||
public long SchemaFieldsTotal { get; set; } |
|||
|
|||
[IgnoreDataMember] |
|||
public DomainId UniqueId |
|||
{ |
|||
get { return DomainId.Combine(AppId, Id); } |
|||
} |
|||
|
|||
public override bool ApplyEvent(IEvent @event) |
|||
{ |
|||
var previousSchema = SchemaDef; |
|||
|
|||
switch (@event) |
|||
{ |
|||
case SchemaCreated e: |
|||
{ |
|||
Id = e.SchemaId.Id; |
|||
|
|||
SchemaDef = e.Schema; |
|||
SchemaFieldsTotal = e.Schema.MaxId(); |
|||
|
|||
AppId = e.AppId; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
case FieldAdded e: |
|||
{ |
|||
if (e.ParentFieldId != null) |
|||
{ |
|||
var field = e.Properties.CreateNestedField(e.FieldId.Id, e.Name); |
|||
|
|||
SchemaDef = SchemaDef.UpdateField(e.ParentFieldId.Id, x => ((ArrayField)x).AddField(field)); |
|||
} |
|||
else |
|||
{ |
|||
var partitioning = Partitioning.FromString(e.Partitioning); |
|||
|
|||
var field = e.Properties.CreateRootField(e.FieldId.Id, e.Name, partitioning); |
|||
|
|||
SchemaDef = SchemaDef.DeleteField(e.FieldId.Id); |
|||
SchemaDef = SchemaDef.AddField(field); |
|||
} |
|||
|
|||
SchemaFieldsTotal = Math.Max(SchemaFieldsTotal, e.FieldId.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaUIFieldsConfigured e: |
|||
{ |
|||
if (e.FieldsInLists != null) |
|||
{ |
|||
SchemaDef = SchemaDef.SetFieldsInLists(e.FieldsInLists); |
|||
} |
|||
|
|||
if (e.FieldsInReferences != null) |
|||
{ |
|||
SchemaDef = SchemaDef.SetFieldsInReferences(e.FieldsInReferences); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaCategoryChanged e: |
|||
{ |
|||
SchemaDef = SchemaDef.ChangeCategory(e.Name); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaPreviewUrlsConfigured e: |
|||
{ |
|||
SchemaDef = SchemaDef.SetPreviewUrls(e.PreviewUrls); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaScriptsConfigured e: |
|||
{ |
|||
SchemaDef = SchemaDef.SetScripts(e.Scripts); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaFieldRulesConfigured e: |
|||
{ |
|||
SchemaDef = SchemaDef.SetFieldRules(e.FieldRules); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaPublished _: |
|||
{ |
|||
SchemaDef = SchemaDef.Publish(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaUnpublished _: |
|||
{ |
|||
SchemaDef = SchemaDef.Unpublish(); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaUpdated e: |
|||
{ |
|||
SchemaDef = SchemaDef.Update(e.Properties); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaFieldsReordered e: |
|||
{ |
|||
SchemaDef = SchemaDef.ReorderFields(e.FieldIds.ToList(), e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldUpdated e: |
|||
{ |
|||
SchemaDef = SchemaDef.UpdateField(e.FieldId.Id, e.Properties, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldLocked e: |
|||
{ |
|||
SchemaDef = SchemaDef.LockField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldDisabled e: |
|||
{ |
|||
SchemaDef = SchemaDef.DisableField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldEnabled e: |
|||
{ |
|||
SchemaDef = SchemaDef.EnableField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldHidden e: |
|||
{ |
|||
SchemaDef = SchemaDef.HideField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldShown e: |
|||
{ |
|||
SchemaDef = SchemaDef.ShowField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case FieldDeleted e: |
|||
{ |
|||
SchemaDef = SchemaDef.DeleteField(e.FieldId.Id, e.ParentFieldId?.Id); |
|||
|
|||
break; |
|||
} |
|||
|
|||
case SchemaDeleted _: |
|||
{ |
|||
IsDeleted = true; |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return !ReferenceEquals(previousSchema, SchemaDef); |
|||
} |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue