function api_mapping($slim)
 {
     $context = $this;
     /*** Those damn robots ***/
     $slim->get('/rest/v1/', function () {
         wp_send_json_error('These are not the droids you are looking for, please get a token first');
         exit;
     });
     $slim->get('/rest/v1/robots/', function () {
         wp_send_json_success('These are not the droids you are looking for, please get a token first. If you\'re testing API connection, everything seems to be going smooth ;)');
         exit;
     });
     /*
      *   _____      _              
      *  /__   \___ | | _____ _ __  
      *    / /\/ _ \| |/ / _ \ '_ \ 
      *   / / | (_) |   <  __/ | | |
      *   \/   \___/|_|\_\___|_| |_|
      *                             
      */
     /* 
      * Get a passive token
      * Generates a token, stores it into the database and returns the token as a response
      * Implement so that tokens are generated only once, then validated and used until valid
      * @return 	response.success Bool true is request was executed correctly
      * @return 	response.request_token Generated passive token
      * @see 	Validate token
      */
     $slim->get('/rest/v1/auth/getToken/', function () use($context) {
         if (method_exists("Router", 'generateToken')) {
             $new_token = $context->generateToken(FALSE);
             wp_send_json_success(array('request_token' => $new_token));
         }
         wp_send_json_error('Couldn\'t execute method');
         exit;
     });
     /* Check token for validity */
     $slim->get('/rest/v1/token/validate/', function () {
         if (!isset($_GET['token'])) {
             return wp_send_json_error(array("error" => "Please provide a user_id and a request token, or refer to the documentation for further support"));
         }
         $device_info = isset($_GET['device_info']) ? $_GET['device_info'] : NULL;
         $response = $this->check_token_exists($_GET['token']);
         if ($response) {
             wp_send_json_success($response);
         }
         wp_send_json_error();
     });
     /* Check token for validity with user data*/
     $slim->post('/rest/v1/token/validate/', function () {
         if (!isset($_POST['request_token'])) {
             return wp_send_json_error(array("error" => "Please provide a user_id and a request token, or refer to the documentation for further support"));
         }
         $device_info = isset($_POST['device_info']) ? $_POST['device_info'] : NULL;
         $response = $this->check_token_exists($_POST['request_token']);
         if ($response) {
             wp_send_json_success($response);
         }
         wp_send_json_error();
     });
     /*  
      * Validate Token
      */
     $slim->post('/rest/v1/user/validateToken/', function () {
         $token = isset($_POST['token']) ? $_POST['token'] : NULL;
         $user_id = isset($_POST['user_id']) ? $_POST['user_id'] : NULL;
         $validate_id = isset($_POST['validate_id']) ? $_POST['validate_id'] : NULL;
         $device_info = isset($_POST['device_info']) ? $_POST['device_info'] : NULL;
         if (!$token or !$user_id) {
             wp_send_json_error('Error: Not enough data provided, please check documentation');
         }
         /* Validate token and return it as a response */
         if (!$this->check_token_valid($user_id, $token, $device_info)) {
             $response = $this->update_tokenStatus($token, $user_id, 1);
             if ($validate_id) {
                 $this->settokenUser($token, $validate_id, $device_info);
             }
             if ($response) {
                 wp_send_json_success(array('token' => $token, 'status' => 'valid'));
             }
             /* Error: Something went wrong */
             wp_send_json_error('Can\'t validate token, please check your implementation. Do not send tokens directly to this endpoint');
             exit;
         }
         /* Error: Something went wrong */
         wp_send_json_error('Can\'t validate token or already valid. Please check your implementation or execute auth/user/checkToken/ endpoint to check your current token status. Do not send tokens directly to this endpoint');
         exit;
     });
     /*  
      * Β‘VARIATION! 
      * Validate Token from another endpoint
      * Differs from the '/user/validateToken/' endpoint in the way it sends a response.
      * Instead of sending a JSON response, this one just sends a Boolean response to handle inside the other endpoint
      */
     $slim->post('/rest/v1/auth/validateToken/', function () {
         $token = isset($_POST['token']) ? $_POST['token'] : NULL;
         $user_id = isset($_POST['user_id']) ? $_POST['user_id'] : NULL;
         $validate_id = isset($_POST['validate_id']) ? $_POST['validate_id'] : NULL;
         if (!$token or !$user_id) {
             return FALSE;
         }
         /* Validate token and return it as a response */
         if (!$this->check_token_valid($user_id, $token)) {
             $response = $this->update_tokenStatus($token, $user_id, 1);
             if ($validate_id) {
                 $this->settokenUser($token, $validate_id);
             }
             if ($response) {
                 return TRUE;
             }
             return FALSE;
             exit;
         }
         /* Error: Something went wrong */
         return exit;
     });
     /* 
      * Create user new 
      * @param 	$attr via $_POST {username: '******',email: 'email',password: '******',}
      * @return 	response.success Bool Executed
      * @return 	response.data User data
      * @see 	User.class.php
      */
     $slim->post('/rest/v1/auth/user/', function () {
         extract($_POST);
         if (!isset($username)) {
             wp_send_json_error('Please provide a username');
         }
         /* Create user object */
         $User = new User();
         $created = $User->create_if__notExists($username, $email, $attrs, FALSE);
         if ($created) {
             if (isset($attrs['login_redirect']) and (!$attrs['login_redirect'] or $attrs['login_redirect'] == FALSE)) {
                 mobile_pseudo_login();
                 wp_send_json_success($created);
             }
             /* Must provide password to use this method */
             _mobile_pseudo_login($username, $attrs['password'], $attrs['request_token']);
             exit;
         }
         wp_send_json_error('Couldn\'t create user');
         exit;
     });
     /* 
      * Check if user exists
      * 
      */
     $slim->get('/rest/v1/user/exists/:username', function ($username) {
         $User = new User();
         /* Create user */
         if ($User->_username_exists($username)) {
             $json_response = array('user_id' => $User->_username_exists($username), 'username' => $username);
             wp_send_json_success($json_response);
         }
         wp_send_json_error();
         exit;
     });
     /*
      *   _             _       
      *  | | ___   __ _(_)_ __  
      *  | |/ _ \ / _` | | '_ \ 
      *  | | (_) | (_| | | | | |
      *  |_|\___/ \__, |_|_| |_|
      *            |___/         
      */
     /*** Get random event image for login page ***/
     $slim->get('/rest/v1/content/login/', function () {
         return get_login_content();
         exit;
     });
     /*** User Login ***/
     $slim->post('/rest/v1/auth/login/', function () {
         return mobile_pseudo_login();
         exit;
     });
     /* User Logout from API and invalidate token in database
      * @param String $logged The username
      * @param String $request_token (via $_POST) to invalidate in database
      * @return JSON success
      */
     $slim->post('/rest/v1/auth/:logged/logout/', function ($logged) {
         return mobile_pseudo_logout($logged);
         exit;
     });
     /*     __               _ 
      *    / _| ___  ___  __| |
      *   | |_ / _ \/ _ \/ _` |
      *   |  _|  __/  __/ (_| |
      *   |_|  \___|\___|\__,_|
      */
     /*
      * Get user's timeline feed
      * @param String $user_login The user to retrieve timeline for
      * @param Int $offset Number of offsetted posts pages for pagination purposes
      * @important Timeline gets blocks of 10 activities, offset must be set according to the set of results. Ej. Page 1 is offset 0, page 2 is offset 1
      * 
      */
     $slim->get('/rest/v1/feed(/:offset)/', function ($offset) {
         if (!isset($_GET['token'])) {
             wp_send_json_error("Please include your request token as a parameter");
         }
         if (isset($_GET['token']) and !$this->check_token_exists($_GET['token'])) {
             wp_send_json_error("ERR_ACCESS Your token is not valid");
         }
         echo fetchFeed($offset);
         exit;
     });
     /*     __       _ _                   
      *    / _| ___ | | | _____      __
      *   | |_ / _ \| | |/ _ \ \ /\ / /
      *   |  _| (_) | | | (_) \ V  V /
      *   |_|  \___/|_|_|\___/ \_/\_/
      *                                    
      */
     /* Follow Hashtag
      * @param Int $who_follows The active logged user
      * @param Int $who The user ID to follow
      * @param String $type The type of user who is following
      * @return JSON success
      */
     $slim->post('/rest/v1/:who_follows/follow', function ($who_follows) {
         $who = isset($_POST['user_id']) ? $_POST['user_id'] : NULL;
         $type = isset($_POST['type']) ? $_POST['type'] : 'suscriptor';
         $user = get_user_by('login', $who_follows);
         if (siguiendo($who, $type, $user)) {
             wp_send_json_success();
         }
         wp_send_json_error();
         exit;
     });
     /*                                    
      *                                           _        
      *   ___ ___  _ __ ___  _ __ ___   ___ _ __ | |_ ___  
      *  / __/ _ \| '_ ` _ \| '_ ` _ \ / _ \ '_ \| __/ __| 
      * | (_| (_) | | | | | | | | | | |  __/ | | | |_\__ \ 
      *  \___\___/|_| |_| |_|_| |_| |_|\___|_| |_|\__|___/
      *                                                   
      */
     /*
      * Post a new comment to an event
      * @param String $logged_user The user posting the comment
      * @param Int $event_id The event where the comment is posted (via $_POST)
      * @param String $comment_content The content of the comment (via $_POST)
      * @TO DO Implement replies (indented comments)
      */
     $slim->post('/rest/v1/:logged_user/events/comments/', function ($logged_user) {
         if (post_comment_to_event($logged_user)) {
             wp_send_json_success();
         }
         wp_send_json_error('There was a problem posting your comment');
         exit;
     });
     /*
      * Get comments from a certain event
      * @param Int $event_id
      * @TO DO Implement replies (indented comments)
      */
     $slim->get('/rest/v1/events/comments/:event_id/:offset', function ($event_id, $offset) {
         return get_event_comments($event_id, $offset);
         exit;
     });
     /*
      * Get comments from a certain user
      * @param Int $user_id
      * 
      */
     $slim->get('/rest/v1/:u_login/comments', function ($user_login) {
         $user = get_user_by('login', $user_login);
         echo mobile_get_user_comments($user->ID);
         exit;
     });
     /*
      * Upvote a comment
      * @param String $user_login
      * @param Int $comment_id
      */
     $slim->post('/rest/v1/:u_login/upvote/:c_id', function ($user_login, $comment_id) {
         $user = get_user_by('login', $user_login);
         $comment = get_comment($comment_id);
         $args = array('comment_id' => $comment_id, 'parent_id' => $comment->comment_post_ID, 'comment_author_id' => $comment->user_id, 'vote' => 'up', 'voter' => $user);
         if (vote_comment($args)) {
             wp_send_json_success();
         }
         exit;
     });
     /*
      * Downvote a comment
      * @param String $user_login
      * @param Int $comment_id
      */
     $slim->post('/rest/v1/:u_login/downvote/:c_id', function ($user_login, $comment_id) {
         $user = get_user_by('login', $user_login);
         $comment = get_comment($comment_id);
         $args = array('comment_id' => $comment_id, 'parent_id' => $comment->comment_post_ID, 'comment_author_id' => $comment->user_id, 'vote' => 'down', 'voter' => $user);
         if (vote_comment($args)) {
             wp_send_json_success();
         }
         exit;
     });
     /*                          _     
      *  ___  ___  __ _ _ __ ___| |__  
      * / __|/ _ \/ _` | '__/ __| '_ \ 
      * \__ \  __/ (_| | | | (__| | | |
      * |___/\___|\__,_|_|  \___|_| |_|
      */
     /*
      * Search content
      * @param String $s
      * TO DO: Divide search by: people, tag, events and accept the parameter as a filter
      */
     $slim->get('/rest/v1/user/:logged/search/:s/:offset/', function ($logged, $s, $offset) {
         return search_museografo($s, $offset, $logged);
         exit;
     });
     /*    _                _       
      *   /_\  ___ ___  ___| |_ ___ 
      *  //_\\/ __/ __|/ _ \ __/ __|
      * /  _  \__ \__ \  __/ |_\__ \
      * \_/ \_/___/___/\___|\__|___/
      * General data sets for ui controls or some assets, i love the word assets                           
      */
     /*
      * Update user profile pic
      * @param String $logged
      * @param File $file via $_POST
      * @return JSON success
      * TO DO: Check token validity before actually uploading file
      * TO DO: Generate extra tokens to upload files, like a nonce
      */
     $slim->get('/rest/v1/assets/:asset_name/:args/', function ($asset_name, $args) {
         echo json_encode(museo_get_asset_by_name($asset_name, $args));
         exit;
     });
 }