IIC2513 / Syllabus-S1

Sección 1 - Antonio Ossa
32 stars 0 forks source link

Sobre PUT /messages/:id #78

Open c4ebt opened 1 month ago

c4ebt commented 1 month ago

La tercera ruta de Message en el enunciado dice: "Actualizar un mensaje: Método PUT; Ruta '/:id'".

No pude encontrar ninguna parte del frontend que hiciera uso de esta funcionalidad, por lo que tengo algunas dudas sobre qué exactamente es lo que se espera que haga.

De acuerdo a MDN Web Docs, "The PUT HTTP method creates a new resource or replaces a representation of the target resource with the request content". En este contexto, ¿se espera que este endpoint reciba un body idéntico al recibido en la ruta POST /messages/:id, y reemplace todos los atributos anteriores del mensaje con los nuevos recibidos en el body de la request PUT? Es decir, recibe una request PUT /messages/id de la forma

{
    "body": "nuevo message body",
    "username": "nuevoUsuario",
    "chatId": 2
}

donde 2 puede ser un int arbitrario que representa el nuevo chatId, y entonces actualiza el mensaje con id id para que tenga body "nuevo message body", username "nuevoUsuario" y chatId 2.

Por convención del método PUT esto es lo que debería hacer, pero la principal razón por la que me surge la duda es que claramente no tiene sentido en una aplicación que un mensaje se pueda actualizar y con ello cambiar de usuario emisor y de chat en el que se encuentra. Esto pierde aún más sentido cuando consideramos que al cambiar de chat y usuario emisor, el mensaje podría pasar a tener un chatId de un Chat en el que ni siquiera participa username. Algo que sería más intuitivo sería que solo se edite el body del mensaje, y no el usuario emisor ni el chat en el que se envió, y que el body de la request sea de la forma

{
    "body": "nuevo message body"
}

Sin embargo, si este fuera el caso lo correcto por definición de métodos HTTP sería hacerlo con método PATCH y no PUT, por lo que asumí que lo que se pide es lo primero, aunque no haga sentido a nivel de aplicación/experiencia de usuario.

¿Cuál de las dos alternativas se busca que hagamos?

En el caso de que se busque que hagamos la primera, en donde todos los atributos se pueden editar, ¿cómo se espera que manejemos el caso en que cambia el mensaje de chat? Por ejemplo, es posible que un mensaje cambie de un chat a otro, que cambie de un usuario a otro, y que el nuevo usuario no sea partícipe del nuevo chat (esto también tiene que ver con esta issue). ¿Tenemos que validar que no ocurra esto? ¿En el caso de que ocurra, a qué seteamos el response body?

rodrigoogalde commented 1 month ago

Hola! El método PUT puede recibir cualquier atributo y este cambiará en la BDD, por ejemplo, si hacemos un PUT en el modelo Message con el siguiente body:

{
    "body": "example"
}

Cambiará únicamente el atributo body. Lo que se espera es que si le enviamos un body valido, este cambie el original por el nuevo. No es necesario validar que el body sea valido verificando cada atributo del json enviado, simplemente con usar un catch y enviarlo devuelta esta bien. Puedes revisar utilizar el frontend para validar tu logica