La manera en que vemos películas ha cambiado radicalmente durante los últimos años debido, en parte, a la aparición de los servicios de streaming que nos permiten hacerlo desde donde estemos y en cualquier momento. El mejor reflejo de este fenómeno es el éxito de Netflix, HBO y Disney+, etc.
Creemos que hay una gran oportunidad de proponer productos/experiencias innovadoras de todo tipo utilizando datos de películas (directorxs, actorxs, sagas, secuelas, fechas, etc.). Podríamos pensar en juegos, comunidades, catálogos, recomendaciones basadas en gustos personales, etc. (sólo por mencionar algunas ideas obvias).
En este proyecto, crearás una página web destinada a visualizar, filtrar y ordenar el catálogo de películas de The Movie Database API V3. Esta página puede servir como un catálogo de películas general, pero también, si te animas, puedes considerar la posibilidad de diseñarla para un público y usuarias específicas con preferencias como "películas western" o "películas de las 80's" por ejemplo.
Para implementar este proyecto deberás elegir un framework entre React y Angular. Al elegir un framework o librería para nuestra interfaz, nos apoyamos en una serie de convenciones e implementaciones probadas y documentadas para resolver un problema común a toda interfaz web: mantener la interfaz sincronizada con el estado. Esto nos permite concentrarnos mejor (dedicar más tiempo) en las características específicas de nuestra aplicación.
Cuando elegimos una de estas tecnologías no solo importamos un pedacito de código para reusarlo (lo cuál es un gran valor per se), si no que adoptamos una arquitectura, una serie de principios de diseño, un paradigma, unas abstracciones, un vocabulario, una comunidad, etc...
Como desarrolladora Front-end, estos kits de desarrollo pueden resultarte de gran ayuda para implementar rápidamente características de los proyectos en los que trabajes.
Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo.
[ ] Uso de HTML semántico
* [HTML semántico](https://curriculum.laboratoria.la/es/topics/html/html5/semantic-html) * [Semantics - MDN Web Docs Glossary](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML)
[ ] Uso de selectores de CSS
* [Intro a CSS](https://curriculum.laboratoria.la/es/topics/css/css/intro-css) * [CSS Selectors - MDN](https://developer.mozilla.org/es/docs/Web/CSS/CSS_Selectors)
[ ] Modelo de caja (box model): borde, margen, padding
* [Box Model & Display](https://curriculum.laboratoria.la/es/topics/css/css/boxmodel-and-display) * [The box model - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model) * [Introduction to the CSS box model - MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model) * [CSS display - MDN](https://developer.mozilla.org/pt-BR/docs/Web/CSS/display) * [display - CSS Tricks](https://css-tricks.com/almanac/properties/d/display/)
[ ] Uso de flexbox en CSS
* [A Complete Guide to Flexbox - CSS Tricks](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) * [Flexbox Froggy](https://flexboxfroggy.com/#es) * [Flexbox - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox)
[ ] Uso de CSS Grid Layout
* [A Complete Guide to Grid - CSS Tricks](https://css-tricks.com/snippets/css/complete-guide-grid/) * [Grids - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids)
[ ] Uso de media queries
* [CSS media queries - MDN](https://developer.mozilla.org/es/docs/CSS/Media_queries)
[ ] Uso de linter (ESLINT)
[ ] Uso de identificadores descriptivos (Nomenclatura y Semántica)
[ ] Pruebas unitarias (unit tests)
* [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started)
[ ] Pruebas asíncronas
* [Tests de código asincrónico con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/asynchronous)
[ ] Uso de mocks y espías
* [Manual Mocks con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/manual-mocks)
[ ] Módulos de ECMAScript (ES Modules)
* [import - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/import) * [export - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/export)
[ ] Git: Instalación y configuración
[ ] Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)
[ ] Git: Integración de cambios entre ramas (branch, checkout, fetch, merge, reset, rebase, tag)
[ ] GitHub: Creación de cuenta y repos, configuración de llaves SSH
[ ] GitHub: Despliegue con GitHub Pages
* [Sitio oficial de GitHub Pages](https://pages.github.com/)
[ ] GitHub: Colaboración en Github (branches | forks | pull requests | code review | tags)
[ ] GitHub: Organización en Github (projects | issues | labels | milestones | releases)
[ ] Consulta o petición (request) y respuesta (response).
* [Generalidades del protocolo HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Overview) * [Mensajes HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Messages)
[ ] Cabeceras (headers)
* [HTTP headers - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Headers)
[ ] Cuerpo (body)
* [Cuerpo de Mensajes HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Messages#cuerpo)
[ ] Verbos HTTP
* [Métodos de petición HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Methods)
[ ] Códigos de status de HTTP
* [Códigos de estado de respuesta HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Status) * [The Complete Guide to Status Codes for Meaningful ReST APIs - dev.to](https://dev.to/khaosdoctor/the-complete-guide-to-status-codes-for-meaningful-rest-apis-1-5c5)
[ ] Encodings y JSON
* [Introducción a JSON - Documentación oficial](https://www.json.org/json-es.html)
[ ] CORS (Cross-Origin Resource Sharing)
* [Control de acceso HTTP (CORS) - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/CORS)
[ ] Components & templates
* [Angular Components Overview - Documentación oficial (en inglés)](https://angular.io/guide/component-overview) * [Introduction to components and templates - Documentación oficial (en inglés)](https://angular.io/guide/architecture-components#introduction-to-components)
[ ] Directivas estructurales (ngIf / ngFor)
* [Writing structural directives - Documentación oficial (en inglés)](https://angular.io/guide/structural-directives)
[ ] @Input | @Output
* [Component interaction - Documentación oficial (en inglés)](https://angular.io/guide/component-interaction#component-interaction)
[ ] Creación y uso de servicios
* [Providing services - Documentación oficial (en inglés)](https://angular.io/guide/architecture-services#providing-services)
[ ] Manejo de rutas
* [In-app navigation: routing to views - Documentación oficial (en inglés)](https://angular.io/guide/router)
[ ] Creación y uso de Observables.
* [Observables in Angular - Documentación oficial (en inglés)](https://angular.io/guide/observables-in-angular)
[ ] Uso de HttpClient
* [Communicating with backend services using HTTP - Documentación oficial (en inglés)](https://angular.io/guide/http)
[ ] Estilos de componentes (ngStyle / ngClass)
* [Template syntax - Documentación oficial (en inglés)](https://angular.io/guide/template-syntax#built-in-directives)
[ ] JSX
* [Presentando JSX - Documentación oficial](https://es.react.dev/learn/writing-markup-with-jsx)
[ ] Componentes y propiedades (props)
* [Componentes y propiedades - Documentación oficial](https://es.react.dev/learn/passing-props-to-a-component)
[ ] Manejo de eventos
* [Manejando eventos - Documentación oficial](https://es.react.dev/learn/responding-to-events)
[ ] Listas y keys
* [Listas y keys - Documentación oficial](https://es.react.dev/learn/rendering-lists)
[ ] Renderizado condicional
* [Renderizado condicional - Documentación oficial](https://es.react.dev/learn/conditional-rendering)
[ ] Elevación de estado
* [Levantando el estado - Documentación oficial](https://es.react.dev/learn/sharing-state-between-components)
[ ] Hooks
* [Presentando Hooks - Documentación oficial](https://es.react.dev/reference/react)
[ ] CSS modules
* [Adding a CSS Modules Stylesheet - Documentación de Create React App (en inglés)](https://vitejs.dev/guide/features.html#css-modules)
[ ] React Router
* [Quick Start - Documentación oficial (en inglés)](https://reactrouter.com/en/main/start/tutorial)
[ ] Instancia de Vue.js
* [La instancia Vue - Documentación oficial](https://es.vuejs.org/v2/guide/instance.html)
[ ] Datos y métodos
* [Datos y Métodos - Documentación oficial](https://es.vuejs.org/v2/guide/instance.html#Datos-y-Metodos)
[ ] Uso y creación de componentes
* [Conceptos Básicos de Componentes - Documentación oficial](https://es.vuejs.org/v2/guide/components.html)
[ ] Props
* [Pasando datos a componentes secundarios con Props - Documentación oficial](https://es.vuejs.org/v2/guide/components.html#Pasando-datos-a-componentes-secundarios-con-Props)
[ ] Directivas (v-bind | v-model)
* [v-bind - Documentación oficial](https://es.vuejs.org/v2/api/#v-bind) * [Binding en Formularios - Documentación oficial](https://es.vuejs.org/v2/guide/forms.html)
[ ] Iteración (v-for)
* [Mapeando una matriz a elementos con v-for - Documentación oficial](https://es.vuejs.org/v2/guide/list.html#Mapeando-una-matriz-a-elementos-con-v-for)
[ ] Eventos (v-on)
* [Manejo de eventos - Documentación oficial](https://es.vuejs.org/v2/guide/events.html)
[ ] Propiedades Computadas y Observadores
* [Propiedades Computadas y Observadores](https://es.vuejs.org/v2/guide/computed.html)
[ ] Routing
* [Getting Started - Documentación oficial de Vue Router](https://router.vuejs.org/guide/#html)
[ ] Clases y Estilos
* [Enlace Clases y Estilos - Documentación oficial](https://es.vuejs.org/v2/guide/class-and-style.html)
[ ] Narrowing
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
[ ] Decoradores
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/decorators.html)
[ ] Chequeo estático de tipos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/basic-types.html#static-type-checking)
[ ] Rigurosidad
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/basic-types.html#strictness) * [Documentación oficial de Typescript](https://www.typescriptlang.org/tsconfig#Type_Checking_6248)
[ ] Tipos primitivos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#the-primitives-string-number-and-boolean)
[ ] Arreglos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#arrays)
[ ] Tipo any
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#any)
[ ] Funciones
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#functions) * [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/functions.html)
[ ] Tipos Union
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types)
[ ] Alias de tipos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-aliases)
[ ] Interfaces
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#interfaces)
[ ] Type assertions
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions)
[ ] Tipos literales
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types)
[ ] null y undefined
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#null-and-undefined)
[ ] Enums
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums)
[ ] Propiedades opcionales
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#optional-properties)
[ ] Visibilidad de miembros de clase (public, protected, private)
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#member-visibility)
[ ] Miembros de clase estáticos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#static-members)
[ ] this
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#this-at-runtime-in-classes)
[ ] Clases abstractas
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#abstract-classes-and-members)
[ ] Campos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#fields)
[ ] Constructors
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#constructors)
[ ] Métodos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#methods)
[ ] Getters y Setters
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#getters--setters)
[ ] implements Clausas
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#implements-clauses)
[ ] extends Clausas
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#extends-clauses)
[ ] Crear prototipos de alta fidelidad que incluyan interacciones
[ ] Seguir los principios básicos de diseño visual
Este proyecto se debe "resolver" de manera individual.
Los tests unitarios deben cubrir un mínimo del 70% de statements, functions, lines y branches.
El rango de tiempo estimado para completar el proyecto es de 3 a 4 Sprints.
Para implementar este proyecto te recomendamos usar la planificación sugerida que se encuentra en el repo movie-challenge-planner el cual provee un CLI para hacer fork del presente repositorio y crear un GitHub Project con el milestone e issues de cada historia de usuaria.
La aplicación debe ser un Single Page App.
La aplicación no debe ser responsive.
Para poder usar la API de The Movie Database API V3 deberás crear una cuenta, luego una llave (key) de acceso y usarla en cada petición que hagas al servidor. Recuerda que tienes un máximo de 1.000 peticiones diarias a la APIs por cada IP, creemos que es suficiente, pero te recomendamos hacer un uso responsable de este recurso gratuito.
Uno de los mayores objetivos de este proyecto es aprender a usar una librería o framework popular para desarrollar una web app. Debes elegir entre React o Angular.
Si usas Angular o React, tienes la obligación de usar TypeScript. Typescript es un lenguaje de programación fuertemente tipado basado en javascript.
Si usas Angular, te recomendamos usar la versión 14. Para esto es necesario que tengas instalada la version 12 de NodeJS. Puedes encontrar una guia de instalación acá o consultar con tus coaches.
La aplicación debe hacer uso de npm-scripts
y contar con scripts start
,
test
, build
y deploy
, que se encarguen de arrancar, correr las pruebas,
empaquetar y desplegar la aplicación respectivamente.
El Product Owner nos entrega una primera iteración del prototipo de baja fidelidad de la aplicación en esta imagen y esta otra.
El Product Owner nos presenta este backlog que es el resultado de su trabajo con el clientx hasta hoy.
Al iniciar un proyecto siempre hay una serie de tareas a las que debemos dedicar tiempo.
[ ] Es posible ejecutar el proyecto y que nuestro navegador muestre la aplicación por defecto.
[ ] Es posible ejecutar el linter y los tests unitarios.
[ ] No es posible hacer un push directo a la rama principal
[ ] Existe un Figma con los diseños de alta fidelidad
[ ] La aplicación esta desplegada correctamente y se proporciona una URL pública.
Como usuario, quiero visualizar el catálogo de películas en filas y columnas.
Como usuario, quiero navegar por el catálogo de las películas dividido en páginas.
Como usuario, quiero poder filtrar las películas por género y ordenarlas por año en orden ascendente y descendente.
[ ] El usuario debe poder filtrar el catálogo por género.
[ ] El usuario debe poder eliminar el filtro para ver películas sin filtrar
[ ] El usuario debe poder ordenar de forma ascendente el catálogo por año.
[ ] El usuario debe poder ordenar el catálogo de forma descendente por año.
[ ] El usuario debe poder eliminar la clasificación para ver las películas sin ordenar
Como usuario, quiero poder ver información detallada sobre una película, para poder tomar decisiones informadas sobre si verla o no.
[ ] Los usuarios pueden navegar a la página de detalles de la película desde la lista de películas o cualquier sección relevante.
[ ] Los detalles de la película se muestran de forma destacada, proporcionando información completa sobre la película seleccionada.
[ ] Los usuarios pueden volver fácilmente a la página anterior.
Puedes elegir el proveedor (o proveedores) que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. Te recomendamos explorar las siguientes opciones:
Para implementar este proyecto te recomendamos usar la planificación sugerida que se encuentra en el repo movie-challenge-planner, el cual provee un CLI que te ayudará a forkear el presente repositorio y crear un GitHub Project con el milestone e issues de cada historia de usuaria.
El rango de tiempo estimado para completar el proyecto es de 3 a 4 Sprints. Te sugerimos organizarte de la siguiente manera:
Antes de agendar tu Project Feedback con un coach, asegúrate que tu proyecto:
Recuerda que debes hacer una autoevaluación de objetivos de aprendizaje y life skills desde tu dashboard de estudiante.
Si no has completado todo lo anterior, no consideramos que estás lista para tu sesión de Project Feedback.
Súmate al canal de Slack #project-movie-challenge-fw para conversar y pedir ayuda del proyecto.
Tomando como base el prototipo de baja fidelidad entregado, crea uno de alta fidelidad en Figma. Define una paleta de colores y un diseño grafico. Procura que esto te tome entre 1 o 2 días.
Explora la documentación de The Movie Database API. Inicia leyendo la sección Getting Started, luego AUTHENTICATION --> Application y finalmente las referencias de endpoints /discover/movie y /movie/{movie_id}.
Luego crear una cuenta y genera una llave (key) de acceso para consumir la API.
Finalmente, realiza peticiones HTTP de prueba a la API usando herramientas como Postman o REST Client. Identifica los headers, body, verbos, códigos de respuesta y encodings las peticiones.
La comunidad de desarrolladoras de cada framework se ha forzado mucho por crear documentaciones amigables para quienes inician con cada tecnología. Por lo tanto, date la oportunidad de explorar la documentación y probar sus ejemplos y tutoriales.
Toma la primera vista de prototipo de alta e implementala. Te sugerimos seguir los siguientes pasos independiente del framework que uses: