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