diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql index 07070f358bb7c924a7e0e0cb27921dae458b7164..b798bab0ded639857983389dd16139ccd05415a1 100644 --- a/src/graphql/typeDefs/actions.graphql +++ b/src/graphql/typeDefs/actions.graphql @@ -57,7 +57,7 @@ type Query { sport: String, phone: String, mail: String, - address: String, + addresses: [String], ips: [String] ): [User!] diff --git a/src/graphql/typeDefs/objects.graphql b/src/graphql/typeDefs/objects.graphql index eca057718b39a57b80ded07094d43ecc3a694da3..dd8a612901ae94ff6eda43612979b5fd961d5fa0 100644 --- a/src/graphql/typeDefs/objects.graphql +++ b/src/graphql/typeDefs/objects.graphql @@ -1,188 +1,214 @@ -# hawkspar->all ; doc ? +""" +@file Définit les types du schéma GraphQL. Il y en a quatre catégories : User, Group, Message, Request. + +Conseils généraux pour toute tentative d'amélioration du schéma : + - mettre un -s aux champs array [SomeType]. + - ... et même aux champs union *pouvant être* des array. + - ne pas rajouter un champ si on peut prévoir qu'il ne sera jamais utilisé. + - ne pas rajouter un champ si cela complexifie trop la gestion des autorisations. + - (par exemple pour User, tous les champs doivent pouvoir être vus par toute personne ayant accès au TOL.) + - dans ce cas créer un nouveau query, tout simplement. + - respecter la convention : + - uid = user id + - gid = group id + - mid = message id + - rid = request id + - choisir des noms clairs, précis, concis. + - commenter lorsque c'est pertinent, également en étant clair, précis, concis. + +@author akka vodol, kadabra +""" -# Utilisateurs +""" +Un utilisateur +""" type User { - # Prénom de l'utilisateur - givenName: String! - # Nom de famille - lastName: String! - # Surnom - nickname: String - nationality: String uid: ID! + + # Pour l'identifier + givenName: String! # Prénom + lastName: String! # Nom de famille + nickname: String # Surnom + nationality: String birthdate: String! + promotion: String + #photo: TODO (difficile car nécessite de gérer des données non-texte) + + # Pour le contacter mail: String phone: String - # Groupes dont l'utilisateur est membre. - groups: [SimpleGroup] - # Groupes que l'utilisateur aime. - likes: [Group] - # Adresse(s) de l'utilisateur. - address: [String] - # Promotion - promotion: String -} + addresses: [String] # Adresse(s) de l'utilisateur (numero de casert par exemple) -# Groupes associatifs + # Ses interactions avec des groupes + memberOf: [SimpleGroup] # Groupes dont l'utilisateur est membre + speakerOf: [SimpleGroup] + adminOf: [Group] + likes: [Group] # Groupes dont l'utilisateur est sympathisant (purement indicatif, pas d'influence sur les niveaux de droit) + + # Les Message dont il est l'auteur + questionsFromUser: [Question] # Les seuls Messages publics où `authors` est de type User +} """ -L'interface Group représente les deux types de groupes implémentés dans Sigma : les groupes -simples, dont les membres sont des utilisateurs, et les métagroupes, dont les membres sont -des groupes simples (tel que Federez, dont les membres incluent le BR et DaTA). +L'interface Group représente les deux types de groupes implémentés dans Sigma : +- les groupes simples, dont les membres sont des utilisateurs, et +- les métagroupes, dont les membres sont des groupes simples (tel que Federez, dont les membres incluent le BR et DaTA). """ interface Group { gid: ID! - name: String - # Site Web. - website: String - description: String - type: String - - # Jour et heure de création du groupe. - createdAt: String! - # Dernière mise à jour du groupe. - updatedAt: String! + createdAt: String! # Date et heure de création du groupe. + updatedAt: String! # Date et heure de mise a jour des informations du groupe. - # member requests + # Pour l'identifier + name: String! + description: String # Une description tres rapide du groupe + + # Pour le contacter + mail: String + website: String - # Les posts prives dans ce groupe - privatePosts: [PrivatePost] - # Les questions addressees à ce groupe - questions: [Question] - # Les reponses donnees par ce groupe - answers: [Answer] + # Administrateurs, à contacter directement en cas de problème + admins: [User] } # Le groupe de base, dont les membres sont des utilisateurs : binets, Kès... type SimpleGroup implements Group { - uid: ID - name: String - website: String + gid: ID! createdAt: String! updatedAt: String! + name: String! + description: String + mail: String + website: String - # Admin, membres, sympathisants du groupe - admins: [User] + # Admins, speakers (respos com), membres, sympathisants du groupe members: [User] + speakers: [User] + admins: [User] likers: [User] + + # Graphe organique des groupes + parent: SimpleGroup # Groupe parent + children: [SimpleGroup] # Groupes enfants + memberOfMeta: [MetaGroup] + visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique - description: String - # École d'origine du groupe - school: String - # Groupe parent - parent: Group + school: String # École d'origine du groupe (pour information) - privatePosts: [PrivatePost] + # Activité publique du groupe + frontPage: String # page d'accueil du groupe, en markdown questions: [Question] - answers: [Answer] + answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse + + # Activité interne + announcementsFromGroup: [Announcement] # annonces écrites par le groupe + announcementsToGroup: [Announcement] # annonces adressées au groupe + eventsFromGroup: [Event] + eventsToGroup: [Event] + privatePosts: [PrivatePost] + postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown } # Un groupe dont les membre sont d'autres groupes type MetaGroup implements Group { - uid: ID - name: String - website: String + gid: ID! createdAt: String! updatedAt: String! + name: String! description: String + mail: String + website: String - # Les groupes constitutifs du méta-groupe. - members: [Group]! + # Admins et Groupes membres + admins: [User] + members: [SimpleGroup] # Par choix de paradigme, on veut éviter d'avoir des méta-méta-groupes. - privatePosts: [PrivatePost] - questions: [Question] - answers: [Answer] + visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique } +union AuthorUnion = Group | [Group] | User -# Tout type de message adressé à un ou plusieurs groupes. - -# Auteur possible d'un Message -# union AuthorUnion = Group | [Group] | User -# union RecipientUnion = Group | [Group] - -# Les unions sont assez faibles dans GraphQL, -# elles n'acceptent pas les listes ni les interfaces - -# L'interface Message représente toute information que veut communiquer un groupe ou un user. -# Par choix de paradigme, tout Message est adressé à un (ou des) groupe(s). -# Les types implémentés sont divisés en deux : -# - les Message émanant d'un groupe : Announcement et Event, ainsi que Answer -# - les Message émanant d'un user : PrivatePost, ainsi que Question - +""" +L'interface Message représente toute information que veut communiquer un groupe ou un user. +Par choix de paradigme, tout Message est adressé à un groupe (et un seul). +Les types implémentés sont divisés en deux : +- les Message émanant d'un groupe : Announcement et Event, ainsi que Answer +- les Message émanant d'un user : PrivatePost, ainsi que Question +""" interface Message { - id: ID! - # Titre du message - title: String! - content: String + mid: ID! createdAt: String! updatedAt: String! + title: String! + content: String! + + authors: AuthorUnion + recipient: Group } -# Annonce publique effectuée par un ou plusieurs groupes. +# Annonce effectuée par un ou plusieurs groupes. type Announcement implements Message { - id: ID! - title: String! + mid: ID! createdAt: String! updatedAt: String! + title: String! content: String! - importance: Int - views: Int - forEvent: Event authors: [Group] - recipients: [Group] + recipient: Group + + importance: Int # importance de cette Announcement, sur une échelle de [??] à [??] (TODO) + views: Int # nombre de vues + + # Si cette Announcement annonce un événement, référence le Event. Sinon null. + forEvent: Event } # Événements organisés par un ou plusieurs groupes. type Event implements Message { - id: ID! - # Intitulé de l'événement - title: String! - # Lieu de l'événement - location: String + mid: ID! createdAt: String! updatedAt: String! + title: String! + content: String! + + authors: [Group] # Organisateurs de l'événement + recipient: Group + + location: String! startTime: String! endTime: String! - # Organisateurs - # Personnes qui participent à l'événement. - participatingGroups: [Group] + + # Personnes et groupes qui participent à l'événement. + participatingGroups: [Group] # contributeurs mais pas organisateurs (par ex, Fanfare à une proj' JTX) participatingUsers: [User] - content: String - asAnnouncement: Announcement - authors: [Group] - recipients: [Group] + # Si cet Event a été annoncé par un Announcement, le référence. Sinon null. + forAnnouncement: Announcement } # Post interne d'un membre sur la page interne de son groupe type PrivatePost implements Message { - id: ID! + mid: ID! createdAt: String! updatedAt: String! title: String! content: String! authors: User - recipients: Group + recipient: Group } # Question posée par un user à un groupe type Question implements Message { - id: ID! + mid: ID! createdAt: String! updatedAt: String! title: String! content: String! authors: User - recipients: Group - - # Une annonce éventuellement concernée par cette question. - # Null si la question ne concerne pas une annonce particulière - - forAnnouncement: Announcement + recipient: Group # Référence la réponse donnée par le groupe à cette Question. Si pas encore répondu, null. forAnswer: Answer @@ -190,51 +216,63 @@ type Question implements Message { # Réponse à une Question type Answer implements Message { - id: ID! + mid: ID! createdAt: String! updatedAt: String! title: String! content: String! authors: Group - recipients: Group + recipient: Group # doit être le même que authors # La question à laquelle cette Answer répond. Non-nullable bien sûr forQuestion: Question! } +""" +Différents types de requêtes peuvent être adressées à un groupe. Elles sont stockées en BDD en attente d'être traitées. +Par exemple (le plus évident) demander à devenir membre, mais il existe aussi d'autres cas de figure. +On peut les voir comme des Mutations potentielles : en cas de validation de la requête, des entrées de la BDD seront modifiées. +Seuls les admins d'un Group (qu'il soit Simple ou Meta) ont le droit de valider ou refuser une requête. +Les différents types implémentant Request représentent des types de requête : +- UserJoinGroup: un User demande à devenir membre d'un SimpleGroup +- GroupCoauthorEvent: un groupe demande à devenir (co-)organisateur d'un événement *déjà existant* +""" +# Emetteur possible d'une Request +union RequesterUnion = Group | User + interface Request { - # ID de la demande - id: ID! - # message accompagnant la demande - message: String + rid: ID! + comment: String # court message accompagnant la demande + + from: RequesterUnion! # Émet la demande + to: Group! # Reçoit la demande } -# Demande d'un utilisateur désirant rejoindre le groupe. +# Un utilisateur demande à devenir membre d'un groupe (simple bien sûr). type UserJoinGroup implements Request{ - id: ID! - message: String - # Émetteur de la demande - user: User + rid: ID! + comment: String + + from: User! + to: SimpleGroup! } +# Un groupe simple demande à devenir membre d'un méta-groupe +type GroupJoinMetagroup implements Request{ + rid: ID! + comment: String -# Demande d'un groupe voulant rejoindre un événement -type GroupJoinEvent implements Request{ - id: ID! - message: String - # Événement concerné - event: Event - # Groupe voulant rejoindre l'événement - groupWantingToJoin: Group + from: SimpleGroup! + to: MetaGroup! } -# Demande au récipiendaire de rejoindre l'organisation d'un événement. -type YourGroupHostEvent implements Request{ - id: ID! - message: String - # Événement concerné - event: Event - # Groupe ayant publié l'évènement et lancé l'invitation - sender: Group +# Un Group demande à devenir (co-)author d'un Event *déjà existant*. +type GroupCoauthorEvent implements Request{ + rid: ID! + comment: String + + from: Group! # Groupe souhaitant l'évènement et lançant l'invitation + to: Group! # un des Groupes organisant l'événement (erreur sinon) + forEvent: Event! } diff --git a/src/graphql/typeDefs/objects_ldap.graphql b/src/graphql/typeDefs/objects_ldap.graphql index 7f70480af96d0a018ca776779806754738cf5c3d..28c5d4e57318639158bed719d7307226509f816a 100644 --- a/src/graphql/typeDefs/objects_ldap.graphql +++ b/src/graphql/typeDefs/objects_ldap.graphql @@ -1,5 +1,4 @@ # hawkspar->all ; doc ? -# kadabra -> hawkspar : wtf c'est quoi ce schéma qui sort de nulle part ? est-ce qu'il sert à quelque chose ? # Utilisateurs type User { @@ -34,7 +33,7 @@ simples, dont les membres sont des utilisateurs, et les métagroupes, dont les m des groupes simples (tel que Federez, dont les membres incluent le BR et DaTA). """ interface Group { - uid: ID + gid: ID! name: String # Site Web. website: String @@ -53,8 +52,6 @@ interface Group { questions: [Question] # Les reponses donnees par ce groupe answers: [Answer] - - } # Le groupe de base, dont les membres sont des utilisateurs : binets, Kès... diff --git a/src/graphql/typeDefs/objects_wish_list.graphql b/src/graphql/typeDefs/objects_wish_list.graphql deleted file mode 100644 index cd6fd9588c639011d92b7e30136a5f81c8031667..0000000000000000000000000000000000000000 --- a/src/graphql/typeDefs/objects_wish_list.graphql +++ /dev/null @@ -1,279 +0,0 @@ -""" -@file Définit les types du schéma GraphQL. Il y en a quatre catégories : User, Group, Message, Request. - Ce fichier est la wish-list de kadabra (qui veut avoir un schéma clair pour travailler sereinement sur le front). - -Conseils généraux pour toute tentative d'amélioration du schéma : - - mettre un -s aux champs array [SomeType]. - - ... et même aux champs union *pouvant être* des array. - - ne pas rajouter un champ si on peut prévoir qu'il ne sera jamais utilisé. - - ne pas rajouter un champ si cela complexifie trop la gestion des autorisations. - - (par exemple pour User, tous les champs doivent pouvoir être vus par toute personne ayant accès au TOL.) - - dans ce cas créer un nouveau query, tout simplement. - - respecter la convention : - - uid = user id - - gid = group id - - mid = message id - - rid = request id - - choisir des noms clairs, précis, concis. - - commenter lorsque c'est pertinent, également en étant clair, précis, concis. - -@author akka vodol, kadabra -""" - -""" -Un utilisateur -""" -type User { - uid: ID! - - # Pour l'identifier - givenName: String! # Prénom - lastName: String! # Nom de famille - nickname: String # Surnom - nationality: String - birthdate: String! - promotion: String - #photo: TODO (difficile car nécessite de gérer des données non-texte) - - # Pour le contacter - mail: String - phone: String - address: [String] # Adresse(s) de l'utilisateur (numero de casert par exemple) - - # Ses interactions avec des groupes - memberOf: [SimpleGroup] # Groupes dont l'utilisateur est membre - speakerOf: [SimpleGroup] - adminOf: [Group] - likes: [Group] # Groupes dont l'utilisateur est sympathisant (purement indicatif, pas d'influence sur les niveaux de droit) - - # Les Message dont il est l'auteur - questionsFromUser: [Question] # Les seuls Messages publics où `authors` est de type User -} - -""" -L'interface Group représente les deux types de groupes implémentés dans Sigma : -- les groupes simples, dont les membres sont des utilisateurs, et -- les métagroupes, dont les membres sont des groupes simples (tel que Federez, dont les membres incluent le BR et DaTA). -""" -interface Group { - gid: ID! - createdAt: String! # Date et heure de création du groupe. - updatedAt: String! # Date et heure de mise a jour des informations du groupe. - - # Pour l'identifier - name: String! - description: String # Une description tres rapide du groupe - - # Pour le contacter - mail: String - website: String - - # Administrateurs, à contacter directement en cas de problème - admins: [User] -} - -# Le groupe de base, dont les membres sont des utilisateurs : binets, Kès... -type SimpleGroup implements Group { - gid: ID! - createdAt: String! - updatedAt: String! - name: String! - description: String - mail: String - website: String - - # Admins, speakers (respos com), membres, sympathisants du groupe - members: [User] - speakers: [User] - admins: [User] - likers: [User] - - # Graphe organique des groupes - parent: SimpleGroup # Groupe parent - children: [SimpleGroup] # Groupes enfants - memberOfMeta: [MetaGroup] - visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique - - school: String # École d'origine du groupe (pour information) - - # Activité publique du groupe - frontPage: String # page d'accueil du groupe, en markdown - questions: [Question] - answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse - - # Activité interne - announcementsFromGroup: [Announcement] # annonces écrites par le groupe - announcementsToGroup: [Announcement] # annonces adressées au groupe - eventsFromGroup: [Event] - eventsToGroup: [Event] - posts: [Post] - postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown -} - -# Un groupe dont les membre sont d'autres groupes -type MetaGroup implements Group { - gid: ID! - createdAt: String! - updatedAt: String! - name: String! - description: String - mail: String - website: String - - # Admins et Groupes membres - admins: [User] - members: [SimpleGroup] # Par choix de paradigme, on veut éviter d'avoir des méta-méta-groupes. - - visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique -} - -union AuthorUnion = Group | [Group] | User - -""" -L'interface Message représente toute information que veut communiquer un groupe ou un user. -Par choix de paradigme, tout Message est adressé à un groupe (et un seul). -Les types implémentés sont divisés en deux : -- les Message émanant d'un groupe : Announcement et Event, ainsi que Answer -- les Message émanant d'un user : PrivatePost, ainsi que Question -""" -interface Message { - mid: ID! - createdAt: String! - updatedAt: String! - title: String! - content: String! - - authors: AuthorUnion - recipient: Group -} - -# Annonce effectuée par un ou plusieurs groupes. -type Announcement implements Message { - mid: ID! - createdAt: String! - updatedAt: String! - title: String! - content: String! - - authors: [Group] - recipient: Group - - importance: Int # importance de cette Announcement, sur une échelle de [??] à [??] (TODO) - views: Int # nombre de vues - - # Si cette Announcement annonce un événement, référence le Event. Sinon null. - forEvent: Event -} - -# Événements organisés par un ou plusieurs groupes. -type Event implements Message { - mid: ID! - createdAt: String! - updatedAt: String! - title: String! - content: String! - - authors: [Group] # Organisateurs de l'événement - recipient: Group - - location: String! - startTime: String! - endTime: String! - - # Personnes et groupes qui participent à l'événement. - participatingGroups: [Group] # contributeurs mais pas organisateurs (par ex, Fanfare à une proj' JTX) - participatingUsers: [User] - - # Si cet Event a été annoncé par un Announcement, le référence. Sinon null. - forAnnouncement: Announcement -} - -# Post interne d'un membre sur la page interne de son groupe -type PrivatePost implements Message { - mid: ID! - createdAt: String! - updatedAt: String! - title: String! - content: String! - - authors: User - recipient: Group -} - -# Question posée par un user à un groupe -type Question implements Message { - mid: ID! - createdAt: String! - updatedAt: String! - title: String! - content: String! - - authors: User - recipient: Group - - # Référence la réponse donnée par le groupe à cette Question. Si pas encore répondu, null. - forAnswer: Answer -} - -# Réponse à une Question -type Answer implements Message { - mid: ID! - createdAt: String! - updatedAt: String! - title: String! - content: String! - - authors: Group - recipient: Group # doit être le même que authors - - # La question à laquelle cette Answer répond. Non-nullable bien sûr - forQuestion: Question! -} - -""" -Différents types de requêtes peuvent être adressées à un groupe. Elles sont stockées en BDD en attente d'être traitées. -Par exemple (le plus évident) demander à devenir membre, mais il existe aussi d'autres cas de figure. -On peut les voir comme des Mutations potentielles : en cas de validation de la requête, des entrées de la BDD seront modifiées. -Seuls les admins d'un Group (qu'il soit Simple ou Meta) ont le droit de valider ou refuser une requête. -Les différents types implémentant Request représentent des types de requête : -- UserJoinGroup: un User demande à devenir membre d'un SimpleGroup -- GroupCoauthorEvent: un groupe demande à devenir (co-)organisateur d'un événement *déjà existant* -""" -# Emetteur possible d'une Request -union RequesterUnion = Group | User - -interface Request { - rid: ID! - comment: String # court message accompagnant la demande - - from: RequesterUnion! # Émet la demande - to: Group! # Reçoit la demande -} - -# Un utilisateur demande à devenir membre d'un groupe (simple bien sûr). -type UserJoinGroup implements Request{ - rid: ID! - comment: String - - from: User! - to: SimpleGroup! -} - -# Un groupe simple demande à devenir membre d'un méta-groupe -type GroupJoinMetagroup implements Request{ - rid: ID! - comment: String - - from: SimpleGroup! - to: MetaGroup! -} - -# Un Group demande à devenir (co-)author d'un Event *déjà existant*. -type GroupCoauthorEvent implements Request{ - rid: ID! - comment: String - - from: Group! # Groupe souhaitant l'évènement et lançant l'invitation - to: Group! # un des Groupes organisant l'événement (erreur sinon) - forEvent: Event! -}