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); }
public static LinkID fromServiceMap(IServiceResourceMap serviceResourceMap, string resourceId, CRUDverbs verb = CRUDverbs.Read) { return(fromResourceMap(serviceResourceMap.Map, resourceId, verb)); }
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)); }