/// <summary> /// Creates the required routes for all IInteractionEngine implementations. /// </summary> /// <param name="interactionEngine">The <see cref="IInteractionEngine"/> being extended</param> /// <param name="handler">A handler to wrap around the call. Takes the output and API input parameters as input.</param> /// <returns>The list of API routes</returns> public static List <APIRoute> GetRequiredAPIRoutes(this IInteractionEngine interactionEngine, Func <dynamic, object[], dynamic> handler = null) { var routes = new List <APIRoute>(); // Create the Skills endpoints var route = new APIRoute { Path = "/skills", Description = "List available skills", Method = HttpMethod.Get, RequiresAuthentication = true, Handler = (APIRequest request) => { var response = new APIResponse(interactionEngine.ListSkills()); // TODO: the analysis module hook needs to be implemented in a better way return(handler != null?handler(response, new object[] { request }) : response); } }; routes.Add(route); route = new APIRoute { Path = "/skills", Description = "Register a new skill", Method = HttpMethod.Post, RequiresAuthentication = true, Handler = (APIRequest request) => { Skill skill = ((JObject)request.Data).ToObject <Skill>(); switch (skill.Binding) { /* * // TODO: Binary executors can't be loaded over the network using the API * // since they need a method handler * case SkillExecutorBinding.Builtin: * case SkillExecutorBinding.Module: * skill.Executor = ((JObject)skill.Executor).ToObject<BinaryExecutor>(); * break; */ case SkillExecutorBinding.Network: skill.Executor = ((JObject)skill.Executor).ToObject <NetworkExecutor>(); break; default: throw new NotImplementedException( $"The given skill binding '{skill.Binding}' is not implemented"); } APIResponse response = new APIResponse(); if (interactionEngine.RegisterSkill(skill)) { response.StatusCode = (int)HttpStatusCode.Created; response.Data = new { UUID = skill.UUID, Registered = true }; } else { response.StatusCode = (int)HttpStatusCode.Conflict; response.Data = new { Registered = false, Reason = $"The skill '{skill.UUID}' has already been registered" }; } // TODO: the analysis module hook needs to be implemented in a better way return(handler != null?handler(response, new object[] { request }) : response); } }; routes.Add(route); route = new APIRoute { Path = "/skills/{skillUUID}", Description = "Deregister a new skill", Method = HttpMethod.Delete, RequiresAuthentication = true, Handler = (APIRequest request) => { APIResponse response = new APIResponse(); if (interactionEngine.DeregisterSkill(request.Parameters.skillUUID)) { response.StatusCode = (int)HttpStatusCode.OK; } else { response.StatusCode = (int)HttpStatusCode.NotFound; response.StatusMessage = $"The skill '{request.Parameters.skillUUID}' was not found or has already been deregistered"; } // TODO: the analysis module hook needs to be implemented in a better way return(handler != null?handler(response, new object[] { request }) : response); } }; routes.Add(route); return(routes); }
/// <summary> /// TODO: Find a better way to reload modules in other modules /// See Issue #3 /// https://github.com/ProjectLimitless/ProjectLimitless/issues/3 /// </summary> /// <param name="engine"></param> public void SetEngine(IInteractionEngine engine) { _engine = engine; }