public static LinkID BuildLinkID(this IServiceResourceMap serviceResourceMap, string resourceId, CRUDverbs verb = CRUDverbs.Read)
 {
     return(LinkID.fromServiceMap(serviceResourceMap, resourceId, verb));
 }
 public static LinkID BuildLinkID(this List <ResourceLink> resourceMap, string resourceId, CRUDverbs verb = CRUDverbs.Read)
 {
     return(LinkID.fromResourceMap(resourceMap, resourceId, verb));
 }
 public ResourceIDAttribute(string resourceId, CRUDverbs action = CRUDverbs.Read)
 {
     ResourceID = resourceId;
     Action     = action;
 }
        public static List <ResourceLink> BuildResourceMap(Type type)
        {
            var resourceLinks = new List <ResourceLink>();

            var    isBusinessAggregate         = type.GetInterface(_IBusinessAggregateName) != null;
            string aggregateResourceName       = null;
            string aggregatePluralResourceName = null;

            BindingFlags flags;

            if (isBusinessAggregate)
            {
                flags = BindingFlags.Public | BindingFlags.Instance;

                aggregateResourceName       = type.GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static).FirstOrDefault(p => p.Name == "ResourceName")?.GetValue(null)?.ToString();
                aggregatePluralResourceName = type.GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static).FirstOrDefault(p => p.Name == "PluralResourceName")?.GetValue(null)?.ToString();
            }
            else
            {
                flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
            }

            MethodInfo[] methods = type.GetMethods(flags);

            #region Search within methods
            foreach (MethodInfo method in methods)
            {
                CRUDverbs verb       = CRUDverbs.Read;
                var       resourceID = string.Empty;
                var       methodName = string.Empty;
                var       caught     = false;

                var attr = method.GetCustomAttribute <ResourceIDAttribute>();

                if (attr != null)
                {
                    resourceID = attr.ResourceID;
                    verb       = attr.Action;
                    methodName = method.Name;

                    caught = true;
                }

                if (!caught && isBusinessAggregate)
                {
                    resourceID = aggregateResourceName ?? type.Name;

                    switch (method.Name)
                    {
                    case "GetAllAsync":
                        resourceID = aggregatePluralResourceName ?? $"plural_{type.Name}";
                        methodName = "GetAllAsync";
                        break;

                    case "GetByIdAsync":
                        methodName = "GetByIdAsync";
                        break;

                    case "AddAsync":
                        verb       = CRUDverbs.Create;
                        methodName = "AddAsync";
                        break;

                    case "UpdateAsync":
                        verb       = CRUDverbs.Update;
                        methodName = "UpdateAsync";
                        break;

                    case "DeleteAsync":
                        verb       = CRUDverbs.Delete;
                        methodName = "DeleteAsync";
                        break;

                    default:
                        break;
                    }

                    if (methodName != string.Empty)
                    {
                        if (resourceLinks.Count(r => r.MethodName == methodName) > 0)
                        {
                            methodName = string.Empty;
                        }
                        else
                        {
                            caught = true;
                        }
                    }
                }


                if (caught)
                {
                    if (resourceLinks.Count(r => r.ResourceID == resourceID && r.Verb == verb && r.MethodName == methodName) == 0)
                    {
                        var tmpLink = new ResourceLink
                        {
                            ResourceID = resourceID,
                            Verb       = verb,
                            MethodName = methodName
                        };

                        var parameters = new List <ResourceLinkParameters>();

                        foreach (var parameter in method.GetParameters())
                        {
                            parameters.Add(new ResourceLinkParameters
                            {
                                Name         = parameter.Name,
                                Type         = parameter.ParameterType,
                                IsRequired   = !parameter.IsOptional,
                                DefaultValue = parameter.DefaultValue
                            });
                        }

                        if (parameters.Count > 0)
                        {
                            tmpLink.Parameters = parameters;
                        }

                        resourceLinks.Add(tmpLink);
                    }
                }
            }
            #endregion

            #region Search for BusinessAggregate properties
            if (isBusinessAggregate)
            {
                // NonPublic is taken out, cause if Private, then it would not be mapped to anything on the API controller either
                //var properties = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

                foreach (var property in properties)
                {
                    if (property.PropertyType.GetInterface(_IBusinessAggregateName) != null)
                    {
                        resourceLinks.AddResourceMap(property.PropertyType);
                    }
                }
            }
            #endregion

            return(resourceLinks);
        }
Beispiel #5
0
 public static LinkID fromServiceMap(IServiceResourceMap serviceResourceMap, string resourceId, CRUDverbs verb = CRUDverbs.Read)
 {
     return(fromResourceMap(serviceResourceMap.Map, resourceId, verb));
 }
Beispiel #6
0
        public static LinkID fromResourceMap(List <ResourceLink> resourceMap, string resourceId, CRUDverbs verb = CRUDverbs.Read)
        {
            var resourceLink = resourceMap.Find(l => l.ResourceID == resourceId && l.Verb == verb);

            if (resourceLink == null)
            {
                throw new ArgumentNullException("There is no method associated to this Resource Link. Please provide a Resource Link through the ResourceId Attribute.");
            }

            return(fromResourceLink(resourceLink));
        }