Documentación de rutas: Gestión de amigos Contexto - Todas las rutas viven bajo el prefijo /users. - Protegidas por los middlewares getOToken y appauth (mismos requisitos que el resto de endpoints de /users). - Respuestas en JSON. - Los datos de cada amigo exponen únicamente: id, email y full_name (derivado de PersonalData), y face_url si existe imagen de rostro. Autenticación y cabeceras esperadas - Authorization: Bearer - OToken: - Campus: (opcional, si tu app lo usa) - Timezone: (opcional, ej: America/Caracas) - Content-Type: application/json en llamadas POST/DELETE con cuerpo. 1) Listar amigos GET /users/friends Query params: - page (opcional): número de página, por defecto 1. Paginación de 10 por página. Respuesta 200 OK: { "total": number, "hasMorePages": boolean, "page": number, "data": [ { "id": number, // id del usuario amigo "email": string, // email del amigo "full_name": string, // nombre completo desde PersonalData "face_url": string|null // url de la imagen de rostro (si aplica) } ] } 2) Agregar amigo por email POST /users/friends Body (JSON): { "email": "amigo@correo.com" } Reglas: - No puedes agregarte a ti mismo. Respuestas: - 201 Created: { "id": number, "email": string, "full_name": string|null, "face_url": string|null } - 422 Unprocessable Entity si el email es vacío/invalid o el usuario no existe. 3) Eliminar (desactivar) amigo DELETE /users/friends/:id Parámetros de ruta: - :id => id del usuario amigo (friend_id) Comportamiento: - Realiza un borrado lógico (status = false) de la relación amigo. - Si luego se vuelve a agregar por email, la relación se reactiva (status = true). Respuesta: - 200 OK { "message": "Friend removed successfully" } Notas de implementación - Paginación fija en 10 elementos por página en la lista. - Campo full_name proviene de PersonalData (firstname + lastname). - face_url proviene de la relación PersonalData.face si existe. - El backend aplica filtro status = true para listar sólo amigos activos.