Estoy tratando de estructurar una base de datos para mi aplicación y una parte crítica es la asociación de usuarios con varios modelos en las bases de datos. También estoy usando la autenticación de Amplify para administrar usuarios. A continuación se muestra una versión ligeramente modificada de su ejemplo de publicación de blog.
type Blog @model { id: ID! name: String! posts: [Post] @connection(name: "BlogPosts") } type Post @model { id: ID! title: String! blog: Blog @connection(name: "BlogPosts") comments: [Comment] @connection(name: "PostComments") user: ##userid##??? likes: 0 } type Comment @model { id: ID! content: String post: Post @connection(name: "PostComments") user: ##userid##??? }Aquí hay algunos problemas que estoy viendo. Es posible que desee mostrar el nombre de usuario de un usuario y tal vez una foto de perfil. Sé que puedo almacenar un atributo opcional para un usuario como una URL de imagen, pero ¿puedo acceder a los atributos de otros usuarios ya que no son el usuario autenticado actual? Además, ¿cómo haría para rastrear las publicaciones que le gustan a un usuario en particular? Puedo agregar una lista de usuarios que me gustan en el modelo de publicación, pero eso no se escalaría bien si quisiera obtener todas las publicaciones que me gustaron de un usuario. Luego, en el nivel más bajo, está la cuestión de almacenar al usuario que creó la publicación. No hay un modelo de usuario con el que pueda asociarlo para obtener todas las publicaciones de un usuario en particular. ¿La solución es simplemente tener un modelo de Usuarios y administrarlo con autenticación?
Déjame tratar de ayudarte.
En primer lugar, le sugiero que asocie sus modelos a algún tipo de autenticación para que sepan qué usuario creó qué. Cognito es bastante simple para empezar .
Después de eso, sus modelos se verían así (ajusté sus modelos para reflejar la última versión de amplificar, no lo probé, pero puede leer más sobre esto aquí ):
type Blog @model @auth(rules: [{ allow: owner }]) { id: ID! name: String! posts: [Post] @hasMany(indexName: "byBlog", fields: ["id"]) } type Post @model @auth(rules: [{ allow: owner }]) { id: ID! blogID: ID! @index(name: "byBlog") post: Post @belongsTo(fields: ["blogID"]) title: String! likes: 0 comments: [Comment] @hasMany } type Comment @model @auth(rules: [{ allow: owner }]) { id: ID! content: String } Después de eso, puede crear una función lambda que obtendrá la información del usuario (según el atributo del owner , que está oculto a menos que lo especifique). Puede agregar un nuevo atributo a su modelo como:
createdBy: Owner @function(name: "getOwnerDetails-${env}")Así que ahora tu modelo se vería algo como:
type Owner { email: String name: String photo: String } type Comment @model @auth(rules: [{ allow: owner }]) { id: ID! content: String createdBy: Owner @function(name: "getOwnerDetails-${env}") }No puedo darle los detalles de la función lambda porque la mía tiene algunas cosas adicionales y es muy específica para mi caso, pero estoy seguro de que puede resolverlo, solo asegúrese de tener acceso a su Cognito y su atributo y todo lo que necesita hacer es devolverlo :)
espero que esto ayude.