Aquí es donde definiremos el schema para nuestras consultas GraphQL. Idealmente, queremos modelar estos datos para que coincidan con los datos que necesitamos para nuestra interfaz.
Según las maquetas de nuestro sitio web, podemos ver que necesitamos poder:
Podemos eliminar la entidad de ejemplo en el archivo de el schema. Así es como debería verse nuestro archivo de schema:
type Event @entity { id: ID! eventID: Bytes! name: String description: String link: String imageURL: String eventOwner: Bytes! eventTimestamp: BigInt! maxCapacity: BigInt! deposit: BigInt! paidOut: Boolean! totalRSVPs: BigInt! totalConfirmedAttendees: BigInt! rsvps: [RSVP!] @derivedFrom(field: "event") confirmedAttendees: [Confirmation!] @derivedFrom(field: "event") } type Account @entity { id: ID! totalRSVPs: BigInt! totalAttendedEvents: BigInt! rsvps: [RSVP!] @derivedFrom(field: "attendee") attendedEvents: [Confirmation!] @derivedFrom(field: "attendee") } type RSVP @entity { id: ID! attendee: Account! event: Event! } type Confirmation @entity { id: ID! attendee: Account! event: Event! }
Analicemos lo que está sucediendo aquí.
Tenemos 4 entidades: Event
, Account
, RSVP
y Confirmation
. Cada entidad debe definirse con la etiqueta @entity
. Puedes pensar en una entidad como un objeto. Es una "cosa" que tiene claves y valores, y cada clave es un campo de schema que se puede consultar por su valor.
Cada entidad también tiene un campo ID para una identificación única y algunos campos para información sobre esa entidad que queremos poder consultar. Cada campo tiene un tipo, y si es requerido tiene un “!” (el valor no puede ser nulo). Los campos de event name, description, link, y, imageURL no son obligatorios, lo que significa que pueden devolver un valor null
.
En las entidades Event
y Account
para los campos rsvps y asistentes confirmados, usamos una palabra clave especial @derivedFrom
, también llamada búsqueda inversa, que nos permite hacer referencia a datos de otra entidad. Veamos los rsvps como ejemplo:
rsvps: [RSVP!] @derivedFrom(field: "event")
Una forma de pensar en lo que está sucediendo aquí es que cada vez que alguien crea un nuevo RSVP, esa instancia de RSVP se agrega a esta matriz si la identificación del evento del campo "event" en la entidad de RSVP coincide con la identificación de este evento. Por ejemplo, se crea un nuevo RSVP:
RSVP { id: 20 attendee: 300 event: 5000 }
Este RSVP es para un evento con la identificación 5000. El evento con la identificación correspondiente tendrá este RSVP agregado a la matriz rsvps.
Event { id: 5000 rsvps: [ {id: 20, attendee: 300, event: 5000} ] }
Cada nuevo RSVP para este evento también se agregará aquí. Al usar búsquedas inversas como esta, podemos consultar fácilmente todas las confirmaciones de asistencia y confirmaciones para cualquier evento o cuenta.
Escritoras: Sarah Schwartz, Traductoras: Dami, Brenda, Caro Meneses