ghnoob / movies-api Goto Github PK
View Code? Open in Web Editor NEWREST API made for Alkemy's Node.js Backend Challenge
License: GNU General Public License v3.0
REST API made for Alkemy's Node.js Backend Challenge
License: GNU General Public License v3.0
Check that services are using db
Devolverá todos los campos de la película o serie junto a los personajes asociados a la misma
Cuando se hace un request, por ejemplo, GET /characters?age=text
, con query param un string no numérico, devuelve todos los registros cuando no tendría que devolver ninguno.
curl -X 'GET' \
'http://localhost:5500/characters?limit=1&age=test' \
-H 'accept: application/json'
{
"data": [
{
"id": 1,
"name": "Snow White",
"imageUrl": "https://static.wikia.nocookie.net/disney/images/3/33/Profile_-_Snow_White.jpeg/revision/latest/scale-to-width-down/782?cb=20200916135241"
}
],
"totalPages": 5,
"total": 5,
"next": "/characters?limit=1&page=2"
}
Tambíen, cuando se pasa un string vacio, tanto en la forma directa como la de objeto, la propiedad evalúa a 0
en el dto. Por ejemplo, si se hace una request a characters?age[lt]=
el dto es { lt: 0 }
El problema se da en estas líneas, ya que no se hacen los checkeos suficientes
movies-api/src/decorators/to-numeric-filter.decorator.ts
Lines 13 to 15 in 543d19f
Se tiene que:
true
, se checkea que sea un string numerico con validator
!isNaN(value)
por isNumeric(value)
en el archivo{ eq: Number(value) }
. Si no, { eq: null }
[prop]: { [Op.and]: [{ [Op.not]: null }, ...constraints] }, // también se puede usar `concat`
test crud with real db. check for db related errors. dont check for validation errors since that is done in integration tests
check registering and login using real db
Deberá permitir buscar por título, y filtrar por género. Además, permitir ordenar los resultados
por fecha de creación de forma ascendiente o descendiente.
El término de búsqueda, filtro u ordenación se deberán especificar como parámetros de query:
GET /movies?name=nombre
GET /movies?genre=idGenero
GET /movies?order=ASC | DESC
Actualmente los mensajes que se muestran cuando falla la validación son innecesariamente verbosos.
Por ejemplo:
{
"message" : {
"description" : "Validation error.",
"errors" : [
{
"children" : [],
"constraints" : {
"isEmail" : "email must be an email"
},
"property" : "email",
"target" : {}
},
{
"children" : [],
"constraints" : {
"isString" : "password must be a string"
},
"property" : "password",
"target" : {}
}
]
},
"name" : "Bad Request",
"statusCode" : 400
}
cuando simplemente podria ser:
{
"message" : {
"description" : "Validation error.",
"errors" : [
"email must be an email",
"password must be a string"
]
},
"name" : "Bad Request",
"statusCode" : 400
}
test integration between middlewares, controllers and services. mock db.
test integration between middlewares, controllers and services. mock db.
Usar swagger
Documentar:
Actualmente, los campos que no estan seteados en la base de datos se devuelven el el json de la response como null
Por ejemplo GET /characters/2
{
"age" : null,
"history" : "Not much is known about the mirror except that his sole purpose is to serve whoever may own him at the time. Whilst he is antagonistic on various occasions, he is not intentionally evil, as he is forced to obey the Evil Queen due to being her slave. He does not hesitate to tell the truth to the Queen when it is revealed that Snow White was still alive.",
"id" : 2,
"imageUrl" : "https://static.wikia.nocookie.net/disney/images/f/f9/Snowwhite-disneyscreencaps.com-100.jpg/revision/latest/scale-to-width-down/223?cb=20201125093643",
"movies" : [
{
"id" : 1,
"imageUrl" : "https://upload.wikimedia.org/wikipedia/commons/b/b0/Snow_white_1937_trailer_screenshot.jpg",
"title" : "Snow White and the Seven Dwarfs"
}
],
"name" : "Magic Mirror",
"weight" : null
}
estos campos debierian ser ocultados con class-transformer
Actualmente se está usando sequelize-cli
para correr las migraciones y los seeders. Pero la librería no soporta TS, por lo que los archivos se tienen que compilar primero, lo que puede traer side effects.
migrar los seeders y las migraciones a umzug
Check that controllers are calling services
movies-api/tests/unit/config/app.config.spec.ts
Lines 23 to 27 in 4c95f5f
esto trae side-effects. usar alguna libreria externa para mockearlo
Unit test creation of error objects
Solución: agregar app.use(express.json())
después de esta línea
Line 12 in ba72b37
documentar los endpoints de /characters
con swagger
Para realizar peticiones a los endpoints subsiguientes el usuario deberá contar con un token que
obtendrá al autenticarse. Para ello, deberán desarrollarse los endpoints de registro y login, que
permitan obtener el token.
Los endpoints encargados de la autenticación deberán ser:
/auth/login
/auth/register
En el detalle deberán listarse todos los atributos del personaje, como así también sus películas o
series relacionadas.
hacer tests para:
app.config
y db.config
En la documentación de DELETE /characters
muestra en su código 200 la respuesta de actualización y no de borrado de un personaje
Cambiar la línea
movies-api/src/routes/characters.routes.ts
Line 149 in 0c8feb1
por $ref: '#/components/responses/CharacterDeleted'
Deberán existir las operaciones básicas de creación, edición y eliminación de personajes.
Docker falla porque no encuentra los archivo yarn.lock
y tsconfig.database-only.json
sacar el lockfile del .dockerignore
e intercambiar las líneas 9 y 11 en el dockerignore
Deberá permitir buscar por nombre, y filtrar por edad, peso o películas/series en las que participó.
Para especificar el término de búsqueda o filtros se deberán enviar como parámetros de query:�
GET /characters?name=nombre
GET /characters?age=edad
GET /characters?movies=idMovie
Al registrarse en el sitio, el usuario deberá recibir un email de bienvenida. Es recomendable, la
utilización de algún servicio de terceros como SendGrid.
En algunas acciones (por ejemplo, al crear un personaje) no se hace trim a los valores que son strings.
También se tendria que hacer trim a los valores de los dto que se usan para las queries ya que estos vienen como strings.
Agregar el decorador @Trim()
donde sea necesario (revisar carpeta src/models/dto
)
test integration between middlewares, controllers and services. mock db.
GET /characters
El error sucede cuando se hace una request con un valor que no es un numero, por ejemplo:
$ curlie -j get "http://localhost:5500/characters?movies=1&movies=abc" --pretty
HTTP/1.1 500 Internal Server Error
Access-Control-Allow-Origin: *
Content-Security-Policy: default-src 'self';base-uri 'self';block-all-mixed-content;font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
X-DNS-Prefetch-Control: off
Expect-CT: max-age=0
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
Origin-Agent-Cluster: ?1
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
X-XSS-Protection: 0
Content-Type: application/json; charset=utf-8
Content-Length: 111
ETag: W/"6f-TO0HtZLoUVSzSFBuz5HgGGCqhdI"
Date: Wed, 15 Jun 2022 02:18:30 GMT
Connection: keep-alive
Keep-Alive: timeout=5
{
"statusCode": 500,
"name": "Internal Server Error",
"message": "Unknown error. Contact the system administrators."
}
El problema se da en esta línea de código:
en el ejemplo anterior, se llama a [1, null].join(',')
, lo que da como resultado WHERE "movieId" IN ( 1, )
, lo cual es una sintaxis inválida.
Usar los replacements de Sequelize, que justamente están diseñados para prevenir situaciones como esta.
POST
/movies/:id/characters
para agregar personajes a una películaDELETE
/movies/:idMovie/characters/:idCharacter
para borrar personajes de una películaEn el método CharactersService.delete
, Character.destroy
no tiene un parámetro limit
, por lo que la base de datos sigue buscando registros para borrar una vez que ya borro el personaje indicado.
return Character.destroy({ where: { id }, limit: 1 });
En el test de authenticateMiddleware
no se está mockeando el import de src/auth/jwt.strategy
ver que la carpeta auth
sale en el code coverage
...
87 passing (950ms)
--------------------------------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
--------------------------------------------|---------|----------|---------|---------|-------------------
All files | 96.05 | 92.68 | 84.41 | 96.26 |
auth | 57.14 | 100 | 0 | 57.14 |
jwt.strategy.ts | 57.14 | 100 | 0 | 57.14 | 12-15
config | 100 | 90 | 100 | 100 |
app.config.ts | 100 | 90 | 100 | 100 | 6
...
mockear ese import del middleware en el test usando proxyquire
Deberá mostrar solamente los campos imagen, título y fecha de creación.
El endpoint deberá ser: GET /movies
movies-api/src/controllers/auth.controller.ts
Lines 63 to 69 in 914f083
async/await
ya que no es necesario@IsString()
para que se entiendan mejor los errores de validaciónmovies-api/src/middlewares/authenticate-jwt.middleware.ts
Lines 49 to 61 in 914f083
&&
de la primera condición (+ simple, + seguro)UserNotFound
de la documentacióndebug
Sequelize logea todas las operaciones de los seeders en la consola. lo que excede el tamaño máximo del buffer de stdout
cuando se usa childProcess.exec
(error ERR_CHILD_PROCESS_STDIO_MAXBUFFER
)
Reemplazar
Line 21 in 0b822bf
por
import { spawn } from 'child-process';
spawn('npx sequelize db:seed:all', { shell: true });
esto hace que el seeder se ejectute en un proceso aparte, por lo que no llena la consola.
/characters
Documentar los endpoints de /movies
con swagger
Docuementar los endpoints de auth con swagger
Se debera agregar documentación con swagger para los DTOs que se usen para crear y editar peliculas y personajes
test crud with real db. check for db related errors. dont check for validation errors since that is done in integration tests
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.