예제 #1
0
 public static bool IsValid(this IDiscriminator me)
 {
     return
         (!Comparer.AreEquals(me.Id, me.Id?.GetType().GetDefaultValue()) &&
          !string.IsNullOrWhiteSpace(me.Name) &&
          !Comparer.AreEquals(me.TypeId, me.TypeId?.GetType().GetDefaultValue()) &&
          !string.IsNullOrWhiteSpace(me.TypeName));
 }
예제 #2
0
        private static bool AreEquals(object obj1, object obj2)
        {
            // If both are NULL, return TRUE
            if (Equals(obj1, null) && Equals(obj2, null))
            {
                return(true);
            }
            // If some of them is null, return FALSE
            if (Equals(obj1, null) || Equals(obj2, null))
            {
                return(false);
            }
            // If any of them are of other type, return FALSE
            if (!(obj1 is IFunction) || !(obj2 is IFunction))
            {
                return(false);
            }
            var fun1 = (IFunction)obj1;
            var fun2 = (IFunction)obj2;

            // Compare the ids
            return(Comparer.AreEquals(fun1.Id, fun2.Id));
        }
예제 #3
0
        static bool AreEquals(object obj1, object obj2)
        {
            // If both are NULL, return TRUE
            if (Equals(obj1, null) && Equals(obj2, null))
            {
                return(true);
            }
            // If some of them is null, return FALSE
            if (Equals(obj1, null) || Equals(obj2, null))
            {
                return(false);
            }
            // If any of them are of other type, return FALSE
            if (!(obj1 is IDiscriminator) || !(obj2 is IDiscriminator))
            {
                return(false);
            }
            var dis1 = (IDiscriminator)obj1;
            var dis2 = (IDiscriminator)obj2;

            // Use 'Equals' to compare the ids
            return(Comparer.AreEquals(dis1.Id, dis2.Id) && Comparer.AreEquals(dis1.TypeId, dis2.TypeId));
        }
예제 #4
0
        bool AreEquals(object obj1, object obj2)
        {
            // If both are NULL, return TRUE
            if (Equals(obj1, null) && Equals(obj2, null))
            {
                return(true);
            }
            // If some of them is null, return FALSE
            if (Equals(obj1, null) || Equals(obj2, null))
            {
                return(false);
            }
            // If any of them are of other type, return FALSE
            if (!(obj1 is IScope) || !(obj2 is IScope))
            {
                return(false);
            }
            var sco1 = (IScope)obj1;
            var sco2 = (IScope)obj2;

            // Use 'Equals' to compare the ids
            return(disCom.Equals(sco1.Discriminator, sco2.Discriminator) &&
                   Comparer.AreEquals(sco1.Propagation, sco2.Propagation));
        }
예제 #5
0
 public static bool IsValid(this IFunction me) => !Comparer.AreEquals(me.Id, me.Id?.GetType().GetDefaultValue()) && !string.IsNullOrWhiteSpace(me.Name);
예제 #6
0
 public static bool IsValid(this IDiscriminator me) => !Comparer.AreEquals(me.TypeKey, me.TypeKey?.GetType().GetDefaultValue()) &&
 !string.IsNullOrWhiteSpace(me.TypeName);
예제 #7
0
 internal static bool MatchByDiscriminatorsInclusionsAndExclusions(this IPermission me, params IDiscriminator[] discriminators)
 {
     //return Printer.Ident($"{nameof(PermissionExtensions)}.{nameof(MatchByDiscriminatorsPath)}:", () => {
     return(Printer.Indent($"{typeof(PermissionExtensions).GetTypeInfo().DeclaredMethods.FirstOrDefault(m=>m.Name == nameof(MatchByDiscriminatorsInclusionsAndExclusions)).GetSignature()}:", () => {
         Printer.Indent("Input parameters", () =>
         {
             //Printer.Print($"Permission (me): {me}");
             Printer.WriteLine("Permission:");
             new[] { me }.Print(PrintMode.Table);
             //Printer.Foreach($"Discriminadores:", discriminators, dis => Printer.Print($"{dis.TypeName} - {dis.Name}"));
             Printer.WriteLine("Discriminators:");
             discriminators.Print(PrintMode.Table);
         });
         //Printer.Foreach($"Permission scopes ({me.Scopes.Count()}):", me.Scopes, sco => Printer.Print(sco.ToString()));
         if (!me.Scopes.Any())
         {
             Printer.WriteLine($"Result: TRUE - Haven't scopes");
             return true;
         }
         else
         {
             return Printer.Indent("Analyze each scope:", () =>
             {
                 // Tenemos que tomar nuestros discriminadores, y comprobarlos contra los discriminadores que me han pasado
                 // - Cojo un discriminador y busco el discriminador del mismo tipo en la entrada:
                 //    - No hay un discriminador del mismo tipo, pues no encaja
                 //    - Si hay un discriminador del mismo tipo, compruebo la ruta
                 var result = me.Scopes.Select <IScope, bool?>(sco => {
                     Printer.WriteLine($"Scope {sco}");
                     Printer.IndentationLevel++;
                     if (discriminators.Count(d => Comparer.AreEquals(d.TypeId, sco.Discriminator.TypeId)) == 1)
                     {
                         // Si hay un discriminador del mismo tipo, compruebo la ruta
                         var target = discriminators.Single(d => Comparer.AreEquals(d.TypeId, sco.Discriminator.TypeId));
                         Printer.WriteLine($"Se propaga a mi {sco.Propagation.HasFlag(ScopePropagation.ToMe)} ids = {target.Id}-{sco.Discriminator.Id}");
                         // Se propaga a mi y es el mismo discriminador
                         if (sco.Propagation.HasFlag(ScopePropagation.ToMe) && Comparer.AreEquals(target.Id, sco.Discriminator.Id))
                         {
                             Printer.WriteLine($"Se propaga a mi y es el mismo discriminador");
                             return true;
                         }
                         // Se propaga hacia arriba y su id esta en mi path:
                         if (sco.Propagation.HasFlag(ScopePropagation.ToExclusions) && sco.Discriminator.GetAllExclusions().Contains(target))
                         {
                             Printer.WriteLine($"Se propaga hacia arriba y su id esta en mi path");
                             return true;
                         }
                         // Se propaga hacia abajo y mi id esta en su path:
                         if (sco.Propagation.HasFlag(ScopePropagation.ToInclusions) && sco.Discriminator.GetAllInclusions().Contains(target))
                         {
                             Printer.WriteLine($"Se propaga hacia abajo y mi id esta en su path");
                             return true;
                         }
                         Printer.IndentationLevel--;
                         return false;
                     }
                     else
                     {
                         // No hay un discriminador del mismo tipo, pues no encaja
                         Printer.WriteLine($"No hay un discriminador del mismo tipo");
                         Printer.IndentationLevel--;
                         return null;
                     }
                 });
                 return result.Any(r => r.HasValue && r.Value) || // Si algun
                 result.All(r => !r.HasValue || r.Value);
             });
         }
     }));
 }
예제 #8
0
        internal static bool MatchByDiscriminatorsInclusionsAndExclusions(this IPermission me, bool forFilter, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators)
        {
            var res = false;

            using (Printer.Indent2($"CALL {nameof(MatchByDiscriminatorsInclusionsAndExclusions)}:", '│'))
            {
                using (Printer.Indent2("Input parameters"))
                {
                    Printer.WriteLine($"Permission:");
                    new[] { me }.Print(PrintMode.Table);
                    Printer.WriteLine($"'{nameof(forFilter)}': " + forFilter);
                    if (typeDiscriminator == null)
                    {
                        Printer.WriteLine($"'{nameof(typeDiscriminator)}': null");
                    }
                    else
                    {
                        Printer.WriteLine($"'{nameof(typeDiscriminator)}':");
                        new[] { typeDiscriminator }.Print(PrintMode.Table);
                    }
                    Printer.WriteLine($"'{nameof(discriminators)}':");
                    discriminators.Print(PrintMode.Table);
                }
                if (discriminators.Any(d => Comparer.AreEquals(d.TypeKey, TypeDiscriminator.TypeDiscriminatorId)))
                {
                    throw new ArgumentException($"'{nameof(discriminators)}' cannot contains a '{nameof(TypeDiscriminator)}'");
                }
                if (typeDiscriminator == null)
                {
                    throw new ArgumentException($"'{nameof(typeDiscriminator)}' cannot be null");
                }
                bool Compute()
                {
                    // Si no hay discriminador de tipo, TRUE
                    if (typeDiscriminator == null)
                    {
                        Printer.WriteLine($"'{nameof(typeDiscriminator)}' is null");
                        //return true;
                    }
                    // Si el permiso no define scopes, TRUE
                    if (!me.Scopes.Any())
                    {
                        Printer.WriteLine("Permission hasn't scopes");
                        return(true);
                    }
                    var typeDiscriminatorRelatedWithAnyPermissionScope = false;

                    // Compruebo el discriminador de tipo
                    using (Printer.Indent2($"Checking type discriminator"))
                    {
                        var scopeOfTypeOfTypeDiscriminator = me.Scopes.FirstOrDefault(s => Comparer.AreEquals(s.Discriminator.TypeKey, typeDiscriminator?.TypeKey));
                        if (scopeOfTypeOfTypeDiscriminator != null)
                        {
                            Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' and permission scope '{scopeOfTypeOfTypeDiscriminator}' have same type '{typeDiscriminator.TypeKey}', continue");
                            var scopeDiscriminatorRelatedWithTargetDiscriminator = scopeOfTypeOfTypeDiscriminator?.Discriminator
                                                                                   .GetAllRelated(scopeOfTypeOfTypeDiscriminator.Propagation)
                                                                                   .FirstOrDefault(rel => Comparer.AreEquals(typeDiscriminator.TypeKey, rel.TypeKey) && Comparer.AreEquals(typeDiscriminator.Id, rel.Id));
                            if (scopeDiscriminatorRelatedWithTargetDiscriminator != null)
                            {
                                Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' is related to permission scope '{scopeOfTypeOfTypeDiscriminator}' on discriminator '{scopeDiscriminatorRelatedWithTargetDiscriminator}', check discriminators");
                                typeDiscriminatorRelatedWithAnyPermissionScope = true;
                            }
                            else if (typeDiscriminator != TypeDiscriminator.Empty)
                            {
                                Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' isn't related to permission scope '{scopeOfTypeOfTypeDiscriminator}', FALSE");
                                return(false);
                            }
                        }
                        else
                        {
                            Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' hasn't any scope with discriminator of its type");
                            if (discriminators.IsNullOrEmpty())
                            {
                                Printer.WriteLine($"Haven't discriminators, VALUE ({me.Value})");
                                return(me.Value);
                            }
                            else
                            {
                                Printer.WriteLine($"Have some discriminators, check discriminators");
                            }
                        }
                    }
                    using (Printer.Indent2($"Checking discriminators:"))
                    {
                        // Compruebo el resto de discriminadores
                        return(discriminators.All(dis =>
                        {
                            var scopeOfTypeOfDiscriminator = me.Scopes.FirstOrDefault(s => Comparer.AreEquals(s.Discriminator.TypeKey, dis.TypeKey));
                            var scopeDiscriminatorRelatedWithDiscriminator = scopeOfTypeOfDiscriminator?.Discriminator
                                                                             .GetAllRelated(scopeOfTypeOfDiscriminator.Propagation)
                                                                             .FirstOrDefault(rel => Comparer.AreEquals(dis.TypeKey, rel.TypeKey) && Comparer.AreEquals(dis.Id, rel.Id));

                            if (scopeOfTypeOfDiscriminator != null)
                            {
                                Printer.WriteLine($"The discriminator '{dis}' and permission scope '{scopeOfTypeOfDiscriminator}' have same type '{dis.TypeKey}'");
                                if (scopeDiscriminatorRelatedWithDiscriminator != null)
                                {
                                    Printer.WriteLine($"The discriminator '{dis}' is related to permission scope '{scopeOfTypeOfDiscriminator}' on discriminator '{scopeDiscriminatorRelatedWithDiscriminator}'");
                                    return true;
                                }
                                else
                                {
                                    Printer.WriteLine($"The discriminator '{dis}' isn't related to permission scopes, continue");
                                    if (forFilter)
                                    {
                                        Printer.WriteLine($"This search is 'forFilter', TRUE");
                                        return true;
                                    }
                                }
                            }
                            else
                            {
                                Printer.WriteLine($"The permission hasn't any discriminator of type '{dis}', check typeDiscriminator");
                                if (typeDiscriminatorRelatedWithAnyPermissionScope)
                                {
                                    Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' is related to any permission scope, TRUE");
                                    return true;
                                }
                                else
                                {
                                    Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' isn't related to any permission scope, check if discriminator '{dis}' id is null");
                                    if (dis.Id.IsNullOrDefault())
                                    {
                                        Printer.WriteLine($"Discriminator '{dis}' id is null, VALUE ({me.Value})");
                                        return me.Value;
                                    }
                                    else
                                    {
                                        Printer.WriteLine($"Discriminator '{dis}' id isn't null, VALUE ({me.Value})");
                                        return !me.Value;
                                    }
                                }
                                //return dis.Id.IsNullOrDefault() ? me.Value : !me.Value;
                            }
                            return false;
                        }));
                    }
                }

                res = Compute();
            }
            Printer.WriteLine($"● RESULT {nameof(MatchByDiscriminatorsInclusionsAndExclusions)}: {res}");
            return(res);
        }