{"id":19738050,"url":"https://github.com/cemb93/countries","last_synced_at":"2026-06-09T03:43:08.471Z","repository":{"id":170847721,"uuid":"563240266","full_name":"Cemb93/Countries","owner":"Cemb93","description":null,"archived":false,"fork":false,"pushed_at":"2023-08-08T22:31:58.000Z","size":1295,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-10T19:28:04.519Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/Cemb93.png","metadata":{"files":{"readme":"README.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-08T07:44:53.000Z","updated_at":"2022-11-08T08:04:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"ab742ee5-4204-4e5d-86d8-b6285910b5b0","html_url":"https://github.com/Cemb93/Countries","commit_stats":null,"previous_names":["cemb93/countries"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cemb93%2FCountries","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cemb93%2FCountries/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cemb93%2FCountries/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cemb93%2FCountries/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cemb93","download_url":"https://codeload.github.com/Cemb93/Countries/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241067628,"owners_count":19903854,"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","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":"2024-11-12T01:13:09.344Z","updated_at":"2026-06-09T03:43:03.442Z","avatar_url":"https://github.com/Cemb93.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![HenryLogo](https://d31uz8lwfmyn8g.cloudfront.net/Assets/logo-henry-white-lg.png)\n\n# Individual Project - Henry Countries\n\n\u003cp align=\"left\"\u003e\n  \u003cimg height=\"200\" src=\"./countries.png\" /\u003e\n\u003c/p\u003e\n\n## Objetivos del Proyecto\n\n- Construir una App utlizando React, Redux, Node y Sequelize.\n- Afirmar y conectar los conceptos aprendidos en la carrera.\n- Aprender mejores prácticas.\n- Aprender y practicar el workflow de GIT.\n- Usar y practicar testing.\n\n## Horarios y Fechas\n\nEl proyecto tendrá una duración máxima de tres semanas. En el caso de que completan todas las tareas antes de dicho lapso podrán avisar a su Instructor para coordinar una fecha de presentación del trabajo (DEMO).\n\n## Comenzando\n\n 1. Forkear el repositorio para tener una copia del mismo en sus cuentas\n 2. Clonar el repositorio en sus computadoras para comenzar a trabajar\n\nTendrán un `boilerplate` con la estructura general tanto del servidor como de cliente.\n\n__IMPORTANTE:__ Es necesario contar minimamente con la última versión estable de Node y NPM. Asegurarse de contar con ella para poder instalar correctamente las dependecias necesarias para correr el proyecto.\n\nActualmente las versiónes necesarias son:\n\n- __Node__: 12.18.3 o mayor\n- __NPM__: 6.14.16 o mayor\n\nPara verificar que versión tienen instalada:\n\n```bash\nnode -v\nnpm -v\n```\n\n__ACLARACIÓN:__ Las dependencias actuales se encuentran en las versiones que venimos trabajando durante el bootcamp.\n\nVersiones:\n\n- __react__: 17.0.1\n- __react-dom__: 17.0.1\n- __react-router-dom__: 5.2.0\n- __redux__: 4.0.5\n- __react-redux__: 7.2.3\n\nEstá permitido, __bajo su responsabilidad__, actualizar las dependencias a versiones más actuales.\n\n\u003e __IMPORTANTE:__ Versiones mas actuales podrían presentar configuraciones diferentes respecto a las versiones en las que venimos trabajando durante el bootcamp.\n\n## BoilerPlate\n\nEl boilerplate cuenta con dos carpetas: `api` y `client`. En estas carpetas estará el código del back-end y el front-end respectivamente.\n\nEn `api` crear un archivo llamado: `.env` que tenga la siguiente forma:\n\n```env\nDB_USER=usuariodepostgres\nDB_PASSWORD=passwordDePostgres\nDB_HOST=localhost\n```\n\nReemplazar `usuariodepostgres` y `passwordDePostgres` con tus propias credenciales para conectarte a postgres. Este archivo va ser ignorado en la subida a github, ya que contiene información sensible (las credenciales).\n\nAdicionalmente será necesario que creen desde psql una base de datos llamada `countries`\n\nEl contenido de `client` fue creado usando: Create React App.\n\n## Enunciado\n\nLa idea general es crear una aplicación en la cual se pueda ver información de  distintos paises utilizando la api externa [restcountries](https://restcountries.com/) y a partir de ella poder, entre otras cosas:\n\n- Buscar paises\n- Filtrarlos / Ordenarlos\n- Crear actividades turísticas\n\n__IMPORTANTE__: Para las funcionalidades de filtrado y ordenamiento NO pueden utilizar los endpoints de la API externa que ya devuelven los resultados filtrados u ordenados sino que deben realizarlo ustedes mismos. En particular alguno de los ordenamientos o filtrados debe si o si realizarse desde el frontend.\n\n### Únicos Endpoints/Flags que pueden utilizar\n\n- GET \u003chttps://restcountries.com/v3/all\u003e\n- GET \u003chttps://restcountries.com/v3/name/{name}\u003e\n- GET \u003chttps://restcountries.com/v3/alpha/{code}\u003e\n\n### Requerimientos mínimos\n\nA continuación se detallaran los requerimientos mínimos para la aprobación del proyecto individial. Aquellos que deseen agregar más funcionalidades podrán hacerlo. En cuanto al diseño visual no va a haber wireframes ni prototipos prefijados sino que tendrán libertad de hacerlo a su gusto pero tienen que aplicar los conocimientos de estilos vistos en el curso para que quede agradable a la vista.\n\n__IMPORTANTE__: No se permitirá utilizar librerías externas para aplicar estilos a la aplicación. Tendrán que utilizar CSS con algunas de las opciones que vimos en dicha clase (CSS puro, CSS Modules o Styled Components)\n\n#### Tecnologías necesarias\n\n- [ ] React\n- [ ] Redux\n- [ ] Express\n- [ ] Sequelize - Postgres\n\n## Frontend\n\nSe debe desarrollar una aplicación de React/Redux que contenga las siguientes pantallas/rutas.\n\n__Pagina inicial__: deben armar una landing page con\n\n- [ ] Alguna imagen de fondo representativa al proyecto\n- [ ] Botón para ingresar al home (`Ruta principal`)\n\n__Ruta principal__: debe contener\n\n- [ ] Input de búsqueda para encontrar países por nombre\n- [ ] Área donde se verá el listado de países. Al iniciar deberá cargar los primeros resultados obtenidos desde la ruta `GET /countries` y deberá mostrar su:\n  - Imagen de la bandera\n  - Nombre\n  - Continente\n- [ ] Botones/Opciones para filtrar por continente y por tipo de actividad turística\n- [ ] Botones/Opciones para ordenar tanto ascendentemente como descendentemente los países por orden alfabético y por cantidad de población\n- [ ] Paginado para ir buscando y mostrando los siguientes paises, 10 paises por pagina, mostrando los primeros 9 en la primer pagina.\n\n__Ruta de detalle de país__: debe contener\n\n- [ ] Los campos mostrados en la ruta principal para cada país (imagen de la bandera, nombre, código de país de 3 letras y continente)\n- [ ] Código de país de 3 letras (id)\n- [ ] Capital\n- [ ] Subregión\n- [ ] Área (Mostrarla en km2 o millones de km2)\n- [ ] Población\n- [ ] Actividades turísticas con toda su información asociada\n\n__Ruta de creación de actividad turística__: debe contener\n\n- [ ] Un formulario __controlado con JavaScript__ con los siguientes campos:\n  - Nombre\n  - Dificultad\n  - Duración\n  - Temporada\n- [ ] Posibilidad de seleccionar/agregar varios países en simultáneo\n- [ ] Botón/Opción para crear una nueva actividad turística\n\n\u003e Es requisito que el formulario de creación esté validado con JavaScript y no sólo con validaciones HTML. Pueden agregar las validaciones que consideren. Por ejemplo: Que el nombre de la actividad no pueda contener símbolos, que la duración no pueda exceder determinado valor, etc.\n\n## Base de datos\n\nEl modelo de la base de datos deberá tener las siguientes entidades (Aquellas propiedades marcadas con asterísco deben ser obligatorias):\n\n- [ ] País con las siguientes propiedades:\n  - ID (Código de 3 letras) *\n  - Nombre *\n  - Imagen de la bandera *\n  - Continente *\n  - Capital *\n  - Subregión\n  - Área\n  - Población\n- [ ] Actividad Turística con las siguientes propiedades:\n  - ID\n  - Nombre\n  - Dificultad (Entre 1 y 5)\n  - Duración\n  - Temporada (Verano, Otoño, Invierno o Primavera)\n\nLa relación entre ambas entidades debe ser de muchos a muchos ya que un país puede contener varias actividades turísticas y, a su vez, una actividad turística puede darse en múltiples países. Por ejemplo una actividad podría ser \"Ski\" que podría ocurrir en Argentina y también en Estados Unidos, pero a su vez Argentina podría también incluir \"Rafting\".\n\n## Backend\n\nSe debe desarrollar un servidor en Node/Express con las siguientes rutas:\n\n__IMPORTANTE__: No está permitido utilizar los filtrados, ordenamientos y paginados brindados por la API externa, todas estas funcionalidades tienen que implementarlas ustedes.\n\n- [ ] __GET /countries__:\n  - En una primera instancia deberán traer todos los países desde restcountries y guardarlos en su propia base de datos y luego ya utilizarlos desde allí (Debe retonar sólo los datos necesarios para la ruta principal)\n  - Obtener un listado de los paises.\n- [ ] __GET /countries/{idPais}__:\n  - Obtener el detalle de un país en particular\n  - Debe traer solo los datos pedidos en la ruta de detalle de país\n  - Incluir los datos de las actividades turísticas correspondientes\n- [ ] __GET /countries?name=\"...\"__:\n  - Obtener los países que coincidan con el nombre pasado como query parameter (No necesariamente tiene que ser una matcheo exacto)\n  - Si no existe ningún país mostrar un mensaje adecuado\n- [ ] __POST /activities__:\n  - Recibe los datos recolectados desde el formulario controlado de la ruta de creación de actividad turística por body\n  - Crea una actividad turística en la base de datos, relacionada con los países correspondientes\n\n## Testing\n\n- [ ] Al menos tener un componente del frontend con sus tests respectivos\n- [ ] Al menos tener una ruta del backend con sus tests respectivos\n- [ ] Al menos tener un modelo de la base de datos con sus tests respectivos\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemb93%2Fcountries","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcemb93%2Fcountries","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemb93%2Fcountries/lists"}