From 5616d6c022b5e2fde26e0f65b1beb332485a2d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Bruant=20Steineur?= Date: Fri, 22 May 2026 17:44:48 +0200 Subject: [PATCH 1/2] =?UTF-8?q?feat(http):=20=F0=9F=94=A7=20Simplify=20HTT?= =?UTF-8?q?P=20request=20methods=20to=20use=20`post`=20and=20`get`=20direc?= =?UTF-8?q?tly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replaced `this.http.request` with `this.http.post` and `this.http.get` in multiple modules for cleaner code. * Updated methods in `AbsencesModule`, `CloudModule`, `DocumentsModule`, `GradesModule`, `HomeworkModule`, `MessagingModule`, `SettingsModule`, `TimelineModule`, and `TimetableModule`. --- src/index.ts | 12 +++++------- src/modules/AbsencesModule.ts | 7 ++----- src/modules/CloudModule.ts | 18 ++++++----------- src/modules/DocumentsModule.ts | 3 +-- src/modules/GradesModule.ts | 3 +-- src/modules/HomeworkModule.ts | 9 +++------ src/modules/MessagingModule.ts | 36 ++++++++++++---------------------- src/modules/SettingsModule.ts | 9 +++------ src/modules/TimelineModule.ts | 6 ++---- src/modules/TimetableModule.ts | 6 ++---- src/utils/http.ts | 30 +++++++++++++++++++++------- 11 files changed, 60 insertions(+), 79 deletions(-) diff --git a/src/index.ts b/src/index.ts index a90b877..96fcd80 100644 --- a/src/index.ts +++ b/src/index.ts @@ -79,7 +79,7 @@ export class WrapDirecte { throw new EcoleDirecteError(`Initial authentication setup failed while fetching GTK: ${message}`); } - const response = await this.http.request('POST', '/login.awp', { + const response = await this.http.post('/login.awp', { identifiant: username, motdepasse: password, isReLogin: false, @@ -88,8 +88,7 @@ export class WrapDirecte { }, {}); if (response.code === 250) { - const challengeResponse = await this.http.request<{ question: string; propositions: string[] }>( - 'POST', + const challengeResponse = await this.http.post<{ question: string; propositions: string[] }>( '/connexion/doubleauth.awp', {}, { verbe: 'get' } @@ -111,7 +110,7 @@ export class WrapDirecte { async directLogin(username: string, password: string, faProof: string, uuid: string = ''): Promise { const [cn, cv] = decodeBase64(faProof).split(':'); - const response = await this.http.request('POST', '/login.awp', { + const response = await this.http.post('/login.awp', { identifiant: username, motdepasse: password, isReLogin: false, @@ -133,14 +132,13 @@ export class WrapDirecte { throw new EcoleDirecteError('No pending login flow to submit 2FA for. Call login() first.'); } - const challengePostResponse = await this.http.request<{ cn: string; cv: string }>( - 'POST', + const challengePostResponse = await this.http.post<{ cn: string; cv: string }>( '/connexion/doubleauth.awp', { choix: encodeBase64(answer) }, { verbe: 'post' } ); - const finalResponse = await this.http.request('POST', '/login.awp', { + const finalResponse = await this.http.post('/login.awp', { identifiant: this.currentUsername, motdepasse: this.currentPassword, isReLogin: false, diff --git a/src/modules/AbsencesModule.ts b/src/modules/AbsencesModule.ts index 3302399..9f7f035 100644 --- a/src/modules/AbsencesModule.ts +++ b/src/modules/AbsencesModule.ts @@ -14,11 +14,8 @@ export interface CleanAbsence { export class AbsencesModule extends BaseModule { async getAbsences(options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', - `/eleves/${this.studentId}/viescolaire.awp`, - {}, - { verbe: 'get' } + const response = await this.http.get( + `/eleves/${this.studentId}/viescolaire.awp` ); if (options.raw) return response.data; diff --git a/src/modules/CloudModule.ts b/src/modules/CloudModule.ts index ba03881..6620a18 100644 --- a/src/modules/CloudModule.ts +++ b/src/modules/CloudModule.ts @@ -11,8 +11,7 @@ export interface CleanCloudNode { export class CloudModule extends BaseModule { async getCloudFiles(depth: number = 3, options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/cloud/E/${this.studentId}.awp`, { profondeur: depth }, { verbe: 'get', v: this.apiVersion } @@ -35,8 +34,7 @@ export class CloudModule extends BaseModule { } async createFolder(parentPath: string, folderName: string): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/cloud/E/${this.studentId}.awp`, { parentNode: { id: parentPath, type: 'folder' }, @@ -49,8 +47,7 @@ export class CloudModule extends BaseModule { } async copyNodes(parentPath: string, nodes: any[]): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/cloud/E/${this.studentId}.awp`, { parentNode: { id: parentPath, type: 'folder' }, @@ -62,8 +59,7 @@ export class CloudModule extends BaseModule { } async deleteNodes(nodes: any[]): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/cloud/E/${this.studentId}/visibility.awp`, { tabNodes: nodes }, { verbe: 'delete', v: this.apiVersion } @@ -72,8 +68,7 @@ export class CloudModule extends BaseModule { } async restoreNodes(nodes: any[]): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/cloud/E/${this.studentId}/visibility.awp`, { tabNodes: nodes }, { verbe: 'post', v: this.apiVersion } @@ -88,8 +83,7 @@ export class CloudModule extends BaseModule { } async exportToCloud(fileId: number, module: 'CAHIER_DE_TEXTES' | 'MESSAGERIE'): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( '/exportToCloud.awp', {}, { diff --git a/src/modules/DocumentsModule.ts b/src/modules/DocumentsModule.ts index f205a23..c42447f 100644 --- a/src/modules/DocumentsModule.ts +++ b/src/modules/DocumentsModule.ts @@ -11,8 +11,7 @@ export interface CleanDocument { export class DocumentsModule extends BaseModule { async getDocuments(options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( '/elevesDocuments.awp', {}, { archive: '', verbe: 'get' } diff --git a/src/modules/GradesModule.ts b/src/modules/GradesModule.ts index 7e1e878..e0b329c 100644 --- a/src/modules/GradesModule.ts +++ b/src/modules/GradesModule.ts @@ -80,8 +80,7 @@ export class GradesModule extends BaseModule { year: string = '', options: BaseModuleOptions = {} ): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/eleves/${this.studentId}/notes.awp`, { anneeScolaire: year }, { verbe: 'get' } diff --git a/src/modules/HomeworkModule.ts b/src/modules/HomeworkModule.ts index cb2ef55..9c35006 100644 --- a/src/modules/HomeworkModule.ts +++ b/src/modules/HomeworkModule.ts @@ -39,8 +39,7 @@ export interface CleanComment { export class HomeworkModule extends BaseModule { async getHomework(date: string, options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/Eleves/${this.studentId}/cahierdetexte/${date}.awp`, {}, { verbe: 'get' } @@ -101,8 +100,7 @@ export class HomeworkModule extends BaseModule { idDevoirsNonEffectues: isDone ? [] : [homeworkId], }; - await this.http.request( - 'POST', + await this.http.post( `/Eleves/${this.studentId}/cahierdetexte.awp`, data, { verbe: 'put' } @@ -110,8 +108,7 @@ export class HomeworkModule extends BaseModule { } async addComment(homeworkId: number, message: string): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/Eleves/${this.studentId}/afaire/commentaires.awp`, { message: encodeBase64(message), diff --git a/src/modules/MessagingModule.ts b/src/modules/MessagingModule.ts index 70cfd91..1e3f666 100644 --- a/src/modules/MessagingModule.ts +++ b/src/modules/MessagingModule.ts @@ -38,8 +38,7 @@ export interface CleanAttachment { export class MessagingModule extends BaseModule { async getMessages(year: string, options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/eleves/${this.studentId}/messages.awp`, { anneeMessages: year }, { getAll: '1', verbe: 'get', v: this.apiVersion } @@ -68,8 +67,7 @@ export class MessagingModule extends BaseModule { } async getMessagesByFolder(folderId: number, options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/eleves/${this.studentId}/messages.awp`, {}, { @@ -101,8 +99,7 @@ export class MessagingModule extends BaseModule { year: string, options: BaseModuleOptions & { markAsUnread?: boolean } = {} ): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/eleves/${this.studentId}/messages/${messageId}.awp`, { anneeMessages: year }, { verbe: 'get', mode: 'destinataire', v: this.apiVersion } @@ -160,8 +157,7 @@ export class MessagingModule extends BaseModule { const now = new Date(); const formattedDate = now.toISOString().replace('T', ' ').split('.')[0]; - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/eleves/${this.studentId}/messages.awp`, { message: { @@ -193,8 +189,7 @@ export class MessagingModule extends BaseModule { } async getContacts(type: 'professeurs' | 'personnels' | 'entreprises'): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/messagerie/contacts/${type}.awp`, {}, { verbe: 'get', v: this.apiVersion } @@ -203,8 +198,7 @@ export class MessagingModule extends BaseModule { } async markAsRead(ids: number[], year: string): Promise { - await this.http.request( - 'POST', + await this.http.post( `/eleves/${this.studentId}/messages.awp`, { action: 'marquerCommeLu', @@ -216,8 +210,7 @@ export class MessagingModule extends BaseModule { } async markAsUnread(ids: number[], year: string): Promise { - await this.http.request( - 'POST', + await this.http.post( `/eleves/${this.studentId}/messages.awp`, { action: 'marquerCommeNonLu', @@ -229,8 +222,7 @@ export class MessagingModule extends BaseModule { } async archiveMessages(ids: number[], year: string): Promise { - await this.http.request( - 'POST', + await this.http.post( `/eleves/${this.studentId}/messages.awp`, { action: 'archiver', @@ -242,8 +234,7 @@ export class MessagingModule extends BaseModule { } async unarchiveMessages(ids: number[], year: string): Promise { - await this.http.request( - 'POST', + await this.http.post( `/eleves/${this.studentId}/messages.awp`, { action: 'desarchiver', @@ -255,8 +246,7 @@ export class MessagingModule extends BaseModule { } async moveMessages(ids: number[], folderId: number): Promise { - await this.http.request( - 'POST', + await this.http.post( `/eleves/${this.studentId}/messages.awp`, { action: 'deplacer', @@ -268,8 +258,7 @@ export class MessagingModule extends BaseModule { } async createFolder(name: string): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( '/messagerie/classeurs.awp', { libelle: name }, { verbe: 'post', v: this.apiVersion } @@ -278,8 +267,7 @@ export class MessagingModule extends BaseModule { } async deleteFolder(folderId: number): Promise { - await this.http.request( - 'POST', + await this.http.post( `/messagerie/classeur/${folderId}.awp`, {}, { verbe: 'delete', v: this.apiVersion } diff --git a/src/modules/SettingsModule.ts b/src/modules/SettingsModule.ts index 48bf99a..923f5a9 100644 --- a/src/modules/SettingsModule.ts +++ b/src/modules/SettingsModule.ts @@ -2,8 +2,7 @@ import { BaseModule } from './BaseModule'; export class SettingsModule extends BaseModule { async updateIndividualParam(value: string): Promise { - await this.http.request( - 'POST', + await this.http.post( '/parametreIndividuel.awp', { path: `Préférences/Elèves/accessibiliteVisuelle/id_${this.studentId}`, @@ -23,8 +22,7 @@ export class SettingsModule extends BaseModule { reponse: string; uuid?: string; }): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/logins/${this.studentLoginId}.awp`, data, { verbe: 'put' } @@ -34,8 +32,7 @@ export class SettingsModule extends BaseModule { async getAccountSettings(idLogin?: number): Promise { const loginId = idLogin ?? this.studentLoginId; - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/logins/${loginId}.awp`, {}, { verbe: 'get' } diff --git a/src/modules/TimelineModule.ts b/src/modules/TimelineModule.ts index 3053b09..b213a03 100644 --- a/src/modules/TimelineModule.ts +++ b/src/modules/TimelineModule.ts @@ -28,8 +28,7 @@ export interface CleanPostIt { export class TimelineModule extends BaseModule { async getStudentTimeline(options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/eleves/${this.studentId}/timeline.awp`, {}, { verbe: 'get' } @@ -52,8 +51,7 @@ export class TimelineModule extends BaseModule { } async getCommonTimeline(options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/E/${this.studentId}/timelineAccueilCommun.awp`, {}, { verbe: 'get' } diff --git a/src/modules/TimetableModule.ts b/src/modules/TimetableModule.ts index 8300fc5..97a0796 100644 --- a/src/modules/TimetableModule.ts +++ b/src/modules/TimetableModule.ts @@ -21,8 +21,7 @@ export interface CleanCourse { export class TimetableModule extends BaseModule { async getTimetable(startDate: string, endDate: string, options: BaseModuleOptions = {}): Promise { - const response = await this.http.request( - 'POST', + const response = await this.http.post( `/E/${this.studentId}/emploidutemps.awp`, { dateDebut: startDate, @@ -58,8 +57,7 @@ export class TimetableModule extends BaseModule { } async getIcalUrl(): Promise { - const response = await this.http.request<{ url: string }>( - 'POST', + const response = await this.http.post<{ url: string }>( `/ical/E/${this.studentId}/url.awp`, {}, { verbe: 'get' } diff --git a/src/utils/http.ts b/src/utils/http.ts index 246a068..31c8b80 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -59,8 +59,8 @@ export class HttpClient { } async request( - method: 'GET' | 'POST', path: string, + verbe: 'get' | 'post', body: unknown = null, params: Record = {} ): Promise> { @@ -69,19 +69,19 @@ export class HttpClient { if (!url.searchParams.has('v')) { url.searchParams.append('v', API_VERSION); } + if (verbe !== 'post' && !url.searchParams.has('verbe')) { + url.searchParams.append('verbe', verbe); + } const headers = this.getHeaders({ 'Content-Type': 'application/x-www-form-urlencoded', }); - let requestBody: string | undefined; - if (body !== null) { - const dataString = JSON.stringify(body); - requestBody = 'data=' + encodeURIComponent(dataString); - } + const payload = body ?? {}; + const requestBody = 'data=' + encodeURIComponent(JSON.stringify(payload)); const response = await fetch(url.toString(), { - method, + method: "POST", headers, body: requestBody, }); @@ -94,6 +94,7 @@ export class HttpClient { const result = (await response.json()) as APIResponse; if (result.code !== 200 && result.code !== 250) { + console.log(url.toString(), verbe, body, params, headers, result); throw new EcoleDirecteAPIError(result.message || 'Unknown API Error', result.code, result.host); } @@ -107,6 +108,21 @@ export class HttpClient { return result; } + async get( + path: string, + params: Record = {}, + ): Promise> { + return this.request(path, 'get', null, params); + } + + async post( + path: string, + body: unknown = null, + params: Record = {}, + ): Promise> { + return this.request(path, 'post', body, params); + } + getToken(): string | null { return this.token; } From b0a0afa3c4744422e708573f4e275e6a363d2200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Bruant=20Steineur?= Date: Fri, 22 May 2026 17:48:59 +0200 Subject: [PATCH 2/2] fix(http): remove debugging line --- src/utils/http.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/http.ts b/src/utils/http.ts index 31c8b80..5c87bdd 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -94,7 +94,6 @@ export class HttpClient { const result = (await response.json()) as APIResponse; if (result.code !== 200 && result.code !== 250) { - console.log(url.toString(), verbe, body, params, headers, result); throw new EcoleDirecteAPIError(result.message || 'Unknown API Error', result.code, result.host); }