diff --git a/src/graphql/resolvers/groups.ts b/src/graphql/resolvers/groups.ts index 0e0885c206433fa34abb9be4998d094fc59d7e6e..bced15a11d592f5946dc26afa3608d7ac40b73a3 100644 --- a/src/graphql/resolvers/groups.ts +++ b/src/graphql/resolvers/groups.ts @@ -30,6 +30,7 @@ export abstract class Group { * @memberof GraphQL.Group# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce groupe dans le stockage approprié, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected * @abstract @@ -340,44 +341,74 @@ export class SimpleGroup extends Group { * @summary Resolvers des groupes simples * @classdesc Une classe représentant le type SimpleGroup du schéma. * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement. - * @arg {string} gid - Identifiant du groupe simple + * @arg {string} gid - Identifiant du groupe simple, supposé valide. * @rights connectedOrOnplatal */ constructor(gid: string) { super(gid); } + /** + * @memberof GraphQL.SimpleGroup# + * @function tryCreate + * @summary Fonction qui va essayer de créer le groupe simple correspondant + * @arg {string} gid - Identifiant du groupe simple, sans hypothese sur la validité. + * @returns {Promise(SimpleGroup)} - Renvoie le groupe simple créé, ou null en cas d'erreur. + * @rights connectedOrOnplatal + * @async + * @static + */ + static async tryCreate(gid: string): Promise<SimpleGroup> { + let g = new SimpleGroup(gid); + try { + await g.fetchData(); + return g; + } + catch { + return null; + } + } + /** * @memberof GraphQL.SimpleGroup# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce groupe simple dans le LDAP, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ protected async fetchData(): Promise<void> { if(!this.m_dataLoaded) { - let data = await LDAP_Group.peek(this.gid); - - //this.m_createdAt = data.createdAt; - //this.m_updatedAt = data.updatedAt; - this.m_name = data.name; - this.m_description = data.description; - //this.m_mail = data.mail; - //this.m_website = data.website; - - this.m_members = data.members; - //this.m_speakers = data.speakers; - this.m_admins = data.admins; - //this.m_likers = data.likers; + try { + let data = await LDAP_Group.peek(this.gid); + if(data.gid !== this.gid) { + throw "Error in search"; + } + + //this.m_createdAt = data.createdAt; + //this.m_updatedAt = data.updatedAt; + this.m_name = data.name; + this.m_description = data.description; + //this.m_mail = data.mail; + //this.m_website = data.website; + + this.m_members = data.members; + //this.m_speakers = data.speakers; + this.m_admins = data.admins; + //this.m_likers = data.likers; + + //this.m_frontPage = data.frontPage; + //this.m_postsSummary = data.postsSummary; + + //this.m_parent = data.parent; + //this.m_children = data.children; + //this.m_school = ???; - //this.m_frontPage = data.frontPage; - //this.m_postsSummary = data.postsSummary; - - //this.m_parent = data.parent; - //this.m_children = data.children; - //this.m_school = ???; - - this.m_dataLoaded = true; + this.m_dataLoaded = true; + } + catch { + throw "Not_found"; + } } } @@ -553,32 +584,54 @@ export class MetaGroup extends Group { * @summary Resolvers des méta-groupes * @classdesc Une classe représentant le type MetaGroup du schéma. * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement. - * @arg {string} gid - Identifiant du méta-groupe + * @arg {string} gid - Identifiant du méta-groupe, supposé valide * @rights connectedOrOnplatal */ constructor(gid: string) { super(gid); } + /** + * @memberof GraphQL.MetaGroup# + * @function tryCreate + * @summary Fonction qui va essayer de créer le méta-groupe correspondant + * @arg {string} gid - Identifiant du méta-groupe, sans hypothese sur la validité. + * @returns {Promise(MetaGroup)} - Renvoie le méta-groupe créé, ou null en cas d'erreur. + * @rights connectedOrOnplatal + * @async + * @static + */ + static async tryCreate(gid: string): Promise<MetaGroup> { + let g = new MetaGroup(gid); + try { + await g.fetchData(); + return g; + } + catch { + return null; + } + } + /** * @memberof GraphQL.MetaGroup# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce méta-groupe dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ protected async fetchData(): Promise<void> { if (!this.m_dataLoaded) { let data = await knex.select('created_at', - 'updated_at', - 'name', - 'description', - //'mail', - //'posts_summary', - //'front_page', - 'website').from('groups').where('gid', this.gid); - - if(data.length() > 0) { + 'updated_at', + 'name', + 'description', + //'mail', + //'posts_summary', + //'front_page', + 'website').from('groups').where('gid', this.gid); + + if(data.length > 0) { let g = data[0]; this.m_createdAt = g.created_at; @@ -593,6 +646,9 @@ export class MetaGroup extends Group { this.m_dataLoaded = true; } + else { + throw "Not_found"; + } } } diff --git a/src/graphql/resolvers/messages.ts b/src/graphql/resolvers/messages.ts index 01c81e4a4b55103c72f46f675692d7f595e9801e..7feb59a1bf4dbdc43b6a2457560f7616cf60915b 100644 --- a/src/graphql/resolvers/messages.ts +++ b/src/graphql/resolvers/messages.ts @@ -28,6 +28,7 @@ export abstract class Message { * @memberof GraphQL.Message# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce message dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected * @abstract @@ -152,10 +153,32 @@ export class Announcement extends Message { super(mid); } + /** + * @memberof GraphQL.Announcement# + * @function tryCreate + * @summary Fonction qui va essayer de créer l'annonce correspondante + * @arg {number} mid - Identifiant du message, sans hypothese sur la validité. + * @returns {Promise(Announcement)} - Renvoie le Announcement créé, ou null en cas d'erreur. + * @rights membre d'un groupe author ou d'un groupe recipient + * @async + * @static + */ + static async tryCreate(mid: number): Promise<Announcement> { + let m = new Announcement(mid); + try { + await m.fetchData(); + return m; + } + catch { + return null; + } + } + /** * @memberof GraphQL.Announcement# * @function fetchData * @summary Fonction qui va chercher toutes les données sur cet announcement dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ @@ -168,7 +191,7 @@ export class Announcement extends Message { //'importance', 'views').from('messages_announcements').where('mid', this.mid); - if (data.length() > 0) { + if (data.length > 0) { let m = data[0]; this.m_createdAt = m.created_at; @@ -180,6 +203,9 @@ export class Announcement extends Message { this.m_dataLoaded = true; } + else { + throw "Not_found"; + } } } @@ -257,7 +283,7 @@ export class Announcement extends Message { */ async forEvent(args, context, info): Promise<Event> { let data = await knex.select('mid').from('messages_events').where('for_announcement', this.mid); - if(data.length() > 0) { + if(data.length > 0) { return new Event(data[0].mid); } return null; @@ -280,10 +306,32 @@ export class Event extends Message { super(mid); } + /** + * @memberof GraphQL.Event# + * @function tryCreate + * @summary Fonction qui va essayer de créer l'evenement correspondant + * @arg {number} mid - Identifiant du message, sans hypothese sur la validité. + * @returns {Promise(Event)} - Renvoie le Event créé, ou null en cas d'erreur. + * @rights membre d'un groupe author ou d'un groupe recipient + * @async + * @static + */ + static async tryCreate(mid: number): Promise<Event> { + let m = new Event(mid); + try { + await m.fetchData(); + return m; + } + catch { + return null; + } + } + /** * @memberof GraphQL.Event# * @function fetchData * @summary Fonction qui va chercher toutes les données sur cet event dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ @@ -298,7 +346,7 @@ export class Event extends Message { 'end_time', 'for_announcement').from('messages_events').where('mid', this.mid); - if (data.length() > 0) { + if (data.length > 0) { let m = data[0]; this.m_createdAt = m.created_at; @@ -312,6 +360,9 @@ export class Event extends Message { this.m_dataLoaded = true; } + else { + throw "Not_found"; + } } } @@ -453,10 +504,32 @@ export class PrivatePost extends Message { super(mid); } + /** + * @memberof GraphQL.PrivatePost# + * @function tryCreate + * @summary Fonction qui va essayer de créer le post privé correspondant + * @arg {number} mid - Identifiant du message, sans hypothese sur la validité. + * @returns {Promise(PrivatePost)} - Renvoie le PrivatePost créé, ou null en cas d'erreur. + * @rights membre du groupe recipient + * @async + * @static + */ + static async tryCreate(mid: number): Promise<PrivatePost> { + let m = new PrivatePost(mid); + try { + await m.fetchData(); + return m; + } + catch { + return null; + } + } + /** * @memberof GraphQL.PrivatePost# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce post privé dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ @@ -469,7 +542,7 @@ export class PrivatePost extends Message { 'author', 'recipient').from('messages_private_posts').where('mid', this.mid); - if (data.length() > 0) { + if (data.length > 0) { let m = data[0]; this.m_createdAt = m.created_at; @@ -481,6 +554,9 @@ export class PrivatePost extends Message { this.m_dataLoaded = true; } + else { + throw "Not_found"; + } } } @@ -541,10 +617,32 @@ export class Question extends Message { super(mid); } + /** + * @memberof GraphQL.Question# + * @function tryCreate + * @summary Fonction qui va essayer de créer la question correspondante + * @arg {number} mid - Identifiant du message, sans hypothese sur la validité. + * @returns {Promise(Question)} - Renvoie la Question créée, ou null en cas d'erreur. + * @rights viewer du groupe recipient + * @async + * @static + */ + static async tryCreate(mid: number): Promise<Question> { + let m = new Question(mid); + try { + await m.fetchData(); + return m; + } + catch { + return null; + } + } + /** * @memberof GraphQL.Question# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce post privé dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ @@ -557,7 +655,7 @@ export class Question extends Message { 'author', 'recipient').from('messages_questions').where('mid', this.mid); - if (data.length() > 0) { + if (data.length > 0) { let m = data[0]; this.m_createdAt = m.created_at; @@ -569,6 +667,9 @@ export class Question extends Message { this.m_dataLoaded = true; } + else { + throw "Not_found"; + } } } @@ -622,7 +723,7 @@ export class Question extends Message { */ async forAnswer(args, context, info): Promise<Answer> { let data = await knex.select('mid').from('messages_answers').where('for_question', this.mid); - if (data.length() > 0) { + if (data.length > 0) { return new Answer(data[0].mid); } return null; @@ -645,10 +746,32 @@ export class Answer extends Message { super(mid); } + /** + * @memberof GraphQL.Answer# + * @function tryCreate + * @summary Fonction qui va essayer de créer la réponse correspondante + * @arg {number} mid - Identifiant du message, sans hypothese sur la validité. + * @returns {Promise(Answer)} - Renvoie la Answer créée, ou null en cas d'erreur. + * @rights viewer du groupe author + * @async + * @static + */ + static async tryCreate(mid: number): Promise<Answer> { + let m = new Answer(mid); + try { + await m.fetchData(); + return m; + } + catch { + return null; + } + } + /** * @memberof GraphQL.Answer# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce post privé dans la BDD, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ @@ -661,7 +784,7 @@ export class Answer extends Message { 'recipient', //<--- WTF ???? 'for_question').from('messages_answers').where('mid', this.mid); - if (data.length() > 0) { + if (data.length > 0) { let m = data[0]; this.m_createdAt = m.created_at; @@ -673,6 +796,9 @@ export class Answer extends Message { this.m_dataLoaded = true; } + else { + throw "Not_found"; + } } } diff --git a/src/graphql/resolvers/users.ts b/src/graphql/resolvers/users.ts index 4a856aacd04a9f5e00b707d670656b113ad29f36..2011194980c7c6628380ca7721a3a11760727421 100644 --- a/src/graphql/resolvers/users.ts +++ b/src/graphql/resolvers/users.ts @@ -24,34 +24,64 @@ export class User { this.m_dataLoaded = false; } + /** + * @memberof GraphQL.User# + * @function tryCreate + * @summary Fonction qui va essayer de créer le user correspondant + * @arg {string} uid - Identifiant du user, sans hypothese sur la validité. + * @returns {Promise(User)} - Renvoie le user créé, ou null en cas d'erreur. + * @rights connectedOrOnplatal + * @async + * @static + */ + static async tryCreate(uid: string): Promise<User> { + let u = new User(uid); + try { + await u.fetchData(); + return u; + } + catch { + return null; + } + } + /** * @memberof GraphQL.User# * @function fetchData * @summary Fonction qui va chercher toutes les données sur ce user dans le LDAP, si ce n'est pas déja fait. + * @throws {Not_found} Les données n'ont pas pu etre trouvées. * @async * @protected */ protected async fetchData(): Promise<void> { if(!this.m_dataLoaded) { - let data = await LDAP_User.peek(this.uid); - - this.m_givenName = data.givenName; - this.m_lastName = data.lastName; - this.m_nickname = data.nickname; - this.m_nationality = data.nationality; - this.m_birthdate = data.birthdate; - this.m_promotion = data.promotion; - - this.m_mail = data.mail; - this.m_phone = data.phone; - this.m_addresses = [data.address]; - - this.m_memberOf = data.groups; - //this.m_speakerOf = data.groupsIsSpeaker; - this.m_adminOf = data.groupsIsAdmin; - //this.m_likes = data.likes; - - this.m_dataLoaded = true; + try { + let data = await LDAP_User.peek(this.uid); + if(data.uid !== this.uid) { + throw "Error in search"; + } + + this.m_givenName = data.givenName; + this.m_lastName = data.lastName; + this.m_nickname = data.nickname; + this.m_nationality = data.nationality; + this.m_birthdate = data.birthdate; + this.m_promotion = data.promotion; + + this.m_mail = data.mail; + this.m_phone = data.phone; + this.m_addresses = [data.address]; + + this.m_memberOf = data.groups; + //this.m_speakerOf = data.groupsIsSpeaker; + this.m_adminOf = data.groupsIsAdmin; + //this.m_likes = data.likes; + + this.m_dataLoaded = true; + } + catch { + throw "Not_found"; + } } }