--- /dev/null
+'use strict';
+
+const Twilio = require('twilio');
+
+const internals = {};
+
+internals.kMenuTimeout = 10; // timeout in seconds
+internals.kContentType = 'application/xml'; // The content type used to respond
+internals.kMenuLanguage = 'es-mx'; // the language to use
+internals.kMainMenuRoute = '/menus/main';
+internals.kListenMessageRoute = '/recordings/';
+internals.kMenuMessage = 'Escribe el numero de mensaje y presiona gato para terminar.';
+internals.kTimeoutMessage = 'Bueno... volviendo al menĂș principal.';
+internals.kMenuInvalidResponseMessage = 'No entendĂ... Volviendo al menu principal.'; // invalid selection message
+
+/**
+ * Handles the HTTP requests for the recording menu
+ *
+ * @class RecordingMenuController
+ */
+module.exports = internals.RecordingMenuController = class RecordingMenuController {
+
+ /**
+ * Serves the menu
+ *
+ * @function serveMenu
+ * @memberof RecordingMenuController
+ * @instance
+ * @return {generator} a koa compatible handler generator function
+ */
+ serveMenu() {
+
+ return function * () {
+
+ const response = new Twilio.TwimlResponse();
+
+ // the action will default to post in the same URL, so no change
+ // required there.
+ response.gather({
+ timeout: internals.kMenuTimeout
+ }, function nestedHandler() {
+
+ this.say(internals.kMenuMessage, { language: internals.kMenuLanguage });
+ })
+ .say(internals.kTimeoutMessage, { language: internals.kMenuLanguage })
+ .redirect(internals.kMainMenuRoute, { method: 'GET' });
+
+ this.type = internals.kContentType;
+ this.body = response.toString();
+ };
+ }
+
+ /**
+ * Parses the selected recording id
+ *
+ * @function parseMenuSelection
+ * @memberof RecordingMenuController
+ * @instance
+ * @return {generator} a koa compatible handler generator function
+ */
+ parseMenuSelection() {
+
+ return function * () {
+
+ const messageId = parseInt(this.request.body.Digits);
+
+ const response = new Twilio.TwimlResponse();
+
+ if (messageId) {
+ response.redirect(`${internals.kListenMessageRoute}${messageId}`, { method: 'GET' });
+ }
+ else {
+ response.say(internals.kMenuInvalidResponseMessage, { language: internals.kMenuLanguage })
+ .redirect(internals.kMainMenuRoute, { method: 'GET' });
+ }
+
+ this.type = internals.kContentType;
+ this.body = response.toString();
+ };
+ }
+};
+