- 1. Preámbulo
- 2. Resumen del proyecto
- 3. Objetivos de aprendizaje
- 4. Consideraciones generales
- 5. Criterios de aceptación del proyecto
- 6. Stack de tecnologías
- 7. Pistas, tips y lecturas complementarias
- 8. Funcionalidades opcionales
De acuerdo con Wikipedia, la internet de las cosas (IoT, por sus siglas en inglés) es un concepto que se refiere a una interconexión digital de objetos cotidianos con internet. Constituye un cambio radical en la calidad de vida de las personas en la sociedad, ofreciendo nuevas oportunidades en el acceso a datos, educación, seguridad, asistencia sanitaria y en el transporte, entre otros campos. Por ejemplo, en logística y manejo de flotas, se puede hacer seguimiento en todo momento de la ubicación y las condiciones de vehículos mediante sensores inalámbricos conectados a internet que envían alertas en caso de eventualidades (demoras, daños, robos, etc.).
La IoT también plantea retos como el almacenamiento, análisis y visualización de la gran cantidad de información que genera. Se calcula que para el 2025 los dispositivos IoT generen 79.4 zettabytes (1 zettabyte equivale a 1 trillón de gigabytes). Como desarrolladoras debemos estar al tanto de estos retos y contribuir para su solución desde nuestra experiencia, conocimiento y ganas de aprender.
En este proyecto construirás la API REST de un Fleet Management Software para consultar las ubicaciones de los vehículos de una empresa de taxis en Beijing, China.
Te entregaremos las ubicaciones de casi 10 mil taxis. Esperamos que como desarrolladora explores nuevas alternativas y técnicas para almacenar y consultar esta información y puedas garantizar la mejor experiencia de usuaria en tu API REST.
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.
-
Modificadores de acesso (public, private, protected)
-
Variables
-
Uso de condicionales
-
Uso de bucles (Loops)
-
Primitivos
-
Datos primitivos vs no primitivos
-
Cadenas
-
Arreglos
-
ArrayList
-
HashMap
-
HashSet
-
JUnit
-
Mockito
-
Initializr
-
Spring Boot
-
Controladores
-
Servicios
-
Spring Data JPA
-
Entidad
-
Repositorio
-
Beans
-
Inversión de Control
-
Anotaciones
-
RestController
-
RequestMapping
-
RequestParam
-
Spring Test
-
Hamcrest
-
Configuración
-
Esquema
-
Entidad
-
Tabla
-
Columna
-
Identificadores
-
Asociaciones
-
Colecciones
-
Persistencia
-
Consultas
-
Variables (declaración, asignación, ámbito)
-
Uso de condicionales (if, elif, ternario)
-
Operadores (identidad, aritméticos, comparación etc)
-
Docstrings (y su diferencia de comentarios)
-
Linting (pylint)
-
Serialización (y deserialización)
-
Tipos de datos primitivos (int, float, str, bool)
-
Listas (arrays)
-
Tuples
-
Dictionaries (Dicts)
-
Sets
-
Conceptos basicos (params, args, default values, return)
-
***args y kwargs
-
Cierres (closures)
-
Funciones lambda
-
Decoradores
-
Uso de bucles/ciclos (while, for..in)
-
Comprensión de listas
-
Técnicas funcionales (map, filter, reduce)
-
Pruebas unitarias (unit tests, unittest, pytest)
-
Uso de mocks (y patch)
-
Uso de fixtures
-
Módulos
-
Paquetes
-
pip (instalación y uso de paquetes)
-
Virtual Environment (ambientes virtuales, virtualenv)
-
requirements.txt
-
Decorador de ruta
-
Función de vista
-
Reglas de variables (urls dinamica)
-
Argumentos
-
Headers (cabeceras)
-
Partes de la respuesta (status, body, headers)
-
jsonify
-
Configuración de fixtures
-
Test Client
-
Views
-
Testing
-
queryset
-
Filter
-
Order By
-
URLs (Path, URLconf, urlpatterns)
-
Migraciones
-
Setup app
-
Fields
-
Foreign Key
-
Serializers
-
Pagination
-
Query params
-
ViewSet
-
Apiview
-
Clases
-
Objetos
-
Métodos
-
Atributos
-
Constructores
-
Encapsulamiento
-
Abstracción
-
Composición
-
Interfaces
-
Herencia (super, extends, override)
-
Lenguaje de Modelado Unificado (UML, class diagrams)
-
Instalar y usar módulos con npm
-
Configuración de package.json
-
Configuración de npm-scripts
-
process (env, argv, stdin-stdout-stderr, exit-code)
-
File system (fs, path)
-
Creación y modificación de tablas
-
Operaciones CRUD (Create-Read-Update-Delete)
-
Borrado de tablas o bases de datos enteras con DROP
-
Modelado de datos
-
Conexión
-
Índices y limitaciones
-
Variables
-
Condicionales
-
Bucles/Ciclos
-
Operadores
-
Genéricos
-
Modificadores de Acceso
-
Espacios de Nombres (namespaces)
-
LINQ
-
Async-Await
-
.NET Core
-
Paquetes NuGet
-
Tipos de datos primitivos
-
Tipos de datos no primitivos
-
Estructuras
-
Enumeración
-
Tipos anónimos
-
Tipos dinámicos
-
Listas
-
Arreglos
-
Conjuntos (Sets)
-
Funciones Lambda
-
Decoradores (Atributos)
-
try-catch
-
throw
-
xUnit
-
MSTest
-
Code First
-
Modelos
-
Fluent API
-
Controladores
-
Migraciones
-
Tipos de datos
-
Índices
-
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: Colaboración en Github (branches | forks | pull requests | code review | tags)
-
GitHub: Organización en Github (projects | issues | labels | milestones | releases)
-
Tipos primitivos
-
Arreglos
-
Funciones
-
Tipos Union
-
Interfaces
-
Enums
-
Propiedades opcionales
-
Consulta o petición (request) y respuesta (response).
-
Cabeceras (headers)
-
Cuerpo (body)
-
Verbos HTTP
-
Códigos de status de HTTP
-
Encodings y JSON
-
CORS (Cross-Origin Resource Sharing)
-
JWT (JSON Web Token)
-
Almacenamiento y acceso de contraseñas
- Este proyecto se debe "resolver" en duplas.
- El rango de tiempo estimado para completar el proyecto es de 4 a 6 Sprints.
Nuestra cliente ha instalado dispositivos GPS en sus taxis. Estos dispositivos utilizan señales satelitales para determinar con precisión las coordenadas geográficas del taxi.
Nuestra clienta requiere:
- Cargar la información de archivos SQL a una base de datos Postgresql.
- Desarrollar una API REST que permita consultar, mediante peticiones HTTP, la información almacenada en la base de datos.
El Product Owner nos presenta este backlog que es el resultado de su trabajo con la clienta hasta hoy y la documentación de la API REST a desarrollar.
Yo, como desarrolladora, quiero cargar la información almacenada hasta ahora en archivos sql en una base de datos PostgreSQL, para facilitar su consulta y análisis.
- Se debe tener en cuenta el siguiente diagrama para la implementación de las relaciones entre las tablas
- La tabla de trajectories se debe crear con el "id" que se incremente automáticamente (SERIAL) para poder insertar los valores sin necesidad de especificar un identificador
- La base de datos tiene creada la tabla de taxis
- La tabla de taxis tiene cargada la data de taxis
- La base de datos tiene creada la tabla de trayectorias
- La tabla de taxis tiene cargada la data de trayectorias
Yo como clienta de la API REST requiero un endpoint para listar todos los taxis.
Por ejemplo, este endpoint podria ser usado por una aplicación web para filtrar un listado de taxis.
![Posible uso del endpoint GET /taxus](https://private-user-images.githubusercontent.com/16993732/325602620-c4acb543-a422-4e79-ab6c-53c656a7ee47.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ4NjY5MDEsIm5iZiI6MTcyNDg2NjYwMSwicGF0aCI6Ii8xNjk5MzczMi8zMjU2MDI2MjAtYzRhY2I1NDMtYTQyMi00ZTc5LWFiNmMtNTNjNjU2YTdlZTQ3LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI4VDE3MzY0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgyMzFmNWMyYThmODRjN2JiYmQ4ZDBiZWI2YzhjZjBkNTgzMjk3YTBjYTcyYTY5YTU2NzA2ZWM2MzFjYzc3YjEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.lb1nodvVuOmXsYRWsfDpaiTDi72BnVEUBXgME1Oa9oY)
Animación que muestra un menú desplegable para elegir un taxi. Las opciones se filtran según el text que se escriba en la lista.
- El endpoint es implementado de acuerdo a la documentación swagger. A excepción de la respuesta 401 que sera implementada hasta la Historia de Usuaria 7.
- El endpoint responde con el id y placa del taxi
- El endpoint soporta un parametro query para retornar unicamente los taxis cuya placa contenga el texto especificado
- El endpoint paginamos los resultados para asegurar que las respuestas sean más fáciles de manejar.
- El código del endpoint debe recibir code review de al menos una compañera.
- El código endpoint debe estar cargado en un repositorio de Github.
- El código endpoint debe contar con test unitarios
Yo como clienta de la API REST requiero un endpoint para consultar todas las ubicaciones de un taxi dado el id y una fecha.
Por ejemplo, este endpoint podria ser usado por una aplicación web para mostrar en un mapa la trayectoria de un taxi.
![Posible uso del endpoint GET /trajectories/{taxiId}](https://private-user-images.githubusercontent.com/16993732/325602868-d716cc84-47c2-4cdd-8f67-74128aa6ec01.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ4NjY5MDEsIm5iZiI6MTcyNDg2NjYwMSwicGF0aCI6Ii8xNjk5MzczMi8zMjU2MDI4NjgtZDcxNmNjODQtNDdjMi00Y2RkLThmNjctNzQxMjhhYTZlYzAxLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI4VDE3MzY0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIyNjgyY2ViNjhmNGQ4MmRhODAxZDkwYmZhYTUzMjRmYzljYTc4OTdkZDEzZmMyNzdkNmRhMWEwN2NhMjVkMzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.w5BDwCi-P4vHUz_WZmoLIoV1uIlY3DRDvlEK4hGPW3E)
Animación que muestra en un mapa la trayectoria de un taxi.
- El endpoint es implementado de acuerdo a la documentación swagger A excepción de la respuesta 401 que sera implementada hasta la Historia de Usuaria 7.
- El endpoint responde con el id del taxi y una fecha mostrando la siguiente información: latitud, longitud y timestamp (fecha y hora).
- El código del endpoint debe recibir code review de al menos una compañera.
- El código endpoint debe estar cargado en un repositorio de Github.
- El código endpoint debe contar con test unitarios
Yo como clienta de la API REST requiero un endpoint para consultar la última ubicación reportada por cada taxi.
Por ejemplo, este endpoint podria ser usado por una aplicación web para mostrar en una mapa la última posición de cada taxi.
![Posible uso del endpoint GET /trajectories/latest](https://private-user-images.githubusercontent.com/16993732/325603003-a6bd8631-244d-4d9b-a297-2519d9313855.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ4NjY5MDEsIm5iZiI6MTcyNDg2NjYwMSwicGF0aCI6Ii8xNjk5MzczMi8zMjU2MDMwMDMtYTZiZDg2MzEtMjQ0ZC00ZDliLWEyOTctMjUxOWQ5MzEzODU1LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI4VDE3MzY0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI1OWNiODY5NGU5Y2NiMDlmZWYxYWE0NTgwZmE2NWM1YTAyOGQ5NDBhMDgwMjFiZWRlOTY2NjJhYmQ2NDAwNTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.9TdPgyYVUl-GGq5oF5VuGLVfdX-adK9IDOzGsCxt2gQ)
Animación que un listado de taxis y al hacer clic en cada uno muestra un mapa la última posición de un taxi.
- El endpoint es implementado de acuerdo a la documentación swagger a excepción de las respuestas 401 que sera implementada hasta la Historia de Usuaria 7.
- El endpoint responde para cada taxi la siguiente información: id, placa, latitud, longitud y timestamp (fecha y hora).
- El código del endpoint debe recibir code review de al menos una compañera.
- El código endpoint debe estar cargado en un repositorio de Github.
- El código endpoint debe contar con test unitarios
Puedes implementar este proyecto en JavaScript, Python o Java.
Te proponemos los siguientes pasos para iniciar con el proyecto
En primer lugar, asegurate de comprender qué es una API REST. Para esto puedes consultar en internet o preguntarle a ChatGpt. Habla con una coach en tu proximo Office Hours para confirmar tus aprendizajes. En particular, te recomendamos ver leer este artículo.
La base de datos recomendada para tu aplicación es PostgreSQL. Te recomendamos usar vercel Postgresql para que no tengas que instalar PostgreSQL en tu computadora.
Para crear una base de datos postgresql en Vercel usa la documentación oficial. Identifica la siguiente información porque la necesitarás para conectarte a tu base de datos
- POSTGRES_USER
- POSTGRES_HOST
- POSTGRES_PASSWORD
- POSTGRES_DATABASE
Una vez hayas creado una instancia de PostgreSQL en Vercel, deberás conectarte a ella. Te recomendamos que instales pgAdmin, un GUI (Graphical User Interface) para interactuar con la base de datos.
Con pgAdmin intenta conectarte a la base de datos usando la información suministrada por vercel.
En este punto, ya puedes trabajar en la Historia de Usuaria 1. Deberás crear las tablas en tu base de datos y cargar la información solicitada. Puedes crear una tabla usando la interfaz gráfica de pgAdmin o en usando SQL.
Ya es hora de escribir código. Tu primer objetivo es crear un proyecto que al ejecutarse cree un servidor HTTP que responda a la petición GET /taxis con un "hola mundo".
Te recomendamos usar Postman para confirmar que el endpoint que desarrolles responda segun lo solicitado.
El procedimiento recomendado dependerá del lenguaje de programación que hayas elegido:
- Si estás usando NodeJS, puedes seguir este tutorial para crear un servidor HTTP con express y TypeScript
- Si estás usando Python, puedes el tutorial Minimal Application de la documentación oficial de Flask
- Si estás usando Java, puedes seguir este video de Primer Endpoint con Java
Luego vas a necesitar elegir un módulo o librería para interactuar con nuestra base de datos desde el lenguaje de desarrollo elegido.
La librería recomendada dependerá del lenguaje de programación que hayas elegido:
- Si estás usando NodeJS, puedes instalar y configurar Prisma.
- Si estás usando Python, puedes instalar y configurar SqlAlchemy
- Si estás usando Java, puedes instalar y configurar Hibernate
Utiliza la librería elegida para consultar la base de datos y que tu API responda a la petición GET /taxis con el listado de taxis tal como se especifica en la documentación.
De nuevo, usa Postman para confirmar que el endpoint que desarrolles responda segun lo solicitado.
De acuerdo a la documentación el endpoint GET /taxis soporta 3 parametros: query, page y limit.
Modifica tu código para soportar peticiones a tu endpoint con estos parámetros. Usa Postman para probar tu endpoint con diferentes valores de estos parámetros.
Elige un módulo o librería para escribir pruebas e2e de tu endpoint.
La librería recomendada dependerá del lenguaje de programación que hayas elegido:
- Si estás usando NodeJS, puedes instalar y configurar supertest
- Si estás usando Python, puedes instalar y configurar pytest
- Si estás usando Java, puede instalar y configurar
¡Felicitaciones! Hasta este punto ya has completado la Historia de Usuaria 2. Puedes continuar implementado las demás historias.
Si completaste todas las funcionalidades del proyecto te invitamos a trabajar en las funcionalides opcionales