Arquisoft / faq

Frequently asked questions - Software architecture course
MIT License
4 stars 0 forks source link

name o firstName de los amigos de Solid #8

Closed Rcenador closed 2 years ago

Rcenador commented 3 years ago

Algunos componentes de la librería @solid/react aceptan expresiones LDFlex para alcanzar ciertos datos del POD como se describe en esta sección de su documentación (https://github.com/solid/react-components#create-data-expressions-with-ldflex).

Sin embargo, uno de los ejemplos básicos que trato de probar, el de ver la lista de amigos por sus nombres, en lugar de sus webID no me está funcionando. En concreto la expresión 'user.friends.firstName'. También he detectado un problema con la expresión 'user.firstName', que no muestra la información, mientras 'user.name' sí que lo hace.

¿Es posible que tengan desfasada la documentación de la librería o he de indagar más en si es un error mío propio?¿Alguien se ha topado con el mismo problema?

pglez82 commented 3 years ago

Es posible que la documentación esté desfasada o tenga algún error. Lo mejor para tratar de encontrar una solución (si no lo has hecho ya) es que prepares un ejemplo mínimo reproducible. De esta manera será más fácil que te podamos echar una mano. Otra opción es preguntar en el propio gitter de solid o en su foro.

pglez82 commented 3 years ago

Justo acabo de ver otra issue de otro grupo que parece relacionada con esta:

https://github.com/Arquisoft/radarin_en1b/issues/83#issue-843678283

pglez82 commented 3 years ago

He probado este código de la documentación de la librería query-ldflex y al menos lo de sacar el nombre de los amigos me ha funcionado. Este es el ejemplo que he probado:

const { default: data } = require('@solid/query-ldflex');

const ruben = data['https://ruben.verborgh.org/profile/#me'];
showProfile(ruben);

async function showProfile(person) {
  const label = await person.label;
  console.log(`\nNAME: ${label}`);

  console.log('\nTYPES');
  for await (const type of person.type)
    console.log(`  - ${type}`);

  console.log('\nFRIENDS');
  for await (const name of person.friends.firstName)
    console.log(`  - ${name} is a friend`);
}

que devuelve:

NAME: Ruben Verborgh

TYPES
  - http://xmlns.com/foaf/0.1/Person

FRIENDS
  - Ben is a friend
  - Mohamed is a friend
  - Jan is a friend
...

así que parece que al menos eso está funcionando correctamente.

Rcenador commented 3 years ago

Muchas gracias @pglez82 .

Esa misma prueba, el ejemplo de código que has pegado en el comentario anterior, me da el mismo resultado que a ti. El problema es que cambiando la url del webID, por la mía, ya no funciona de la misma manera y me devuelve:

NAME: undefined

TYPES
  - http://schema.org/Person
  - http://xmlns.com/foaf/0.1/Person

FRIENDS  

El nombre 'undefined' y la lista de amigos vacía.
La única línea de código que cambio es:
const ruben = data['https://ruben.verborgh.org/profile/#me'];

por esta:

const ruben = data['https://rcen.solidcommunity.net/profile/card#me'];

¿Es posible que se comporte de diferentes maneras dependiendo de quién es el proveedor de solid?

También he probado en el LDflex playground con diferentes expresiones. La misma que comentan los compañeros en el issue https://github.com/Arquisoft/radarin_en1b/issues/83#issue-843678283, con resultado positivo. También .friends devuelve bien los webID de los amigos. Pero .friends.firstName ya falla:

Captura de pantalla 2021-03-30 a las 14 26 37 Captura de pantalla 2021-03-30 a las 14 26 54
pglez82 commented 3 years ago

Realmente el formato interno de tu pod (o mi pod) y el de Rubén no es el mismo. Puedes compararlos aquí:

https://ruben.verborgh.org/profile/#me

El tuyo puedes verlo dandole al último botón (XML source) en tu profile. Lo pego aquí para que quede más claro:

@prefix solid: <http://www.w3.org/ns/solid/terms#>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix pim: <http://www.w3.org/ns/pim/space#>.
@prefix schema: <http://schema.org/>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix pro: <./>.
@prefix n: <http://www.w3.org/2006/vcard/ns#>.
@prefix inbox: </inbox/>.
@prefix rce: </>.
@prefix m: <https://masuhev.solidcommunity.net/>.
@prefix lug: <https://lugb.solidcommunity.net/>.
@prefix n0: <https://antsuarz.solidcommunity.net/>.
@prefix kik: <https://kike.solidcommunity.net/>.
@prefix die: <https://diegotn17.solidcommunity.net/>.
@prefix n1: <http://www.w3.org/ns/auth/acl#>.

pro:card a foaf:PersonalProfileDocument; foaf:maker :me; foaf:primaryTopic :me.

:me
    a schema:Person, foaf:Person;
    n:fn "Roc\u00edo";
    n:organization-name "undefined";
    n:role "undefined";
    n:url
        [ a n:WebID; n:value "https://antsuarz.solidcommunity.net" ],
        [ a n:WebID; n:value "https://diegotn17.solidcommunity.net" ],
        [ a n:WebID; n:value "https://kike.solidcommunity.net" ],
        [ a n:WebID; n:value "https://lugb.solidcommunity.net" ],
        [ a n:WebID; n:value "https://masuhev.solidcommunity.net" ];
    n1:trustedApp
            [
                n1:mode n1:Append, n1:Control, n1:Read, n1:Write;
                n1:origin <http://localhost:3000>
            ],
            [
                n1:mode n1:Append, n1:Read, n1:Write;
                n1:origin <https://ohmypod.netlify.app>
            ],
            [
                n1:mode n1:Append, n1:Read, n1:Write;
                n1:origin <https://solid.github.io>
            ],
            [
                n1:mode n1:Append, n1:Read, n1:Write;
                n1:origin <https://solidweb.org>
            ];
    ldp:inbox inbox:;
    pim:preferencesFile </settings/prefs.ttl>;
    pim:storage rce:;
    solid:account rce:;
    solid:privateTypeIndex </settings/privateTypeIndex.ttl>;
    solid:publicTypeIndex </settings/publicTypeIndex.ttl>;
    foaf:knows n0:, die:, kik:, lug:, m:;
    foaf:name "Roc\u00edo Cenador".

Si te fijas, tu nombre está almacenado en el campo name. De esta manera si haces: ['https://rcen.solidcommunity.net/profile/card#me'].name podrías acceder a tu nombre. Por otra parte, usando ['https://rcen.solidcommunity.net/profile/card#me'].friends o ['https://rcen.solidcommunity.net/profile/card#me'].knows podrías acceder a los webids de tus amigos. Realmente la única información que hay en tu pod son los web ids de tus amigos por tanto, hasta donde yo se, no es posible acceder al nombre directamente. Si ves el de Rubén, ahí si que están los nombres de los amigos. Para acceder al nombre de los amigos entiendo que habría que hacer una petición a cada pod del amigo en cuestión.

Realmente no entiendo como los ejemplos están puestos con un formato de pod que no se corresponde con lo que genera el profile viewer de solid community. Quizás hay alguna razón pero yo no la sé. Desde luego es confuso para el que llega a esto por primera vez.

Rcenador commented 3 years ago

Gracias a tu información he podido hacer que funcione nuestra aplicación pero digamos que la solución es específica para un proveedor de Solid (en nuestro caso Solid Community). ¿Es requisito de la aplicación la compatibilidad con cualquier proveedor? Entiendo que es lo más deseable. En ese caso creo que el siguiente paso sería poder detectar el proveedor del usuario que ha iniciado sesión en el sistema.

Como has comentado, es bastante confuso para quien llega de nuevas, y sería una gran mejora que esas librerías tan ampliamente utilizadas fuesen compatibles con cualquier tipo de pod.

pglez82 commented 3 years ago

Yo no me preocuparía por eso. En principio tanto el pod provider de solid community como el de inrupt usan el mismo software así que con ambos funcionará. Incluso si tu te instalas tu propio pod provider (https://github.com/solid/node-solid-server) va a ser lo mismo. Otra cosa es como utiliza su pod el tal Rubén, yo la verdad que ahí ya me pierdo :) .

Pablo

labra commented 3 years ago

Gracias a tu información he podido hacer que funcione nuestra aplicación pero digamos que la solución es específica para un proveedor de Solid (en nuestro caso Solid Community). ¿Es requisito de la aplicación la compatibilidad con cualquier proveedor? Entiendo que es lo más deseable.

Yo creo que sí que sería deseable, pero como dice Pablo en su respuesta no es imprescindible de cara a vuestra práctica. Lo mejor es que lo anotéis como un issue para que sea algo pendiente de mejorar en futuras versiones o alguien pueda investigar un poco más la causa de ese comportamiento.

Tiene pinta que puede ser que Ruben esté usando una versión diferente del código de servidor de Pods. Lo ideal sería mirar en la especificación de Solid cuál es la información obligatoria que se debe proporcionar.

En realidad, la información que devuelven los proveedores de Solid es RDF, y los grafos RDF son bastante flexibles en cuanto a información, es decir, que normalmente se especifica los campos mínimos obligatorios, pero una aplicación puede enviar más campos de los obligatorios, y se suele admitir. Por éso, si el proveedor de pods de Solid envía más campos que otros, aunque no venga en la especificación, no rompe con ella.

En ese caso creo que el siguiente paso sería poder detectar el proveedor del usuario que ha iniciado sesión en el sistema.

Es una posibilidad...otra posibilidad sería contactar con Ruben Verborgh y preguntarle. ¿Lo has intentado hacer? Hasta donde yo sé, creo que el servidor de pods de Ruben es una máquina suya y por éso es posible que utilice un software diferente al de solid community. Pero también sé que Ruben forma parte de la comunidad Solid y me extrañaría que no siguiese la especificación.

Como has comentado, es bastante confuso para quien llega de nuevas, y sería una gran mejora que esas librerías tan ampliamente utilizadas fuesen compatibles con cualquier tipo de pod.

Sí, por éso puede ser de gran ayuda a la comunidad de Solid que trateseis de averiguar la causa. Seguramente no perdéis nada por intentar preguntar en los chats de Solid o en el foro de Solid...así queda la pregunta registrada, o incluso en este caso, al propio Ruben.

Os animo a que lo hagáis porque de hecho, ellos están esperando ese tipo de feedback de gente como vosotros.