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 Initializr](https://start.spring.io/)
[ ] Spring Boot
* [Spring Boot Reference Documentation](https://docs.spring.io/spring-boot/docs/current/reference/html/)
[ ] Controladores
[ ] Servicios
[ ] Spring Data JPA
* [Spring Data JPA - Reference Documentation](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/)
[ ] 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)
* [Variables in Python – Real Python (en inglés)](https://realpython.com/python-variables/) * [Variables in Python - GeeksforGeeks (en inglés)](https://www.geeksforgeeks.org/python-variables/)
[ ] Uso de condicionales (if, elif, ternario)
* [Conditional Statements in Python – Real Python (en inglés)](https://realpython.com/python-conditional-statements/)
[ ] Operadores (identidad, aritméticos, comparación etc)
* [Python Operators - GeeksforGeeks (en inglés)](https://www.geeksforgeeks.org/python-operators/)
[ ] Docstrings (y su diferencia de comentarios)
* [Docstrings - Python Docs (en inglés)](https://docs.python.org/3/tutorial/controlflow.html#documentation-strings)
[ ] Linting (pylint)
* [Pylint - Documentación oficial](https://pylint.pycqa.org/en/latest/) * [Linting Python in Visual Studio Code - Visual Studio Code Docs (en inglés)](https://code.visualstudio.com/docs/python/linting)
[ ] Serialización (y deserialización)
* [Serialize Your Data With Python – Real Python (en inglés)](https://realpython.com/python-serialize-data/)
[ ] Tipos de datos primitivos (int, float, str, bool)
* [Data Types - Python Docs (en inglés)](https://docs.python.org/3/library/datatypes.html) * [Data types in Python (en inglés)](https://www.educative.io/answers/data-types-in-python)
[ ] Listas (arrays)
* [Lists - Python Docs (en inglés)](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists) * [Lists and Tuples in Python - Real Python (en inglés)](https://realpython.com/python-lists-tuples/)
[ ] Tuples
* [Tuples - Python Docs (en inglés)](https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences) * [Lists and Tuples in Python - Real Python (en inglés)](https://realpython.com/python-lists-tuples/)
[ ] Dictionaries (Dicts)
* [Dictionaries - Python Docs (en inglés)](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) * [Dictionaries in Python - Real Python (en inglés)](https://realpython.com/python-dicts/)
[ ] Sets
* [Sets - Python Docs (en inglés)](https://docs.python.org/3/tutorial/datastructures.html#sets) * [Sets in Python - Real Python (en inglés)](https://realpython.com/python-sets/)
[ ] Conceptos basicos (params, args, default values, return)
* [Python Functions - GeeksforGeeks (en ingles)](https://www.geeksforgeeks.org/python-functions/)
[ ] *args y kwargs**
* [*args and **kwargs in Python - GeeksforGeeks (en inglés)](https://www.geeksforgeeks.org/args-kwargs-python/)
[ ] Cierres (closures)
* [Closures - Python Docs (en inglés)](https://docs.python.org/3/reference/datamodel.html#emulating-closures-and-nested-scope)
[ ] Funciones lambda
* [Lambda Functions - Python Docs (en inglés)](https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions) * [How to Use Python Lambda Functions – Real Python (en inglés)](https://realpython.com/python-lambda/)
[ ] Decoradores
* [Decorators - Python Docs (en inglés)](https://docs.python.org/3/glossary.html#term-decorator) * [Decorators in Python - Geeks for Geeks (en inglés)](https://www.geeksforgeeks.org/decorators-in-python/)
[ ] Uso de bucles/ciclos (while, for..in)
* [Loops in Python - For, While and Nested Loops - GeeksforGeeks](https://www.geeksforgeeks.org/loops-in-python/) * [Loops - Learn Python - Free Interactive Python Tutorial](https://www.learnpython.org/en/Loops)
[ ] Comprensión de listas
* [List Comprehension - Python Docs (en inglés)](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) * [List Comprehension in Python - GeeksforGeeks (en inglés)](https://www.geeksforgeeks.org/list-comprehensions-in-python/) * [When to Use a List Comprehension in Python – Real Python (en inglés)](https://realpython.com/list-comprehension-python/)
[ ] Técnicas funcionales (map, filter, reduce)
* [Our Guide to Map, Filter, and Reduce Functions in Python - Udacity (en inglés)](https://www.udacity.com/blog/2020/12/our-guide-to-map-filter-and-reduce-functions-in-python.html) * [Map, Filter, Reduce - Learn Python - Free Interactive Python Tutorial (en inglés)](https://www.learnpython.org/en/Map%2C_Filter%2C_Reduce)
[ ] Pruebas unitarias (unit tests, unittest, pytest)
* [unittest - Python Docs (en inglés)](https://docs.python.org/3/library/unittest.html) * [pytest - Documentación oficial](https://docs.pytest.org/en/6.2.x/)
[ ] Uso de mocks (y patch)
* [unittest.mock - Python Docs (en inglés)](https://docs.python.org/3/library/unittest.mock.html) * [Python Mock Library - Real Python (en inglés)](https://realpython.com/python-mock-library/)
[ ] Uso de fixtures
* [pytest fixtures - Documentación oficial](https://docs.pytest.org/en/6.2.x/fixture.html)
[ ] Módulos
* [Módulos - Python Docs (en inglés)](https://docs.python.org/3/tutorial/modules.html)
[ ] Paquetes
* [Paquetes - Python Docs (en inglés)](https://docs.python.org/3/tutorial/modules.html#packages)
[ ] pip (instalación y uso de paquetes)
* [pip - Python Docs (en inglés)](https://docs.python.org/3/installing/index.html)
[ ] Virtual Environment (ambientes virtuales, virtualenv)
* [venv — Creation of virtual environments — Python 3.12.2 documentation (en inglés)](https://docs.python.org/3/library/venv.html) * [Python Virtual Environments: A Primer – Real Python (en inglés)](https://realpython.com/python-virtual-environments-a-primer/)
[ ] requirements.txt
* [requirements.txt - Documentación oficial](https://pip.pypa.io/en/stable/user_guide/#requirements-files)
[ ] Decorador de ruta
* [Routing - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/quickstart/#routing)
[ ] Función de vista
* [View Functions - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/quickstart/#view-functions)
[ ] Reglas de variables (urls dinamica)
* [Variable Rules - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/quickstart/#variable-rules)
[ ] Argumentos
* [Request - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/quickstart/#accessing-request-data)
[ ] Headers (cabeceras)
* [Request - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/quickstart/#accessing-request-data)
[ ] Partes de la respuesta (status, body, headers)
* [Response - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/quickstart/#about-responses)
[ ] jsonify
* [jsonify - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/api/#flask.json.jsonify)
[ ] Configuración de fixtures
* [Testing - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/testing/#fixtures)
[ ] Test Client
* [Testing - Flask Docs (en inglés)](https://flask.palletsprojects.com/en/3.0.x/testing/#sending-requests-with-the-test-client)
[ ] Views
* [Base views](https://docs.djangoproject.com/en/5.0/ref/class-based-views/base/)
[ ] Testing
* [Testing in Django](https://docs.djangoproject.com/en/5.0/topics/testing/) * [Testing rest framework](https://www.django-rest-framework.org/api-guide/testing/#testing)
[ ] queryset
* [The queryset argument](https://www.django-rest-framework.org/api-guide/relations/#the-queryset-argument)
[ ] Filter
* [Filtering](https://www.django-rest-framework.org/api-guide/filtering/)
[ ] Order By
* [OrderingFilter](https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter)
[ ] URLs (Path, URLconf, urlpatterns)
* [Django URLs](https://tutorial.djangogirls.org/en/django_urls/) * [URL dispatcher](https://docs.djangoproject.com/en/5.0/topics/http/urls/)
[ ] Migraciones
* [Migraciones](https://docs.djangoproject.com/es/5.0/topics/migrations/#module-django.db.migrations)
[ ] Setup app
* [Installed apps](https://docs.djangoproject.com/es/5.0/ref/settings/#std-setting-INSTALLED_APPS)
[ ] Fields
* [Field types](https://docs.djangoproject.com/en/5.0/topics/db/models/#Fields)
[ ] Foreign Key
* [Model field reference](https://docs.djangoproject.com/en/5.0/ref/models/fields/)
[ ] Serializers
* [Serializers](https://www.django-rest-framework.org/community/third-party-packages/#serializers)
[ ] Pagination
* [Pagination](https://www.django-rest-framework.org/api-guide/pagination/#pagination)
[ ] Query params
* [query_params](https://www.django-rest-framework.org/api-guide/requests/#query_params)
[ ] ViewSet
* [ViewSet](https://www.django-rest-framework.org/api-guide/viewsets/#viewset)
[ ] Apiview
* [GenericAPIView](https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview)
[ ] 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
* [Sitio oficial de npm (en inglés)](https://www.npmjs.com/)
[ ] Configuración de package.json
* [package.json - Documentación oficial (en inglés)](https://docs.npmjs.com/files/package.json)
[ ] Configuración de npm-scripts
* [scripts - Documentación oficial (en inglés)](https://docs.npmjs.com/misc/scripts)
[ ] process (env, argv, stdin-stdout-stderr, exit-code)
* [Process - Documentación oficial (en inglés)](https://nodejs.org/api/process.html)
[ ] File system (fs, path)
* [File system - Documentación oficial (en inglés)](https://nodejs.org/api/fs.html) * [Path - Documentación oficial (en inglés)](https://nodejs.org/api/path.html)
[ ] Creación y modificación de tablas
* [SQL CREATE TABLE Statement - w3schools (en inglés)](https://www.w3schools.com/sql/sql_create_table.asp) * [CREATE TABLE Statement - PostgreSQL Docs (en inglés)](https://www.postgresql.org/docs/9.1/sql-createtable.html) * [ALTER TABLE Statement - PostgreSQL Docs (en inglés)](https://www.postgresql.org/docs/9.1/sql-altertable.html)
[ ] Operaciones CRUD (Create-Read-Update-Delete)
* [INSERT](https://www.postgresql.org/docs/9.5/sql-insert.html) * [SELECT](https://www.postgresql.org/docs/9.5/sql-select.html) * [UPDATE](https://www.postgresql.org/docs/9.1/sql-update.html) * [DELETE](https://www.postgresql.org/docs/8.1/sql-delete.html)
[ ] Borrado de tablas o bases de datos enteras con DROP
* [DROP TABLE](https://www.postgresql.org/docs/8.2/sql-droptable.html) * [DROP DATABASE](https://www.postgresql.org/docs/8.2/sql-dropdatabase.html)
[ ] Modelado de datos
[ ] Conexión
[ ] Índices y limitaciones
[ ] Tipos de datos
* [Chapter 8. Data Types - Docs (en inglés)](https://www.postgresql.org/docs/14/datatype.html)
[ ] Índices
* [Chapter 11. Indexes - Docs (en inglés)](https://www.postgresql.org/docs/14/indexes.html)
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:
El Product Owner nos presenta este backlog que es el resultado de su trabajo con la clienta hasta hoy.
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.
Yo como clienta de la API REST requiero un endpoint para listar todos los taxis.
Yo como clienta de la API REST requiero un endpoint para consultar todas las ubicaciones de un taxi dado el id y una fecha.
Yo como clienta de la API REST requiero un endpoint para consultar la última ubicación reportada por cada taxi.
Puedes implementar este proyecto en JavaScript, Python o Java.
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.
Una vez tengas acceso a una instancia de PostgreSQL, deberás crear tablas en tu base de datos para almacenar la información entregada. Te recomendamos entonces crear dos tablas, una para almacenar la información de taxis y otra para almacenar la información de ubicaciones. Deberás definir las columnas de cada tabla de acuerdo a la información entregada.
Puedes crear una tabla en PostgreSQL usando SQL.
Deberás definir y documentar los endpoints de tu API. Debes usar Swagger para esto.
Para una API REST debes definir para cada endpoint entre otras cosas el método HTTP, url, parámetros, encabezados, códigos HTTP de respuesta y cuerpo.
Por ejemplo, en la siguiente figura se define un endpoint para consultar la
información de los taxis en la aplicación. El método del endpoint es GET,
la url es /taxis. Recibe un parámetro query, retorna la información con
código HTTP 200 en formato json gracias al header
Content-type
con valor application/json
.
Si completaste todas las funcionalidades del proyecto te invitamos a trabajar en las funcionalides opcionales