{"id":30582970,"url":"https://github.com/marcusal/food-delivery-app","last_synced_at":"2025-08-29T08:09:22.906Z","repository":{"id":192449029,"uuid":"365284329","full_name":"MarcusAl/Food-Delivery-App","owner":"MarcusAl","description":"A terminal app with login capability and CRUD processes. It follows the Ruby MVC pattern.","archived":false,"fork":false,"pushed_at":"2021-05-07T16:23:49.000Z","size":30,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2023-09-04T20:04:36.567Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MarcusAl.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-05-07T15:55:21.000Z","updated_at":"2023-09-04T20:04:46.314Z","dependencies_parsed_at":"2023-09-04T20:14:40.845Z","dependency_job_id":null,"html_url":"https://github.com/MarcusAl/Food-Delivery-App","commit_stats":null,"previous_names":["marcusal/food-delivery-app"],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/MarcusAl/Food-Delivery-App","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcusAl%2FFood-Delivery-App","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcusAl%2FFood-Delivery-App/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcusAl%2FFood-Delivery-App/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcusAl%2FFood-Delivery-App/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MarcusAl","download_url":"https://codeload.github.com/MarcusAl/Food-Delivery-App/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcusAl%2FFood-Delivery-App/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272652384,"owners_count":24970576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-29T02:00:10.610Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-29T08:09:22.461Z","updated_at":"2025-08-29T08:09:22.900Z","avatar_url":"https://github.com/MarcusAl.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"Asegurate de ejecutar lo comandos anteriores 👆\n\n**IMPORTANTE** 👇\n\nCopia el código de ayer:\n\n```bash\ncp -r ../../05-Food-Delivery-Day-One/01-Food-Delivery/{app,data,app.rb,router.rb} . # trailing dot is important\n```\n\nLuego, comprueba que todo todavía funciona antes de empezar iniciando tu aplicación:\n\n```bash\nruby app.rb\n```\n\nEntonces, finalmente, puedes ejecutar:\n\n```bash\nrake\n```\n\nAhora continúa con tu propio código y sigue agregando funcionalidades al ruteador y haciendo que el `rake` siga saliendo verde.\n\n¡Agreguemos más funcionalidades a nuestro programa de Entrega a Domicilio (Food Delivery)!\n\nAquí están todas la **acciones de usuario** de nuestra aplicación:\n[] Como empleado, puedo iniciar sesión\n[X] Como gerente, puedo agregar un nuevo plato\n[X] Como gerente, puedo mostrar la lista de todos platos\n[X] Como gerente, puedo agregar un nuevo cliente\n[X] Como gerente, puedo mostrar la lista de todos clientes\n[X] Como gerente, puedo agregar un nuevo pedido\n[X] Como gerente, puedo mostrar la lista de todos los pedidos no entregados\n[X] Como repartidor, puedo marcar uno de mis pedidos como entregado\n[X] Como repartidor, puedo mostrar la lista de todos mis pedidos no entregados\n\nPor lo tanto, hay dos nuevos componentes:\n- **Employees**: empleados\n- **Orders**: pedidos\n\n## 1 - `Employee`\n\n### 1.1 - Modelo de `Employee`\n\nNuestro restaurante tiene dos tipos de empleados: **gerentes** y **repartidores**. Ambos tienen número de identificación (id), usuario y contraseña. Sin embargo, tienen privilegios diferentes dependiendo de sus roles.\n\nEscribe el código para implementar esto y haz el crash test del modelo en `irb`. Luego testea tu código corriendo `rake employee`.\n\n¿Todo en verde? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n### 1.2 - Repositorio de `Employee`\n\nAhora que tenemos un modelo que representa a nuestros empleados, necesitamos un repositorio para almacenarlos.\n\nEste repositorio se inicializa con una ruta de archivo CSV. Tiene una lógica de **solo lectura** ya que solo el administrador de nuestra aplicación puede crear cuentas (no es necesario crear un método `add`). La interfaz de este repositorio permite lo siguiente:\n- Recuperar a todos los repartidores del repositorio\n- Encontrar a un empleado específico gracias a su número de identificación (id)\n- Encontrar a un empleado específico gracias a su usuario\n\nEscribe el código para implementar esto y haz el crash test de tu repositorio en irb. Debes crear tu propio archivo CSV `employees.csv` dentro de la carpeta `data`. Luego testea tu código corriendo `rake employee`.\n\n¿Todo en verde? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n### 1.3 - Controlador de `Session`\n\nImplementemos una lógica de **login** en nuestra aplicación.\n\nQueremos tener dos menús en el ruteador: uno que muestre la lista de tareas para los gerentes y otra que muestre las de los repartidores. También queremos direccionar la selección del empleado a la acción en el controlador correspondiente.\n\nPara ello introduciremos la noción de una **session**. A nivel del ruteador, almacenaremos al usuario logueado en una sesión.\n\nLa secuencia de inicio de sesión debe ser de la siguiente manera:\n\n```bash\n\u003e username?\npaul\n\u003e password?\nblablabla\nWrong credentials... Try again!\n\u003e username?\npaul\n\u003e password?\nsecret\nWelcome Paul!\n```\n\nDespués de haber iniciado sesión, verás un tablero de comando **de acuerdo a tu rol en la empresa**.\n\nEscribe el código para implementar este comportamiento.\n\nNo hay rake para esta parte del desafío. Corre tu aplicación ejecutando el siguiente comando en la Terminal:\n\n```bash\nruby app.rb\n```\n\n¿Todo está funcionando bien? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n## 2 - `Order`\n\n### 2.1 - Modelo de `Order`\n\nNuestro restaurante toma pedidos, así que tenemos que representar lo que es un pedido.\n\n\nEl pedido es lo que une a todos los elementos. Cada pedido tiene un número de identificación (id), un plato, un cliente, un empleado y un booleano `delivered` para registrar si ha sido entregado.\n\nEscribe el código para implementar esto y haz el crash test del modelo en `irb`. Luego testea tu código corriendo `rake order`.\n\n¿Todo en verde? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n### 2.2 - Repositorio de `Order`\n\nAhora que ya tenemos un modelo que representa a nuestros pedidos, tenemos la necesidad de un repositorio para almacenarlos.\n\nEste repositorio se inicializa con una ruta de archivo CSV, lee/escribe los pedidos del archivo CSV y los almacena en memoria. La interfaz del repositorio permite lo siguiente:\n- Agregar un nuevo pedido al repositorio\n- Recuperar todos los pedidos no entregados del repositorio\n\nYa que nuestro pedido tiene las **instancias** `meal`, `customer` y `employee`, tenemos que inicializar nuestro repositorio de pedidos, el de los platos (meals), el de los clientes (customers) y el de los empleados (employees).\n\nEscribe el código para implementar esto y haz el crash test del repositorio en `irb`. Tienes que crear tu propio archivo  CSV `orders.csv` dentro de la carpeta `data`. Luego testea tu código corriendo `rake order`.\n\n**Importante**: los tests de `order_repository` que corre `rake` **solo funcionan si defines los parámetros en `#initialize` en el mismo orden que el que está en los tests**:\n\n```ruby\nclass OrderRepository\n  def initialize(orders_csv_path, meal_repository, customer_repository, employee_repository)\n    # [...]\n  end\n\n  # [...]\nend\n```\n\n¿Todo en verde? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n### 2.3 Controlador de `Order`\n\nVayamos al controlador. Las siguientes son las **acciones de usuario** que queremos implementar:\n- Como gerente, puedo agregar un pedido\n- Como gerente, puedo mostrar la lista de todos los pedidos que no han sido entregados\n- Como repartidor, puedo marcar uno de mis pedidos como entregado\n- Como repartidor, puedo mostrar la lista de todos mis pedidos no entregados\n\n¡Recuerda que el rol del controlador es delegar el trabajo a los otros componentes de nuestra aplicación (modelo, repositorio y vistas)!\n\nComienza escribiendo el **pseudocódigo** separando cada acción de usuario en pasos básicos y delegando cada uno de ellos a un componente (modelo, repositorio, vista). Luego escribe el código correspondiente. Crea la vista y escribe su código paso por paso.\n\nPara testear el controlador, conectalo a tu aplicación instanciandolo en `app.rb` y pasándoselo al ruteador. Luego haz el crash test del código corriendo tu aplicación:\n\n```bash\nruby app.rb\n```\n\n`rake order` también te debería ser de utilidad en estos pasos. ¡Sigue la guía!\n\nAsegurate que las cuatro acciones de usuario para pedidos funcionen bien antes de trabajar en la siguiente funcionalidad.\n\n**Importante**: los tests de `orders_controller` que corre `rake` **solo funcionan si defines los parámetros en `#initialize` en el mismo orden que el que está en los tests**:\n\n```ruby\nclass OrdersController\n  def initialize(meal_repository, customer_repository, employee_repository, order_repository)\n    # [...]\n  end\n\n  # [...]\nend\n```\n\n**Importante**: ya que los **ids** no necesariamente empiezan en 1 y no son necesariamente continuos, le preguntaremos al/a la usuario/a por índices (indexes) y así mejorar la experiencia de usuario.\n\n¿Todo en verde? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n## 3 - Opcionales\n\n### 3.1 - Implementa las acciones `edit` y `destroy` para los pedidos.\n\nPor ahora en nuestra aplicación los gerentes aún no pueden editar o borrar pedidos actuales.\n\nImplementa las siguientes acciones de usuarios adicionales:\n- Como gerente, puedo editar un pedido actual\n- Como gerente, puedo borrar un pedido actual\n\n¿Listo? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n### 3.2 Oculta la contraseña del/de la usuario/a\n\nPor ahora, la contraseña se guarda directamente en el CSV y es cualquier persona la puede ver ¿Crees que esto es buena idea? ¿Cómo podemos cambiar esto?\n\n¿Listo? ¡Qué bueno! Es hora de hacer `git add`, `commit` y `push`.\n\n¡Has terminado el Food Delivery!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcusal%2Ffood-delivery-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcusal%2Ffood-delivery-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcusal%2Ffood-delivery-app/lists"}