Devuelve el clima de la ciudad que elijas, con datos climáticos al azar, pero con coordenadas correctas, para ser utilizadas en un mapa.
Obtiene los datos de las ciudades desde un dataset que cree en un shard de MongoDB atlas importando cities.json
Tiene dos tipos de autorización, una por jsonwebtokens, que la uso para proteger todos los endpoints del sistema de usuarios, y apikeys, que son keys generadas usando la librería uuid, y almacenadas en otra colección de mongo, esas keys son usadas para proteger el endpoint principal, y los usuarios pueden generarlas, obtenerlas y revocarlas (solamente las que les pertenecen)
Frontend de Sistema de usuarios del challenge
- Recomiendo hacerlo ya que es una forma mas fácil de entender cómo funciona.
- Por ahora no pide validación de mail, así que es un proceso rápido.
- Si querés ver el código fuente, está en este repo.
https://node-weather-challenge.herokuapp.com/
- express
Librería para crear un servidor con rutas y middlewares.
- express-validator
Middleware para validar datos entrantes.
- express-jwt
Middleware para validar jsonwebtokens.
- cors
Middleware que usé para agregar el header Access-Control-Allow-Origin : *
.
- dotenv
Librería que carga variables de entorno en el proceso de node (MONGO_URI y JWT_SECRET), son necesarias para el correcto funcionamiento de esta app, para setearlas crear un .env
siguiendo los contenidos del .env.example
cómo ejemplo.
- mongoose
Interfaz de Mongodb para Nodejs.
- bcrypt
Librería que uso para encriptar las contraseñas antes de almacenarlas, y para compararlas en el login.
- uuid
Librería que uso para generar llaves unicas que sirven de api keys
.
- typescript (con @types para todas las librerías que usé)
Compilador de typescript, que aparte de compilar typescript me permite usar imports/exports de es6 en vez de require().
- ts-node
Interpreta typescript sin tener que compilar.
- nodemon
Observa cambios en los archivos y de haberlos reinicia el servidor, para desarrollar de forma fluída.
- prettier
Formatea el código de forma automática.
- tslint
Me da advertencias para seguir buenas prácticas al programar.
- husky
Me sirve para hacer hooks que se ejecutan antes de hacer commits, lo usé para ejecutar prettier antes de hacer commit a git.
index.ts
es la raíz de la app, desde ahí conecto la base de datos importada desde connectDB.ts
, y ejecuto el servidor de express importado desde app.ts
.
El servidor de express importa todas sus rutas desde /routes
, en donde tengo un router que se encarga de importar las rutas de cada entidad por separado (apiKeys, users y weather).
Las rutas utilizan funciones importadas desde la carpeta /services
, ahí es donde escribo todas las interacciones con la base de datos usando los modelos de mongoose de la carpeta models
.
En /helpers
es donde guardo los errores que tiro usando throw
desde cualquier parte del flujo de la aplicación, que son atrapados con un catch
al final de la cadena de middlewares de express, y enviados como json.
/helpers/weatherDescriptionsList.ts
tiene un par de descripciones climáticas para ser importadas al azar en /helpers/weatherHelpers.ts
, dan un texto descriptivo y un código de ícono de openweather.
/helpers/weatherHelpers.ts
es en donde genero los datos climáticos y les doy la estructura de la api de openweather.
/middleware/checkApiKey
es un middleware propio que verifica que la apikey que mandaste esté en la base de datos para determinar si estas autorizado para usar la api
Tiene un solo endpoint, devuelve los datos climáticos de la ciudad que elijas.
- appid es un api key, no un jwt.
Rutas CRUD para la entidad de usuarios, con login agregado.
- Devuelve un token que es necesario para usar el resto de los endpoints de usuarios y apikeys.
-
Request (application/json)
-
Body
{ "email": "email", "password": "string", }
-
- Crea un usuario.
-
Request (application/json)
-
Body
{ "email": "email", "password": "string", }
-
- Cambiar contraseña, la identidad del usuario a modificar es obtenida desde el token.
-
Request (application/json)
-
Headers
Authorization: Bearer {token}
-
Body
{ "password": "string", }
-
- Obtener los datos de un usuario en específico, la id del parámetro y la del token deben coincidir.
-
Request (application/json)
-
Headers
Authorization: Bearer {token}
-
Rutas que se encargan de la manipulación de las keys de los usuarios.
- Genera una key vinculada al usuario del token, y la retorna.
-
Request (application/json)
-
Headers
Authorization: Bearer {token}
-
- Retorna todas las keys del usuario dentro del token.
-
Request (application/json)
-
Headers
Authorization: Bearer {token}
-
- Elimina la key pasada por parámetros, solamente el usuario que es dueño de la key está autorizado a hacerlo.
-
Request (application/json)
-
Headers
Authorization: Bearer {token}
-