diff --git a/CDP4Orm/CDP4Orm.csproj b/CDP4Orm/CDP4Orm.csproj index c5c6ac50..8bf02ce7 100644 --- a/CDP4Orm/CDP4Orm.csproj +++ b/CDP4Orm/CDP4Orm.csproj @@ -80,7 +80,7 @@ - + diff --git a/CometServer/CometServer.csproj b/CometServer/CometServer.csproj index 491e1011..6a1b0263 100644 --- a/CometServer/CometServer.csproj +++ b/CometServer/CometServer.csproj @@ -19,8 +19,8 @@ - - + + diff --git a/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs b/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs index 13dde53d..59d226af 100644 --- a/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs +++ b/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs @@ -34,6 +34,7 @@ namespace CometServer.Services.Operations.SideEffects using CDP4Common; using CDP4Common.DTO; using CDP4Common.EngineeringModelData; + using CDP4Common.Exceptions; using CDP4Common.Validation; using CometServer.Exceptions; @@ -41,6 +42,8 @@ namespace CometServer.Services.Operations.SideEffects using Npgsql; using Parameter = CDP4Common.DTO.Parameter; + using ParameterOrOverrideBase = CDP4Common.DTO.ParameterOrOverrideBase; + using ParameterOverride = CDP4Common.DTO.ParameterOverride; using ParameterSubscription = CDP4Common.DTO.ParameterSubscription; using ParameterSubscriptionValueSet = CDP4Common.DTO.ParameterSubscriptionValueSet; @@ -54,6 +57,11 @@ public sealed class ParameterSubscriptionValueSetSideEffect : OperationSideEffec /// public IParameterService ParameterService { get; set; } + /// + /// Gets or sets the injected used to retrieve linked + /// + public IParameterOverrideService ParameterOverrideService { get; set; } + /// /// Execute additional logic before a create operation. /// @@ -120,15 +128,50 @@ public override void BeforeUpdate(ParameterSubscriptionValueSet thing, Thing con throw new ArgumentException("The container of the ParameterSubscriptionValueSet is not a ParameterSubscription", nameof(container)); } - var parameter = this.ParameterService.Get(transaction, partition, null, securityContext) - .OfType() - .Single(x => x.ParameterSubscription.Contains(parameterSubscription.Iid)); + var parameters = this.ParameterService.Get(transaction, partition, null, securityContext).ToList(); + + var parameterOrOverrideBase = + parameters + .OfType() + .SingleOrDefault( + x => x.ParameterSubscription.Contains(parameterSubscription.Iid)) + ?? + this.ParameterOverrideService.Get(transaction, partition, null, securityContext) + .OfType() + .SingleOrDefault( + x => x.ParameterSubscription.Contains(parameterSubscription.Iid)); var things = new List(); - things.AddRange(this.ParameterService.QueryReferencedSiteDirectoryThings(parameter, transaction,securityContext)); + if (parameterOrOverrideBase == null) + { + throw new ThingNotFoundException("The ParameterSubscription's container Parameter, or ParameterOverride was not found"); + } + + ValidationResult validationResult = default; + validationResult.Message = "Validation failed"; + + if (parameterOrOverrideBase is Parameter parameter) + { + things.AddRange(this.ParameterService.QueryReferencedSiteDirectoryThings(parameter, transaction, securityContext)); + + validationResult = parameter.ValidateAndCleanup(rawUpdateInfo, things, CultureInfo.InvariantCulture); + } + + if (parameterOrOverrideBase is ParameterOverride parameterOverride) + { + var parameterOverrideParameter = parameters.SingleOrDefault(x => x.Iid == parameterOverride.Parameter) as Parameter; + + if (parameterOrOverrideBase == null) + { + throw new ThingNotFoundException("The ParameterOverride's container Parameter was not found"); + } - var validationResult = parameter.ValidateAndCleanup(rawUpdateInfo, things, CultureInfo.InvariantCulture); + things.Add(parameterOverrideParameter); + things.AddRange(this.ParameterService.QueryReferencedSiteDirectoryThings(parameterOverrideParameter, transaction, securityContext)); + + validationResult = parameterOverride.ValidateAndCleanup(rawUpdateInfo, things, CultureInfo.InvariantCulture); + } if (validationResult.ResultKind != ValidationResultKind.Valid) {