|  | @@ -1,23 +1,32 @@
 | 
	
		
			
				|  |  |  import threading
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from flask import jsonify
 | 
	
		
			
				|  |  | +from flask import request
 | 
	
		
			
				|  |  | +from flask_restful import abort
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -from core.ConfigurationManager.BrainLoader import BrainLoader
 | 
	
		
			
				|  |  | +from core import OrderAnalyser
 | 
	
		
			
				|  |  |  from core.RestAPI.utils import requires_auth
 | 
	
		
			
				|  |  |  from core.SynapseLauncher import SynapseLauncher
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class FlaskAPI(threading.Thread):
 | 
	
		
			
				|  |  | -    def __init__(self, app, port=5000, brain_file=None):
 | 
	
		
			
				|  |  | +    def __init__(self, app, port=5000, brain=None):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        :param app: Flask API
 | 
	
		
			
				|  |  | +        :param port: Port to listen
 | 
	
		
			
				|  |  | +        :param brain: Brain object
 | 
	
		
			
				|  |  | +        :type brain: Brain
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  |          super(FlaskAPI, self).__init__()
 | 
	
		
			
				|  |  |          self.app = app
 | 
	
		
			
				|  |  |          self.port = port
 | 
	
		
			
				|  |  | -        self.brain_file = brain_file
 | 
	
		
			
				|  |  | -        self.brain_yaml = BrainLoader.get_yaml_config(file_path=self.brain_file)
 | 
	
		
			
				|  |  | +        self.brain = brain
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          self.app.add_url_rule('/synapses/', view_func=self.get_synapses, methods=['GET'])
 | 
	
		
			
				|  |  |          self.app.add_url_rule('/synapses/<synapse_name>', view_func=self.get_synapse, methods=['GET'])
 | 
	
		
			
				|  |  |          self.app.add_url_rule('/synapses/<synapse_name>', view_func=self.run_synapse, methods=['POST'])
 | 
	
		
			
				|  |  | +        self.app.add_url_rule('/order/', view_func=self.run_order, methods=['POST'])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def run(self):
 | 
	
		
			
				|  |  |          self.app.run(host='0.0.0.0', port="%s" % int(self.port), debug=True, threaded=True, use_reloader=False)
 | 
	
	
		
			
				|  | @@ -28,7 +37,7 @@ class FlaskAPI(threading.Thread):
 | 
	
		
			
				|  |  |          :param synapse_name:
 | 
	
		
			
				|  |  |          :return:
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  | -        all_synapse = self.brain_yaml
 | 
	
		
			
				|  |  | +        all_synapse = self.brain.brain_yaml
 | 
	
		
			
				|  |  |          for el in all_synapse:
 | 
	
		
			
				|  |  |              print el
 | 
	
		
			
				|  |  |              if el[0]["name"] in synapse_name:
 | 
	
	
		
			
				|  | @@ -40,7 +49,7 @@ class FlaskAPI(threading.Thread):
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  |          get all synapse
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  | -        data = jsonify(synapses=self.brain_yaml)
 | 
	
		
			
				|  |  | +        data = jsonify(synapses=self.brain.brain_yaml)
 | 
	
		
			
				|  |  |          return data, 200
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @requires_auth
 | 
	
	
		
			
				|  | @@ -76,6 +85,44 @@ class FlaskAPI(threading.Thread):
 | 
	
		
			
				|  |  |              return jsonify(error=data), 404
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # run the synapse
 | 
	
		
			
				|  |  | -        SynapseLauncher.start_synapse(synapse_name, brain_file=self.brain_file)
 | 
	
		
			
				|  |  | +        SynapseLauncher.start_synapse(synapse_name, brain_file=self.brain.brain_file)
 | 
	
		
			
				|  |  |          data = jsonify(synapses=synapse_target)
 | 
	
		
			
				|  |  |          return data, 201
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @requires_auth
 | 
	
		
			
				|  |  | +    def run_order(self):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        Give an order to Kalliope via API like it was from a spoken one
 | 
	
		
			
				|  |  | +        Test with curl
 | 
	
		
			
				|  |  | +        curl -i --user admin:secret -H "Content-Type: application/json" -X POST -d '{"order":"my order"}' http://localhost:5000/order
 | 
	
		
			
				|  |  | +        In case of quotes in the order or accents, use a file
 | 
	
		
			
				|  |  | +        cat post.json:
 | 
	
		
			
				|  |  | +        {"order":"j'aime"}
 | 
	
		
			
				|  |  | +        curl -i --user admin:secret -H "Content-Type: application/json" -X POST --data @post.json http://localhost:5000/order/
 | 
	
		
			
				|  |  | +        :return:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        if not request.get_json() or 'order' not in request.get_json():
 | 
	
		
			
				|  |  | +            abort(400)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        order = request.get_json('order')
 | 
	
		
			
				|  |  | +        if order is not None:
 | 
	
		
			
				|  |  | +            # get the order
 | 
	
		
			
				|  |  | +            order_to_run = order["order"]
 | 
	
		
			
				|  |  | +            oa = OrderAnalyser(order=order_to_run, brain=self.brain)
 | 
	
		
			
				|  |  | +            launched_synapses = oa.start()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if launched_synapses:
 | 
	
		
			
				|  |  | +                # if the list is not empty, we have launched one or more synapses
 | 
	
		
			
				|  |  | +                data = jsonify(synapses=[e.serialize() for e in launched_synapses])
 | 
	
		
			
				|  |  | +                return data, 201
 | 
	
		
			
				|  |  | +            else:
 | 
	
		
			
				|  |  | +                data = {
 | 
	
		
			
				|  |  | +                    "error": "The given order doesn't match any synapses"
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return jsonify(error=data), 400
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            data = {
 | 
	
		
			
				|  |  | +                "error": "order cannot be null"
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return jsonify(error=data), 400
 |