From ef8c8e896d66efcd88efb53925224f6f9cc01a48 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Wed, 12 Feb 2025 20:59:13 +0100 Subject: [PATCH 01/11] feat: added openapi documentation to the project --- Documentation/BackendApi/openapi.yaml | 701 ++++++++++++++++++++++++++ 1 file changed, 701 insertions(+) create mode 100644 Documentation/BackendApi/openapi.yaml diff --git a/Documentation/BackendApi/openapi.yaml b/Documentation/BackendApi/openapi.yaml new file mode 100644 index 0000000..a116633 --- /dev/null +++ b/Documentation/BackendApi/openapi.yaml @@ -0,0 +1,701 @@ +openapi: 3.0.3 +info: + title: MyInpulse Backend Api + description: this document servers as a documentation for the backend api. + version: 0.0.0 + +tags: + - name: Entrepreneurs API + description: La partie de l'api dédiée aux entrepreneurs + - name: Admin API + description: La partie de l'api dédiée aux entrepreneurs + - name: Shared API + description: La partie de l'api dédiée aux entrepreneurs et admins + + +components: + schemas: + founder: + type: object + properties: + user: + type: object + properties: + nom: + type: string + prenom: + type: string + email: + type: string + scondaryEmail: + type: string + tel: + type: string + entrepreneur: + type: object + properties: + ecole: + type: string + filiere: + type: string + status: + type: string + + securitySchemes: + MyINPulse: + type: oauth2 + flows: + implicit: + authorizationUrl: https://petstore3.swagger.io/oauth/authorize + scopes: + MyINPulse-admin: Administrateur + MyINPulse-entrepreneur: Utilisateur + +paths: + /admin/projects: + get: + summary: Retourne la liste of projets associés à l'admin + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: + JSON array of who’s elements are objects containing necessary information for the view + (project name, entrepreneur names, etc..) + of the projects an admin is watching over. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + name: + type: string + E_names: + type: string + description: entrepreneur names + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /admin/appointments/upcoming: + get: + summary: Retourne la list des prochains rendez-vous de l'admin + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: + JSON array of upcoming appointment data (name, date, time etc..) for an admin. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + name: + type: string + date: + type: string + time: + type: string + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + /admin/projects/pending: + get: + summary: Retourne la liste des projets en attente de validation + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: + JSON array of who’s elements are objects containing + necessary information for the view (project name, + entrepreneur names, etc..) of all pending projects. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + name: + type: string + founder: + $ref: "#/components/schemas/founder" + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /projects/lcsection/{projectId}/{title}/{date}: + get: + summary: Retourne la liste de sections de LC avec un titre donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array containing Lean Canvas + section data with a title for the + current date (or given date if the + date parameter is passed) + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + - in: path + name: title + schema: + type: string + required: true + description: the name of lc section + - in: path + name: date + required: true + schema: + type: string + description: the date corresponding to the wanted version of lc section + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + section: + type: string + txt: + type: string + time: + type: string + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /projects/entrepreneurs/{projectId}: + get: + summary: Retourne la liste d'entrepreneurs associée à un projet donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of entrepreneur + names associated with a project + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: string + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + /projects/contacts/entrepreneurs/{projectId}: + get: + summary: Retourne la liste des contactes d'entrepreneurs associée à un projet donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of contacts for + each participant in the project with id + projectID. + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + name: + type: string + email: + type: string + tel: + type: string + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /projects/contacts/admin/{projectId}: + get: + summary: Retourne les contacts de l'admin que accompagne le projet + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON object containing contact information (name, gmail, tel, etc..) + the admin supervising the project with id + projectID. + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + type: object + properties: + name: + type: string + email: + type: string + tel: + type: string + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /projects/appointments/{projectId}: + get: + summary: Retourne les rendez-vous du project + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of upcoming and past appointment + data for the project with id projectID. + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + appointementId: + type: integer + name: + type: string + date: + type: string + time: + type: string + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + /projects/appointments/report/{apointementId}: + get: + summary: Retourne le rapport pdf du rendez-vous + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + PDF file containing the ap- + pointment report + parameters: + - in: path + name: apointementId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/pdf: + schema: + type: string + format: binary + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /projects/request: + post: + summary: demander la création et validation d'un projet + tags: + - Entrepreneurs API + description: + Adds project to pending projects + to then be accepted or rejected by + an admin + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + founder: + $ref: "#/components/schemas/founder" + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/projects/pending/decision: + post: + summary: valider un projet en attente de validation + tags: + - Admin API + description: + if the request is accepted the status of the + project is changed to ongoing, entrepreneur + account is confirmed and the project is linked + to the admin accepting the request and the + entrepreneur requesting it. Else the pending + project and user info are deleted. + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + pedingProjectId: + type: integer + decision: + type: boolean + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/projects/add: + post: + summary: Ajout mannuel d'un projet + description: + Adds a project with the + inputed details + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + founderName: + type: string + founderEmail: + type: string + school: + type: string + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/projects/remove/{projectId}: + delete: + summary: supression d'un project + description: + Removes the project + with the inputed id projectId + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: projectId + required: true + schema: + type: integer + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /lcsection/add/{projectId}: + post: + summary: ajouter une sections au LC + description: + Adds input data to the user’s LC + with a specified title. + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + txt: + type: string + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + /lcsection/modify/{sectionId}: + put: + summary: modifier les données d'une section LC + description: + Modifies input Lean Canvas section by changing it to + the information in the request body and changes the + time stamp. + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + parameters: + - in: path + name: sectionId + schema: + type: integer + required: true + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + txt: + type: string + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /lcsection/remove/{sectionId}: + delete: + summary: supprimer une section LC. + description: + Deletes section from Lean Canvas + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + parameters: + - in: path + name: sectionId + schema: + type: integer + required: true + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /appointments/request: + post: + summary: demander une rendez-vous + description: + will add an appointement request request by the applicant + to have an appointment to be confirmed or denied by the + specified participants of the appointement. + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-entrepreneur + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + start_time: + type: string + end_time: + type: string + place: + type: string + applicantId: + type: integer + participants: + type: array + items: + type: integer + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/appointments/report/{appointmentId}: + post: + summary: enregistrer une rapport du rendez-vous + description: + Generate a PDF file formatted + from input text and links it + to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + body: + type: string + conclusion: + type: string + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + + \ No newline at end of file From 79e949bdd4cba421037cef55c2a5330046ceebf2 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Wed, 19 Feb 2025 01:36:52 +0100 Subject: [PATCH 02/11] feat: configured gradle file to generate code for api interface from swagger specification --- MyINPulse-back/build.gradle | 32 +++++ .../src/main/resources/openapi/main.yaml | 133 ++++++------------ 2 files changed, 75 insertions(+), 90 deletions(-) rename Documentation/BackendApi/openapi.yaml => MyINPulse-back/src/main/resources/openapi/main.yaml (85%) diff --git a/MyINPulse-back/build.gradle b/MyINPulse-back/build.gradle index abdd6a9..1f37fd3 100644 --- a/MyINPulse-back/build.gradle +++ b/MyINPulse-back/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.4.2' id 'io.spring.dependency-management' version '1.1.7' + id 'org.openapi.generator' version '7.11.0' } group = 'enseirb' @@ -20,8 +21,39 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-web' + // swagger Codegen + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0' + implementation 'jakarta.validation:jakarta.validation-api:3.0.2' + implementation 'org.openapitools:jackson-databind-nullable:0.2.6' + testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + +} + +sourceSets { + main { + java { + srcDir "$buildDir/generated/src/main/java" + } + } +} +sourceSets { + main { + java.srcDir("$buildDir/generated/src/main/java") + } +} + +openApiGenerate { + generatorName.set("spring") + inputSpec.set("$rootDir/src/main/resources/openapi.yaml") + outputDir.set("$buildDir/generated") + apiPackage.set("enseirb.myinpulse.api") + modelPackage.set("enseirb.myinpulse.model") + configOptions.put("dateLibrary", "java8") + configOptions.put("useSpringBoot3", "true") + //configOptions.put("interfaceOnly", "true") + configOptions.put("library", "spring-boot") } tasks.named('test') { diff --git a/Documentation/BackendApi/openapi.yaml b/MyINPulse-back/src/main/resources/openapi/main.yaml similarity index 85% rename from Documentation/BackendApi/openapi.yaml rename to MyINPulse-back/src/main/resources/openapi/main.yaml index a116633..fd8d645 100644 --- a/Documentation/BackendApi/openapi.yaml +++ b/MyINPulse-back/src/main/resources/openapi/main.yaml @@ -15,22 +15,24 @@ tags: components: schemas: - founder: + user: + type: object + properties: + nom: + type: string + prenom: + type: string + email: + type: string + scondaryEmail: + type: string + tel: + type: string + user-entrepreneur: type: object properties: user: - type: object - properties: - nom: - type: string - prenom: - type: string - email: - type: string - scondaryEmail: - type: string - tel: - type: string + $ref: "#/components/schemas/user" entrepreneur: type: object properties: @@ -40,6 +42,11 @@ components: type: string status: type: string + user-admin: + type: object + properties: + admin: + $ref: "#/components/schemas/user" securitySchemes: MyINPulse: @@ -139,13 +146,13 @@ paths: name: type: string founder: - $ref: "#/components/schemas/founder" + $ref: "#/components/schemas/user-entrepreneur" "400": description: Bad request "401": description: Authorization information is missing or invalid - /projects/lcsection/{projectId}/{title}/{date}: + /shared/projects/lcsection/{projectId}/{title}/{date}: get: summary: Retourne la liste de sections de LC avec un titre donné tags: @@ -173,7 +180,7 @@ paths: description: the name of lc section - in: path name: date - required: true + required: false schema: type: string description: the date corresponding to the wanted version of lc section @@ -198,7 +205,7 @@ paths: "401": description: Authorization information is missing or invalid - /projects/entrepreneurs/{projectId}: + /shared/projects/entrepreneurs/{projectId}: get: summary: Retourne la liste d'entrepreneurs associée à un projet donné tags: @@ -224,14 +231,15 @@ paths: schema: type: array items: - type: string + $ref: "#/components/schemas/user-entrepreneur" "400": description: Bad request "401": description: Authorization information is missing or invalid - /projects/contacts/entrepreneurs/{projectId}: + + /shared/projects/admin/{projectId}: get: - summary: Retourne la liste des contactes d'entrepreneurs associée à un projet donné + summary: Retourne les inforùations de l'admin qui accompagne le projet tags: - Shared API security: @@ -239,9 +247,8 @@ paths: - MyINPulse-admin - MyINPulse-entrepreneur description: - JSON array of contacts for - each participant in the project with id - projectID. + JSON object containing information (name, gmail, tel, etc..) + the admin supervising the project with id projectID. parameters: - in: path name: projectId @@ -254,64 +261,16 @@ paths: content: application/json: schema: - type: array - items: - type: object - properties: - name: - type: string - email: - type: string - tel: - type: string + $ref: "#/components/schemas/user-admin" "400": description: Bad request "401": description: Authorization information is missing or invalid - /projects/contacts/admin/{projectId}: + /shared/projects/appointments/{projectId}: get: - summary: Retourne les contacts de l'admin que accompagne le projet - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - JSON object containing contact information (name, gmail, tel, etc..) - the admin supervising the project with id - projectID. - parameters: - - in: path - name: projectId - schema: - type: integer - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - type: object - properties: - name: - type: string - email: - type: string - tel: - type: string - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /projects/appointments/{projectId}: - get: - summary: Retourne les rendez-vous du project + summary: Retourne les rendez-vous du projet tags: - Shared API security: @@ -350,7 +309,7 @@ paths: "401": description: Authorization information is missing or invalid - /projects/appointments/report/{apointementId}: + /shared/projects/appointments/report/{apointementId}: get: summary: Retourne le rapport pdf du rendez-vous tags: @@ -382,7 +341,7 @@ paths: description: Authorization information is missing or invalid - /projects/request: + /entrepreneur/projects/request: post: summary: demander la création et validation d'un projet tags: @@ -404,7 +363,7 @@ paths: name: type: string founder: - $ref: "#/components/schemas/founder" + $ref: "#/components/schemas/user-entrepreneur" responses: "200": description: OK @@ -470,12 +429,8 @@ paths: properties: name: type: string - founderName: - type: string - founderEmail: - type: string - school: - type: string + founder: + $ref: "#/components/schemas/user-entrepreneur" responses: "200": @@ -513,7 +468,7 @@ paths: description: Authorization information is missing or invalid - /lcsection/add/{projectId}: + /entrepreneur/lcsection/add/{projectId}: post: summary: ajouter une sections au LC description: @@ -549,7 +504,7 @@ paths: "401": description: Authorization information is missing or invalid - /lcsection/modify/{sectionId}: + /entrepreneur/lcsection/modify/{sectionId}: put: summary: modifier les données d'une section LC description: @@ -587,7 +542,7 @@ paths: description: Authorization information is missing or invalid - /lcsection/remove/{sectionId}: + /entrepreneur/lcsection/remove/{sectionId}: delete: summary: supprimer une section LC. description: @@ -612,7 +567,7 @@ paths: description: Authorization information is missing or invalid - /appointments/request: + /shared/appointments/request: post: summary: demander une rendez-vous description: @@ -696,6 +651,4 @@ paths: "401": description: Authorization information is missing or invalid - - - \ No newline at end of file + \ No newline at end of file From b355463dd911fe4fe4a26eb3b5749363f31a22c5 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Tue, 25 Feb 2025 22:34:33 +0100 Subject: [PATCH 03/11] docs: added needed modications and reorganized yaml file --- .../openapi/main.yaml | 514 ++++++++++-------- 1 file changed, 295 insertions(+), 219 deletions(-) rename {MyINPulse-back/src/main/resources => Documentation}/openapi/main.yaml (83%) diff --git a/MyINPulse-back/src/main/resources/openapi/main.yaml b/Documentation/openapi/main.yaml similarity index 83% rename from MyINPulse-back/src/main/resources/openapi/main.yaml rename to Documentation/openapi/main.yaml index fd8d645..00dc3d4 100644 --- a/MyINPulse-back/src/main/resources/openapi/main.yaml +++ b/Documentation/openapi/main.yaml @@ -59,6 +59,14 @@ components: MyINPulse-entrepreneur: Utilisateur paths: + +# _ ____ __ __ ___ _ _ _ ____ ___ +# / \ | _ \| \/ |_ _| \ | | / \ | _ \_ _| +# / _ \ | | | | |\/| || || \| | / _ \ | |_) | | +# / ___ \| |_| | | | || || |\ | / ___ \| __/| | +# /_/ \_\____/|_| |_|___|_| \_| /_/ \_\_| |___| +# + /admin/projects: get: summary: Retourne la liste of projets associés à l'admin @@ -90,37 +98,182 @@ paths: description: Bad request "401": description: Authorization information is missing or invalid - - /admin/appointments/upcoming: - get: - summary: Retourne la list des prochains rendez-vous de l'admin - tags: + /admin/projects/pending/decision: + post: + summary: valider un projet en attente de validation + tags: - Admin API - security: - - MyINPulse: - - MyINPulse-admin description: - JSON array of upcoming appointment data (name, date, time etc..) for an admin. + if the request is accepted the status of the + project is changed to ongoing, entrepreneur + account is confirmed and the project is linked + to the admin accepting the request and the + entrepreneur requesting it. Else the pending + project and user info are deleted. + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + pedingProjectId: + type: integer + decision: + type: boolean + responses: - "200": + "200": description: OK - content: - application/json: - schema: - type: array - items: - type: object - properties: - name: - type: string - date: - type: string - time: - type: string "400": description: Bad request "401": - description: Authorization information is missing or invalid + description: Authorization information is + missing or invalid + + /admin/projects/add: + post: + summary: Ajout manuel d'un projet + description: + Adds a project with the + inputed details + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + founder: + $ref: "#/components/schemas/user-entrepreneur" + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/appointments/report/{appointmentId}: + put: + summary: enregistrer un rapport du rendez-vous + description: + Generate a PDF file formatted + from input text and links it + to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + body: + type: string + conclusion: + type: string + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + post: + summary: modifier un rapport déja éxistant du rendez-vous + description: + Modifies the report file to input + text and links it to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + body: + type: string + conclusion: + type: string + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + + /admin/projects/remove/{projectId}: + delete: + summary: supression d'un project + description: + Removes the project + with the inputed id projectId + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: projectId + required: true + schema: + type: integer + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/projects/pending: get: summary: Retourne la liste des projets en attente de validation @@ -151,8 +304,48 @@ paths: description: Bad request "401": description: Authorization information is missing or invalid - - /shared/projects/lcsection/{projectId}/{title}/{date}: + +# +# ____ _ _ _ ____ ___ +# / ___|| |__ __ _ _ __ ___ __| | / \ | _ \_ _| +# \___ \| '_ \ / _` | '__/ _ \/ _` | / _ \ | |_) | | +# ___) | | | | (_| | | | __/ (_| | / ___ \| __/| | +# |____/|_| |_|\__,_|_| \___|\__,_| /_/ \_\_| |___| +# + + /shared/appointments/upcoming: + get: + summary: Retourne la list des prochains rendez-vous de l'utilisateur + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of upcoming appointment data (name, date, time etc..) for a user. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + name: + type: string + date: + type: string + time: + type: string + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /shared/projects/lcsection/{projectId}: get: summary: Retourne la liste de sections de LC avec un titre donné tags: @@ -172,18 +365,19 @@ paths: schema: type: integer required: true - - in: path - name: title - schema: - type: string - required: true - description: the name of lc section - - in: path - name: date - required: false - schema: - type: string - description: the date corresponding to the wanted version of lc section + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: integer + description: the number associated with the title of the lcsection + date: + type: string + description: the date corresponding to the wanted version of lc section responses: "200": description: OK @@ -239,7 +433,7 @@ paths: /shared/projects/admin/{projectId}: get: - summary: Retourne les inforùations de l'admin qui accompagne le projet + summary: Retourne les informations de l'admin qui accompagne le projet tags: - Shared API security: @@ -340,7 +534,65 @@ paths: "401": description: Authorization information is missing or invalid - + + /shared/appointments/request: + post: + summary: demander un rendez-vous + description: + will add an appointement request request by the applicant + to have an appointment to be confirmed or denied by the + specified participants of the appointement. + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-entrepreneur + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + start_time: + type: string + end_time: + type: string + place: + type: string + applicantId: + type: integer + participants: + type: array + items: + type: integer + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + + +# _____ _ _ _____ ____ _____ ____ ____ _____ _ _ _____ _ _ ____ +# | ____| \ | |_ _| _ \| ____| _ \| _ \| ____| \ | | ____| | | | _ \ +# | _| | \| | | | | |_) | _| | |_) | |_) | _| | \| | _| | | | | |_) | +# | |___| |\ | | | | _ <| |___| __/| _ <| |___| |\ | |___| |_| | _ < +# |_____|_|_\_| |_| |_| \_\_____|_| |_| \_\_____|_| \_|_____|\___/|_| \_\ +# / \ | _ \_ _| +# / _ \ | |_) | | +# / ___ \| __/| | +# /_/ \_\_| |___| +# + + /entrepreneur/projects/request: post: summary: demander la création et validation d'un projet @@ -373,101 +625,7 @@ paths: description: Authorization information is missing or invalid - /admin/projects/pending/decision: - post: - summary: valider un projet en attente de validation - tags: - - Admin API - description: - if the request is accepted the status of the - project is changed to ongoing, entrepreneur - account is confirmed and the project is linked - to the admin accepting the request and the - entrepreneur requesting it. Else the pending - project and user info are deleted. - security: - - MyINPulse: - - MyINPulse-admin - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - pedingProjectId: - type: integer - decision: - type: boolean - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /admin/projects/add: - post: - summary: Ajout mannuel d'un projet - description: - Adds a project with the - inputed details - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - name: - type: string - founder: - $ref: "#/components/schemas/user-entrepreneur" - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /admin/projects/remove/{projectId}: - delete: - summary: supression d'un project - description: - Removes the project - with the inputed id projectId - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - parameters: - - in: path - name: projectId - required: true - schema: - type: integer - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - + /entrepreneur/lcsection/add/{projectId}: post: summary: ajouter une sections au LC @@ -567,88 +725,6 @@ paths: description: Authorization information is missing or invalid - /shared/appointments/request: - post: - summary: demander une rendez-vous - description: - will add an appointement request request by the applicant - to have an appointment to be confirmed or denied by the - specified participants of the appointement. - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-entrepreneur - - MyINPulse-admin - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - title: - type: string - start_time: - type: string - end_time: - type: string - place: - type: string - applicantId: - type: integer - participants: - type: array - items: - type: integer - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /admin/appointments/report/{appointmentId}: - post: - summary: enregistrer une rapport du rendez-vous - description: - Generate a PDF file formatted - from input text and links it - to the appointement. - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - parameters: - - in: path - name: appointmentId - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - title: - type: string - body: - type: string - conclusion: - type: string - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid + + \ No newline at end of file From 067eeb9494774054c580e982285a1acb3381f377 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Wed, 26 Feb 2025 11:31:45 +0100 Subject: [PATCH 04/11] docs: added examples and changed some weird character --- Documentation/openapi/main.yaml | 53 ++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/Documentation/openapi/main.yaml b/Documentation/openapi/main.yaml index 00dc3d4..263e9ab 100644 --- a/Documentation/openapi/main.yaml +++ b/Documentation/openapi/main.yaml @@ -24,10 +24,13 @@ components: type: string email: type: string - scondaryEmail: + example: "example@exmaple.com" + secondaryEmail: type: string + example: "example@exmaple.com" tel: type: string + example: "0612345678" user-entrepreneur: type: object properties: @@ -36,12 +39,15 @@ components: entrepreneur: type: object properties: - ecole: + ecole: type: string + example: "enseirb" filiere: type: string + example: "info" status: - type: string + type: boolean + example: false user-admin: type: object properties: @@ -76,7 +82,7 @@ paths: - MyINPulse: - MyINPulse-admin description: - JSON array of who’s elements are objects containing necessary information for the view + JSON array of who's elements are objects containing necessary information for the view (project name, entrepreneur names, etc..) of the projects an admin is watching over. responses: @@ -283,7 +289,7 @@ paths: - MyINPulse: - MyINPulse-admin description: - JSON array of who’s elements are objects containing + JSON array of who's elements are objects containing necessary information for the view (project name, entrepreneur names, etc..) of all pending projects. responses: @@ -345,7 +351,7 @@ paths: "401": description: Authorization information is missing or invalid - /shared/projects/lcsection/{projectId}: + /shared/projects/lcsection/{projectId}/{title}/{date}: get: summary: Retourne la liste de sections de LC avec un titre donné tags: @@ -361,23 +367,26 @@ paths: date parameter is passed) parameters: - in: path + required: true name: projectId schema: type: integer + - in: path required: true - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - title: - type: integer - description: the number associated with the title of the lcsection - date: - type: string - description: the date corresponding to the wanted version of lc section + description: this number can be 1, 2,...,8. It is associated with the title of the lcsection + name: title + schema: + type: integer + enum: [1, 2, 3, 4, 5, 6, 7, 8] + + - in: path + required: true + name: date + description: the date corresponding to the wanted version of lc section. "Nan" for the latest version + example: "NaN" + schema: + type: string + responses: "200": description: OK @@ -549,6 +558,7 @@ paths: - MyINPulse-entrepreneur - MyINPulse-admin requestBody: + description: \"participants\" property is an array containing userids of the participants in the appointement required: true content: application/json: @@ -566,10 +576,11 @@ paths: applicantId: type: integer participants: + #/* */ type: array items: type: integer - + responses: "200": description: OK @@ -630,7 +641,7 @@ paths: post: summary: ajouter une sections au LC description: - Adds input data to the user’s LC + Adds input data to the user's LC with a specified title. tags: - Entrepreneurs API From 8491c9b3cfdc54da1d3d61205e0ce58fea804412 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Wed, 19 Mar 2025 22:02:28 +0100 Subject: [PATCH 05/11] added minor change --- .../ServiceTests/AdminApiServiceTest.java | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java diff --git a/MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java b/MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java new file mode 100644 index 0000000..abd21fb --- /dev/null +++ b/MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java @@ -0,0 +1,173 @@ +package enseirb.myinpulse; + +import static enseirb.myinpulse.model.ProjectDecisionValue.*; + +import static org.junit.jupiter.api.Assertions.*; + +import enseirb.myinpulse.model.Administrator; +import enseirb.myinpulse.model.Project; +import enseirb.myinpulse.model.ProjectDecision; +import enseirb.myinpulse.service.AdminApiService; +import enseirb.myinpulse.service.database.AdministratorService; +import enseirb.myinpulse.service.database.ProjectService; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@SpringBootTest +@Transactional +public class AdminApiServiceTest { + private static long administratorid; + @Autowired private AdminApiService adminApiService; + @Autowired private ProjectService projectService; + + @BeforeAll + static void setup( + @Autowired AdministratorService administratorService, + @Autowired ProjectService projectService) { + administratorService.addAdministrator( + new Administrator( + "admin", + "admin", + "testAdminEmpty@example.com", + "testAdmin@example.com", + "")); + Administrator a = + administratorService.addAdministrator( + new Administrator( + "admin2", + "admin2", + "testAdminFull@example.com", + "testAdmin@example.com", + "")); + administratorid = a.getIdUser(); + projectService.addNewProject( + new Project( + "sampleProjectAdminApiService", + null, + LocalDate.now(), + ACTIVE, + administratorService.getAdministratorByPrimaryMain( + "testAdminFull@example.com"))); + } + + private List IterableToList(Iterable iterable) { + List l = new ArrayList<>(); + iterable.forEach(l::add); + return l; + } + + @Test + void getProjectOfAdminIsEmpty() { + Iterable projects = + adminApiService.getProjectsOfAdmin("testAdminEmpty@example.com"); + assertEquals(0, IterableToList(projects).size()); + } + + @Test + void getProjectOfInexistantAdminFails() { + String nonExistentAdminEmail = "testInexistantAdmin@example.com"; + + assertThrows( + ResponseStatusException.class, + () -> { + adminApiService.getProjectsOfAdmin(nonExistentAdminEmail); + }); + } + + @Test + void getProjectOfAdminNotEmpty() { + Iterable projects = + adminApiService.getProjectsOfAdmin("testAdminFull@example.com"); + List l = IterableToList(projects); + assertEquals(1, l.size()); + Project p = l.getFirst(); + assertEquals(p.getProjectName(), "sampleProjectAdminApiService"); + } + + @Test + void getPendingProjectsEmpty() { + assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); + } + + @Test + void getPendingProjectsNotEmpty() { + this.projectService.addNewProject( + new Project( + "PendingProjectAdminApiService1", null, LocalDate.now(), PENDING, null)); + this.projectService.addNewProject( + new Project( + "PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null)); + Iterable pendingProjects = this.adminApiService.getPendingProjects(); + List pendingProjectsList = IterableToList(pendingProjects); + assertEquals(2, pendingProjectsList.size()); + assertTrue( + List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2") + .contains(pendingProjectsList.getFirst().getProjectName())); + assertTrue( + List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2") + .contains(pendingProjectsList.getLast().getProjectName())); + } + + @Test + void validateInexistantProject() { + ProjectDecision d = new ProjectDecision(-1, 0, 1); + assertThrows(ResponseStatusException.class, () -> this.adminApiService.validateProject(d)); + } + + @Test + void validateExistantProject() { + Project p = + new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); + this.projectService.addNewProject(p); + assertEquals(PENDING, p.getProjectStatus()); + ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 1); + this.adminApiService.validateProject(d); + assertEquals(ACTIVE, p.getProjectStatus()); + + // Check if the project was really updated in the database + assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); + } + + @Test + void refuseExistantProject() { + Project p = + new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); + this.projectService.addNewProject(p); + assertEquals(PENDING, p.getProjectStatus()); + ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 0); + this.adminApiService.validateProject(d); + assertEquals(REJECTED, p.getProjectStatus()); + + // Check if the project was really updated in the database + assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); + } + + @Test + void addProject() { + assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); + Project p1 = + new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); + this.adminApiService.addNewProject(p1); + + assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size()); + } + + @Test + void addDuplicateProject() { + Project p1 = + new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); + Project p2 = + new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); + this.adminApiService.addNewProject(p1); + assertThrows(ResponseStatusException.class, () -> this.adminApiService.addNewProject(p2)); + } +} From eccf116f49e256ddaf9b153b75db88dcfa72a1d9 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Thu, 20 Mar 2025 19:11:32 +0100 Subject: [PATCH 06/11] feat: added swagger-ui to read docs and test api, fix: minor changes to yaml file, more to come --- Documentation/openapi/main.yaml | 41 +- Documentation/openapi/swagger-ui/main.js | 14 + .../openapi/swagger-ui/package-lock.json | 884 ++++++++++++++++++ Documentation/openapi/swagger-ui/package.json | 17 + 4 files changed, 936 insertions(+), 20 deletions(-) create mode 100644 Documentation/openapi/swagger-ui/main.js create mode 100644 Documentation/openapi/swagger-ui/package-lock.json create mode 100644 Documentation/openapi/swagger-ui/package.json diff --git a/Documentation/openapi/main.yaml b/Documentation/openapi/main.yaml index 263e9ab..67f878c 100644 --- a/Documentation/openapi/main.yaml +++ b/Documentation/openapi/main.yaml @@ -53,6 +53,24 @@ components: properties: admin: $ref: "#/components/schemas/user" + lcsection: + type: object + properties: + title: + type: string + txt: + type: string + projects: + type: object + properties: + idProject: + type: integer + projectName: + type: string + creationDate: + type: string + + securitySchemes: MyINPulse: @@ -395,14 +413,7 @@ paths: schema: type: array items: - type: object - properties: - section: - type: string - txt: - type: string - time: - type: string + $ref: "#/components/schemas/lcsection" "400": description: Bad request "401": @@ -659,12 +670,7 @@ paths: content: application/json: schema: - type: object - properties: - title: - type: string - txt: - type: string + $ref: "#/components/schemas/lcsection" responses: "200": description: OK @@ -696,12 +702,7 @@ paths: content: application/json: schema: - type: object - properties: - title: - type: string - txt: - type: string + $ref: "#/components/schemas/lcsection" responses: "200": description: OK diff --git a/Documentation/openapi/swagger-ui/main.js b/Documentation/openapi/swagger-ui/main.js new file mode 100644 index 0000000..2e2850d --- /dev/null +++ b/Documentation/openapi/swagger-ui/main.js @@ -0,0 +1,14 @@ +const express = require("express"); +const swaggerUi = require("swagger-ui-express"); +const yaml = require("js-yaml"); +const fs = require("fs"); + +const app = express(); + +const swaggerDocument = yaml.load(fs.readFileSync("../main.yaml", "utf8")); + +app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument)); + +app.listen(3000, () => { + console.log("Swagger UI running at http://localhost:3000/api-docs"); +}); diff --git a/Documentation/openapi/swagger-ui/package-lock.json b/Documentation/openapi/swagger-ui/package-lock.json new file mode 100644 index 0000000..bf4f6c3 --- /dev/null +++ b/Documentation/openapi/swagger-ui/package-lock.json @@ -0,0 +1,884 @@ +{ + "name": "swagger-ui", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "swagger-ui", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.21.2", + "js-yaml": "^4.1.0", + "swagger-ui-express": "^5.0.1" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.20.1.tgz", + "integrity": "sha512-qBPCis2w8nP4US7SvUxdJD3OwKcqiWeZmjN2VWhq2v+ESZEXOP/7n4DeiOiiZcGYTKMHAHUUrroHaTsjUWTEGw==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/Documentation/openapi/swagger-ui/package.json b/Documentation/openapi/swagger-ui/package.json new file mode 100644 index 0000000..282a1d6 --- /dev/null +++ b/Documentation/openapi/swagger-ui/package.json @@ -0,0 +1,17 @@ +{ + "name": "swagger-ui", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "express": "^4.21.2", + "js-yaml": "^4.1.0", + "swagger-ui-express": "^5.0.1" + } +} From d0b615c59def53a42fb4c80edbcbf8479e16e694 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Fri, 21 Mar 2025 09:42:57 +0100 Subject: [PATCH 07/11] fix: the endpoints reflect the db models and changes since the last version of the doc, notes.md indicate some changes that are needed to happen in the controller and questions to be discussed --- .gitignore | 2 + .../openapi/main.yaml | 180 ++++++++---------- documentation/openapi/notes.md | 47 +++++ .../openapi/swagger-ui/main.js | 0 .../openapi/swagger-ui/package-lock.json | 0 .../openapi/swagger-ui/package.json | 0 6 files changed, 126 insertions(+), 103 deletions(-) rename {Documentation => documentation}/openapi/main.yaml (85%) create mode 100644 documentation/openapi/notes.md rename {Documentation => documentation}/openapi/swagger-ui/main.js (100%) rename {Documentation => documentation}/openapi/swagger-ui/package-lock.json (100%) rename {Documentation => documentation}/openapi/swagger-ui/package.json (100%) diff --git a/.gitignore b/.gitignore index 170ba0d..9a2dba3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .idea keycloak/CAS/target docker-compose.yaml +node_modules +.vscode \ No newline at end of file diff --git a/Documentation/openapi/main.yaml b/documentation/openapi/main.yaml similarity index 85% rename from Documentation/openapi/main.yaml rename to documentation/openapi/main.yaml index 67f878c..f567a74 100644 --- a/Documentation/openapi/main.yaml +++ b/documentation/openapi/main.yaml @@ -18,49 +18,55 @@ components: user: type: object properties: - nom: + idUser: + type: integer + userSurname: type: string - prenom: + userName: type: string - email: + primaryMail: type: string example: "example@exmaple.com" - secondaryEmail: + secondaryMail: type: string example: "example@exmaple.com" - tel: + phoneNumber: type: string example: "0612345678" + user-entrepreneur: - type: object - properties: - user: - $ref: "#/components/schemas/user" - entrepreneur: - type: object - properties: - ecole: + allOf: + - $ref: "#/components/schemas/user" + - type: object + properties: + school: type: string example: "enseirb" - filiere: + course: type: string example: "info" - status: + sneeStatus: type: boolean example: false + user-admin: + allOf: + - $ref: "#/components/schemas/user" + + sectionCell: type: object properties: - admin: - $ref: "#/components/schemas/user" - lcsection: - type: object - properties: - title: + idSectionCell: + type: integer + example: this the cell (postit id) + sectionId: + type: integer + contentSectionCell: type: string - txt: + modificationDate: type: string - projects: + + project: type: object properties: idProject: @@ -69,6 +75,33 @@ components: type: string creationDate: type: string + logo: + example: to be discussed not yet fixed + type: string + format: binary + + report: + type: object + properties: + idReport: + type: integer + reportContent: + type: string + + appointement: + type: object + properties: + appointmentDate: + type: string + appointmentTime: + type: string + appointmentDuration: + type: string + appointmentPlace: + type: string + appointmentSubject: + type: string + @@ -111,13 +144,7 @@ paths: schema: type: array items: - type: object - properties: - name: - type: string - E_names: - type: string - description: entrepreneur names + $ref: "#/components/schemas/project" "400": description: Bad request "401": @@ -174,12 +201,7 @@ paths: content: application/json: schema: - type: object - properties: - name: - type: string - founder: - $ref: "#/components/schemas/user-entrepreneur" + $ref: "#/components/schemas/project" responses: "200": @@ -213,14 +235,7 @@ paths: content: application/json: schema: - type: object - properties: - title: - type: string - body: - type: string - conclusion: - type: string + $ref: "#/components/schemas/report" responses: "200": @@ -251,14 +266,7 @@ paths: content: application/json: schema: - type: object - properties: - title: - type: string - body: - type: string - conclusion: - type: string + $ref: "#/components/schemas/report" responses: "200": @@ -308,8 +316,8 @@ paths: - MyINPulse-admin description: JSON array of who's elements are objects containing - necessary information for the view (project name, - entrepreneur names, etc..) of all pending projects. + necessary information for the view (project name, etc..) + of all pending projects. responses: "200": description: OK @@ -318,12 +326,7 @@ paths: schema: type: array items: - type: object - properties: - name: - type: string - founder: - $ref: "#/components/schemas/user-entrepreneur" + $ref: "#/components/schemas/project" "400": description: Bad request "401": @@ -356,20 +359,13 @@ paths: schema: type: array items: - type: object - properties: - name: - type: string - date: - type: string - time: - type: string + $ref: "#/components/schemas/appointement" "400": description: Bad request "401": description: Authorization information is missing or invalid - /shared/projects/lcsection/{projectId}/{title}/{date}: + /shared/projects/sectionCell/{projectId}/{sectionId}/{date}: get: summary: Retourne la liste de sections de LC avec un titre donné tags: @@ -391,12 +387,11 @@ paths: type: integer - in: path required: true - description: this number can be 1, 2,...,8. It is associated with the title of the lcsection - name: title + description: this number can be 1, 2,...,8. It is associated with the title of the sectionCell + name: sectionId schema: type: integer - enum: [1, 2, 3, 4, 5, 6, 7, 8] - + enum: [1, 2, 3, 4, 5, 6, 7, 8] - in: path required: true name: date @@ -413,7 +408,7 @@ paths: schema: type: array items: - $ref: "#/components/schemas/lcsection" + $ref: "#/components/schemas/sectionCell" "400": description: Bad request "401": @@ -508,22 +503,13 @@ paths: schema: type: array items: - type: object - properties: - appointementId: - type: integer - name: - type: string - date: - type: string - time: - type: string + $ref: "#/components/schemas/appointement" "400": description: Bad request "401": description: Authorization information is missing or invalid - /shared/projects/appointments/report/{apointementId}: + /shared/projects/appointments/report/{appointmentId}: get: summary: Retourne le rapport pdf du rendez-vous tags: @@ -648,7 +634,7 @@ paths: missing or invalid - /entrepreneur/lcsection/add/{projectId}: + /entrepreneur/sectionCell/add: post: summary: ajouter une sections au LC description: @@ -659,18 +645,12 @@ paths: security: - MyINPulse: - MyINPulse-entrepreneur - parameters: - - in: path - name: projectId - schema: - type: integer - required: true requestBody: required: true content: application/json: schema: - $ref: "#/components/schemas/lcsection" + $ref: "#/components/schemas/sectionCell" responses: "200": description: OK @@ -679,7 +659,7 @@ paths: "401": description: Authorization information is missing or invalid - /entrepreneur/lcsection/modify/{sectionId}: + /entrepreneur/sectionCell/modify: put: summary: modifier les données d'une section LC description: @@ -691,18 +671,12 @@ paths: security: - MyINPulse: - MyINPulse-entrepreneur - parameters: - - in: path - name: sectionId - schema: - type: integer - required: true requestBody: required: true content: application/json: schema: - $ref: "#/components/schemas/lcsection" + $ref: "#/components/schemas/sectionCell" responses: "200": description: OK @@ -712,7 +686,7 @@ paths: description: Authorization information is missing or invalid - /entrepreneur/lcsection/remove/{sectionId}: + /entrepreneur/sectionCell/remove/{sectionCellId}: delete: summary: supprimer une section LC. description: @@ -724,7 +698,7 @@ paths: - MyINPulse-entrepreneur parameters: - in: path - name: sectionId + name: sectionCellId schema: type: integer required: true diff --git a/documentation/openapi/notes.md b/documentation/openapi/notes.md new file mode 100644 index 0000000..b82fa22 --- /dev/null +++ b/documentation/openapi/notes.md @@ -0,0 +1,47 @@ +## API Endpoints notes + +### EntrepreneurApi and SharedApi +#### Endpoint Name Changes +- `/entrepreneur/lcsection/modify/{sectionId}` → `/entrepreneur/sectionCell/modify/{sectionId}` + +### Admin api +- `/admin/appointments/upcoming`: is shared not admin +- `/admin/projects/decision`: instanciates classes with `adminId` instead of taking the id from the token +- `/admin/project/add`: + - point 1: the doc has this `projects` everywhere this should be `/admin/projects/add` to avoid confusion I think + - point 2: this doesn't assiociate users with a project I need to add other endopint for that +- `/admin/appoitements/report/{appointmentId}`: + - typo: `appoitements` → `appointments` +- `/admin/projects/remove/{projectId}`, `/admin/project/add`, `/admin/projects/decision`, `/admin/projects/pending`: + - should need token to delete or add project + +### Entrepreneur api +- `/entrepreneur/sectionCell/modify/{sectionId}`: + - the section-id because of the definition of `sectionCell` schema the `sectionId` is given twice possibly leading to inconsistency. Which is why the path var to be removed: + - → `/entrepreneur/sectionCell/modify` + +### Shared api +- `/shared/project/sectionCell/{projectId}/{sectionId}/{date}`: + - point 1: + same point for `project` → `projects` + - point 2: + have yet to read `sharedApiService` to see how dates are handled and to see if we agree on values of `date` to make it so it gets the version relative to current date +- `/shared/entrepreneurs/{projectId}`: + - maybe change to `/shared/projects/entrepreneurs/{projectId}` to match other similair endpoints like `/shared/projects/admin/{projectId}` +- `/shared/appointment/request`: + - creates the apointement but don't know how it associates other users, potentially multiple classes in one request body, is that possible ? + +## TODOs for me + +### list 1: +- add back-end server links (backend and auth) for interacting with api through swagger +- get config for that set up in the project + +### list 2: +- see what to do about logo img +- see format for date and add it in examples +- ask the form of return of the json of iterables, for now I have put array +- add endpoint for adding users to a project +- update endpoint descriptions +- add examples for values in schemas + diff --git a/Documentation/openapi/swagger-ui/main.js b/documentation/openapi/swagger-ui/main.js similarity index 100% rename from Documentation/openapi/swagger-ui/main.js rename to documentation/openapi/swagger-ui/main.js diff --git a/Documentation/openapi/swagger-ui/package-lock.json b/documentation/openapi/swagger-ui/package-lock.json similarity index 100% rename from Documentation/openapi/swagger-ui/package-lock.json rename to documentation/openapi/swagger-ui/package-lock.json diff --git a/Documentation/openapi/swagger-ui/package.json b/documentation/openapi/swagger-ui/package.json similarity index 100% rename from Documentation/openapi/swagger-ui/package.json rename to documentation/openapi/swagger-ui/package.json From 60ec920cff7b79799f1428530dc9283458d76c73 Mon Sep 17 00:00:00 2001 From: MAILLAL Anas Date: Sun, 23 Mar 2025 17:12:31 +0100 Subject: [PATCH 08/11] fix: split openapi src files and made bash file to run --- documentation/openapi/main.yaml | 716 --------- documentation/openapi/run_doc.sh | 11 + documentation/openapi/src/adminApi.yaml | 214 +++ documentation/openapi/src/bundled.yaml | 596 ++++++++ .../openapi/src/entrepreneurApi.yaml | 121 ++ documentation/openapi/src/main.yaml | 114 ++ documentation/openapi/src/models.yaml | 88 ++ documentation/openapi/src/sharedApi.yaml | 254 ++++ documentation/openapi/swagger-ui/main.js | 2 +- .../openapi/swagger-ui/package-lock.json | 1295 +++++++++++++++++ documentation/openapi/swagger-ui/package.json | 6 +- 11 files changed, 2699 insertions(+), 718 deletions(-) delete mode 100644 documentation/openapi/main.yaml create mode 100755 documentation/openapi/run_doc.sh create mode 100644 documentation/openapi/src/adminApi.yaml create mode 100644 documentation/openapi/src/bundled.yaml create mode 100644 documentation/openapi/src/entrepreneurApi.yaml create mode 100644 documentation/openapi/src/main.yaml create mode 100644 documentation/openapi/src/models.yaml create mode 100644 documentation/openapi/src/sharedApi.yaml diff --git a/documentation/openapi/main.yaml b/documentation/openapi/main.yaml deleted file mode 100644 index f567a74..0000000 --- a/documentation/openapi/main.yaml +++ /dev/null @@ -1,716 +0,0 @@ -openapi: 3.0.3 -info: - title: MyInpulse Backend Api - description: this document servers as a documentation for the backend api. - version: 0.0.0 - -tags: - - name: Entrepreneurs API - description: La partie de l'api dédiée aux entrepreneurs - - name: Admin API - description: La partie de l'api dédiée aux entrepreneurs - - name: Shared API - description: La partie de l'api dédiée aux entrepreneurs et admins - - -components: - schemas: - user: - type: object - properties: - idUser: - type: integer - userSurname: - type: string - userName: - type: string - primaryMail: - type: string - example: "example@exmaple.com" - secondaryMail: - type: string - example: "example@exmaple.com" - phoneNumber: - type: string - example: "0612345678" - - user-entrepreneur: - allOf: - - $ref: "#/components/schemas/user" - - type: object - properties: - school: - type: string - example: "enseirb" - course: - type: string - example: "info" - sneeStatus: - type: boolean - example: false - - user-admin: - allOf: - - $ref: "#/components/schemas/user" - - sectionCell: - type: object - properties: - idSectionCell: - type: integer - example: this the cell (postit id) - sectionId: - type: integer - contentSectionCell: - type: string - modificationDate: - type: string - - project: - type: object - properties: - idProject: - type: integer - projectName: - type: string - creationDate: - type: string - logo: - example: to be discussed not yet fixed - type: string - format: binary - - report: - type: object - properties: - idReport: - type: integer - reportContent: - type: string - - appointement: - type: object - properties: - appointmentDate: - type: string - appointmentTime: - type: string - appointmentDuration: - type: string - appointmentPlace: - type: string - appointmentSubject: - type: string - - - - - securitySchemes: - MyINPulse: - type: oauth2 - flows: - implicit: - authorizationUrl: https://petstore3.swagger.io/oauth/authorize - scopes: - MyINPulse-admin: Administrateur - MyINPulse-entrepreneur: Utilisateur - -paths: - -# _ ____ __ __ ___ _ _ _ ____ ___ -# / \ | _ \| \/ |_ _| \ | | / \ | _ \_ _| -# / _ \ | | | | |\/| || || \| | / _ \ | |_) | | -# / ___ \| |_| | | | || || |\ | / ___ \| __/| | -# /_/ \_\____/|_| |_|___|_| \_| /_/ \_\_| |___| -# - - /admin/projects: - get: - summary: Retourne la liste of projets associés à l'admin - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - description: - JSON array of who's elements are objects containing necessary information for the view - (project name, entrepreneur names, etc..) - of the projects an admin is watching over. - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/project" - "400": - description: Bad request - "401": - description: Authorization information is missing or invalid - /admin/projects/pending/decision: - post: - summary: valider un projet en attente de validation - tags: - - Admin API - description: - if the request is accepted the status of the - project is changed to ongoing, entrepreneur - account is confirmed and the project is linked - to the admin accepting the request and the - entrepreneur requesting it. Else the pending - project and user info are deleted. - security: - - MyINPulse: - - MyINPulse-admin - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - pedingProjectId: - type: integer - decision: - type: boolean - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /admin/projects/add: - post: - summary: Ajout manuel d'un projet - description: - Adds a project with the - inputed details - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/project" - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /admin/appointments/report/{appointmentId}: - put: - summary: enregistrer un rapport du rendez-vous - description: - Generate a PDF file formatted - from input text and links it - to the appointement. - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - parameters: - - in: path - name: appointmentId - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/report" - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - post: - summary: modifier un rapport déja éxistant du rendez-vous - description: - Modifies the report file to input - text and links it to the appointement. - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - parameters: - - in: path - name: appointmentId - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/report" - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - - /admin/projects/remove/{projectId}: - delete: - summary: supression d'un project - description: - Removes the project - with the inputed id projectId - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - parameters: - - in: path - name: projectId - required: true - schema: - type: integer - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - - /admin/projects/pending: - get: - summary: Retourne la liste des projets en attente de validation - tags: - - Admin API - security: - - MyINPulse: - - MyINPulse-admin - description: - JSON array of who's elements are objects containing - necessary information for the view (project name, etc..) - of all pending projects. - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/project" - "400": - description: Bad request - "401": - description: Authorization information is missing or invalid - -# -# ____ _ _ _ ____ ___ -# / ___|| |__ __ _ _ __ ___ __| | / \ | _ \_ _| -# \___ \| '_ \ / _` | '__/ _ \/ _` | / _ \ | |_) | | -# ___) | | | | (_| | | | __/ (_| | / ___ \| __/| | -# |____/|_| |_|\__,_|_| \___|\__,_| /_/ \_\_| |___| -# - - /shared/appointments/upcoming: - get: - summary: Retourne la list des prochains rendez-vous de l'utilisateur - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - JSON array of upcoming appointment data (name, date, time etc..) for a user. - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/appointement" - "400": - description: Bad request - "401": - description: Authorization information is missing or invalid - - /shared/projects/sectionCell/{projectId}/{sectionId}/{date}: - get: - summary: Retourne la liste de sections de LC avec un titre donné - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - JSON array containing Lean Canvas - section data with a title for the - current date (or given date if the - date parameter is passed) - parameters: - - in: path - required: true - name: projectId - schema: - type: integer - - in: path - required: true - description: this number can be 1, 2,...,8. It is associated with the title of the sectionCell - name: sectionId - schema: - type: integer - enum: [1, 2, 3, 4, 5, 6, 7, 8] - - in: path - required: true - name: date - description: the date corresponding to the wanted version of lc section. "Nan" for the latest version - example: "NaN" - schema: - type: string - - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/sectionCell" - "400": - description: Bad request - "401": - description: Authorization information is missing or invalid - - /shared/projects/entrepreneurs/{projectId}: - get: - summary: Retourne la liste d'entrepreneurs associée à un projet donné - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - JSON array of entrepreneur - names associated with a project - parameters: - - in: path - name: projectId - schema: - type: integer - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/user-entrepreneur" - "400": - description: Bad request - "401": - description: Authorization information is missing or invalid - - /shared/projects/admin/{projectId}: - get: - summary: Retourne les informations de l'admin qui accompagne le projet - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - JSON object containing information (name, gmail, tel, etc..) - the admin supervising the project with id projectID. - parameters: - - in: path - name: projectId - schema: - type: integer - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/user-admin" - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /shared/projects/appointments/{projectId}: - get: - summary: Retourne les rendez-vous du projet - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - JSON array of upcoming and past appointment - data for the project with id projectID. - parameters: - - in: path - name: projectId - schema: - type: integer - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/appointement" - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - /shared/projects/appointments/report/{appointmentId}: - get: - summary: Retourne le rapport pdf du rendez-vous - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-admin - - MyINPulse-entrepreneur - description: - PDF file containing the ap- - pointment report - parameters: - - in: path - name: apointementId - schema: - type: integer - required: true - responses: - "200": - description: OK - content: - application/pdf: - schema: - type: string - format: binary - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /shared/appointments/request: - post: - summary: demander un rendez-vous - description: - will add an appointement request request by the applicant - to have an appointment to be confirmed or denied by the - specified participants of the appointement. - tags: - - Shared API - security: - - MyINPulse: - - MyINPulse-entrepreneur - - MyINPulse-admin - requestBody: - description: \"participants\" property is an array containing userids of the participants in the appointement - required: true - content: - application/json: - schema: - type: object - properties: - title: - type: string - start_time: - type: string - end_time: - type: string - place: - type: string - applicantId: - type: integer - participants: - #/* */ - type: array - items: - type: integer - - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - - -# _____ _ _ _____ ____ _____ ____ ____ _____ _ _ _____ _ _ ____ -# | ____| \ | |_ _| _ \| ____| _ \| _ \| ____| \ | | ____| | | | _ \ -# | _| | \| | | | | |_) | _| | |_) | |_) | _| | \| | _| | | | | |_) | -# | |___| |\ | | | | _ <| |___| __/| _ <| |___| |\ | |___| |_| | _ < -# |_____|_|_\_| |_| |_| \_\_____|_| |_| \_\_____|_| \_|_____|\___/|_| \_\ -# / \ | _ \_ _| -# / _ \ | |_) | | -# / ___ \| __/| | -# /_/ \_\_| |___| -# - - - /entrepreneur/projects/request: - post: - summary: demander la création et validation d'un projet - tags: - - Entrepreneurs API - description: - Adds project to pending projects - to then be accepted or rejected by - an admin - security: - - MyINPulse: - - MyINPulse-entrepreneur - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - name: - type: string - founder: - $ref: "#/components/schemas/user-entrepreneur" - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - - /entrepreneur/sectionCell/add: - post: - summary: ajouter une sections au LC - description: - Adds input data to the user's LC - with a specified title. - tags: - - Entrepreneurs API - security: - - MyINPulse: - - MyINPulse-entrepreneur - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/sectionCell" - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - /entrepreneur/sectionCell/modify: - put: - summary: modifier les données d'une section LC - description: - Modifies input Lean Canvas section by changing it to - the information in the request body and changes the - time stamp. - tags: - - Entrepreneurs API - security: - - MyINPulse: - - MyINPulse-entrepreneur - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/sectionCell" - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - /entrepreneur/sectionCell/remove/{sectionCellId}: - delete: - summary: supprimer une section LC. - description: - Deletes section from Lean Canvas - tags: - - Entrepreneurs API - security: - - MyINPulse: - - MyINPulse-entrepreneur - parameters: - - in: path - name: sectionCellId - schema: - type: integer - required: true - responses: - "200": - description: OK - "400": - description: Bad request - "401": - description: Authorization information is - missing or invalid - - - - \ No newline at end of file diff --git a/documentation/openapi/run_doc.sh b/documentation/openapi/run_doc.sh new file mode 100755 index 0000000..353e8bd --- /dev/null +++ b/documentation/openapi/run_doc.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +cd ./swagger-ui + +if [ ! -d "./node_modules/" ] +then + npm install + npm install swagger-cli +fi + +npm start diff --git a/documentation/openapi/src/adminApi.yaml b/documentation/openapi/src/adminApi.yaml new file mode 100644 index 0000000..d5e1a08 --- /dev/null +++ b/documentation/openapi/src/adminApi.yaml @@ -0,0 +1,214 @@ +# _ ____ __ __ ___ _ _ _ ____ ___ +# / \ | _ \| \/ |_ _| \ | | / \ | _ \_ _| +# / _ \ | | | | |\/| || || \| | / _ \ | |_) | | +# / ___ \| |_| | | | || || |\ | / ___ \| __/| | +# /_/ \_\____/|_| |_|___|_| \_| /_/ \_\_| |___| +# +paths: + /admin/projects: + get: + summary: Retourne la liste of projets associés à l'admin + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: + JSON array of who's elements are objects containing necessary information for the view + (project name, entrepreneur names, etc..) + of the projects an admin is watching over. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "main.yaml#/components/schemas/project" + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + /admin/projects/pending/decision: + post: + summary: valider un projet en attente de validation + tags: + - Admin API + description: + if the request is accepted the status of the + project is changed to ongoing, entrepreneur + account is confirmed and the project is linked + to the admin accepting the request and the + entrepreneur requesting it. Else the pending + project and user info are deleted. + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + pedingProjectId: + type: integer + decision: + type: boolean + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/projects/add: + post: + summary: Ajout manuel d'un projet + description: + Adds a project with the + inputed details + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + $ref: "main.yaml#/components/schemas/project" + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /admin/appointments/report/{appointmentId}: + put: + summary: enregistrer un rapport du rendez-vous + description: + Generate a PDF file formatted + from input text and links it + to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: "main.yaml#/components/schemas/report" + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + post: + summary: modifier un rapport déja éxistant du rendez-vous + description: + Modifies the report file to input + text and links it to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: "main.yaml#/components/schemas/report" + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + + /admin/projects/remove/{projectId}: + delete: + summary: supression d'un project + description: + Removes the project + with the inputed id projectId + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: projectId + required: true + schema: + type: integer + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + + /admin/projects/pending: + get: + summary: Retourne la liste des projets en attente de validation + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: + JSON array of who's elements are objects containing + necessary information for the view (project name, etc..) + of all pending projects. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "main.yaml#/components/schemas/project" + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid \ No newline at end of file diff --git a/documentation/openapi/src/bundled.yaml b/documentation/openapi/src/bundled.yaml new file mode 100644 index 0000000..c151f2d --- /dev/null +++ b/documentation/openapi/src/bundled.yaml @@ -0,0 +1,596 @@ +openapi: 3.0.3 +info: + title: MyInpulse Backend Api + description: this document servers as a documentation for the backend api. + version: 0.2.0 +tags: + - name: Entrepreneurs API + description: La partie de l'api dédiée aux entrepreneurs + - name: Admin API + description: La partie de l'api dédiée aux entrepreneurs + - name: Shared API + description: La partie de l'api dédiée aux entrepreneurs et admins +components: + schemas: + user: + type: object + properties: + idUser: + type: integer + userSurname: + type: string + userName: + type: string + primaryMail: + type: string + example: example@exmaple.com + secondaryMail: + type: string + example: example@exmaple.com + phoneNumber: + type: string + example: 0612345678 + user-entrepreneur: + allOf: + - $ref: '#/components/schemas/user' + - type: object + properties: + school: + type: string + example: enseirb + course: + type: string + example: info + sneeStatus: + type: boolean + example: false + user-admin: + allOf: + - $ref: '#/components/schemas/user' + sectionCell: + type: object + properties: + idSectionCell: + type: integer + example: this the cell (postit id) + sectionId: + type: integer + contentSectionCell: + type: string + modificationDate: + type: string + project: + type: object + properties: + idProject: + type: integer + projectName: + type: string + creationDate: + type: string + logo: + example: to be discussed not yet fixed + type: string + format: binary + report: + type: object + properties: + idReport: + type: integer + reportContent: + type: string + appointement: + type: object + properties: + appointmentDate: + type: string + appointmentTime: + type: string + appointmentDuration: + type: string + appointmentPlace: + type: string + appointmentSubject: + type: string + securitySchemes: + MyINPulse: + type: oauth2 + flows: + implicit: + authorizationUrl: 'http://localhost:7080' + scopes: + MyINPulse-admin: Administrateur + MyINPulse-entrepreneur: Utilisateur +servers: + - url: 'http://localhost:8081/' + description: Backend developper server +paths: + /admin/projects: + get: + summary: Retourne la liste of projets associés à l'admin + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: 'JSON array of who''s elements are objects containing necessary information for the view (project name, entrepreneur names, etc..) of the projects an admin is watching over.' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/project' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /admin/projects/pending/decision: + post: + summary: valider un projet en attente de validation + tags: + - Admin API + description: 'if the request is accepted the status of the project is changed to ongoing, entrepreneur account is confirmed and the project is linked to the admin accepting the request and the entrepreneur requesting it. Else the pending project and user info are deleted.' + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + pedingProjectId: + type: integer + decision: + type: boolean + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /admin/projects/add: + post: + summary: Ajout manuel d'un projet + description: Adds a project with the inputed details + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/project' + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/admin/appointments/report/{appointmentId}': + put: + summary: enregistrer un rapport du rendez-vous + description: Generate a PDF file formatted from input text and links it to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/report' + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + post: + summary: modifier un rapport déja éxistant du rendez-vous + description: Modifies the report file to input text and links it to the appointement. + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: appointmentId + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/report' + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/admin/projects/remove/{projectId}': + delete: + summary: supression d'un project + description: Removes the project with the inputed id projectId + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + parameters: + - in: path + name: projectId + required: true + schema: + type: integer + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /admin/projects/pending: + get: + summary: Retourne la liste des projets en attente de validation + tags: + - Admin API + security: + - MyINPulse: + - MyINPulse-admin + description: 'JSON array of who''s elements are objects containing necessary information for the view (project name, etc..) of all pending projects.' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/project' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /shared/appointments/upcoming: + get: + summary: Retourne la list des prochains rendez-vous de l'utilisateur + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: 'JSON array of upcoming appointment data (name, date, time etc..) for a user.' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/appointement' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/shared/projects/sectionCell/{projectId}/{sectionId}/{date}': + get: + summary: Retourne la liste de sections de LC avec un titre donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: JSON array containing Lean Canvas section data with a title for the current date (or given date if the date parameter is passed) + parameters: + - in: path + required: true + name: projectId + schema: + type: integer + - in: path + required: true + description: 'this number can be 1, 2,...,8. It is associated with the title of the sectionCell' + name: sectionId + schema: + type: integer + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - in: path + required: true + name: date + description: the date corresponding to the wanted version of lc section. "Nan" for the latest version + example: NaN + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/sectionCell' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/shared/projects/entrepreneurs/{projectId}': + get: + summary: Retourne la liste d'entrepreneurs associée à un projet donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: JSON array of entrepreneur names associated with a project + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/user-entrepreneur' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/shared/projects/admin/{projectId}': + get: + summary: Retourne les informations de l'admin qui accompagne le projet + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: 'JSON object containing information (name, gmail, tel, etc..) the admin supervising the project with id projectID.' + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/user-admin' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/shared/projects/appointments/{projectId}': + get: + summary: Retourne les rendez-vous du projet + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: JSON array of upcoming and past appointment data for the project with id projectID. + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/appointement' + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/shared/projects/appointments/report/{appointmentId}': + get: + summary: Retourne le rapport pdf du rendez-vous + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: PDF file containing the ap- pointment report + parameters: + - in: path + name: apointementId + schema: + type: integer + required: true + responses: + '200': + description: OK + content: + application/pdf: + schema: + type: string + format: binary + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /shared/appointments/request: + post: + summary: demander un rendez-vous + description: will add an appointement request request by the applicant to have an appointment to be confirmed or denied by the specified participants of the appointement. + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-entrepreneur + - MyINPulse-admin + requestBody: + description: \"participants\" property is an array containing userids of the participants in the appointement + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + start_time: + type: string + end_time: + type: string + place: + type: string + applicantId: + type: integer + participants: + type: array + items: + type: integer + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /entrepreneur/projects/request: + post: + summary: demander la création et validation d'un projet + tags: + - Entrepreneurs API + description: Adds project to pending projects to then be accepted or rejected by an admin + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + founder: + $ref: '#/components/schemas/user-entrepreneur' + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /entrepreneur/sectionCell/add: + post: + summary: ajouter une sections au LC + description: Adds input data to the user's LC with a specified title. + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/sectionCell' + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + /entrepreneur/sectionCell/modify: + put: + summary: modifier les données d'une section LC + description: Modifies input Lean Canvas section by changing it to the information in the request body and changes the time stamp. + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/sectionCell' + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid + '/entrepreneur/sectionCell/remove/{sectionCellId}': + delete: + summary: supprimer une section LC. + description: Deletes section from Lean Canvas + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + parameters: + - in: path + name: sectionCellId + schema: + type: integer + required: true + responses: + '200': + description: OK + '400': + description: Bad request + '401': + description: Authorization information is missing or invalid diff --git a/documentation/openapi/src/entrepreneurApi.yaml b/documentation/openapi/src/entrepreneurApi.yaml new file mode 100644 index 0000000..4fc3b82 --- /dev/null +++ b/documentation/openapi/src/entrepreneurApi.yaml @@ -0,0 +1,121 @@ +# _____ _ _ _____ ____ _____ ____ ____ _____ _ _ _____ _ _ ____ +# | ____| \ | |_ _| _ \| ____| _ \| _ \| ____| \ | | ____| | | | _ \ +# | _| | \| | | | | |_) | _| | |_) | |_) | _| | \| | _| | | | | |_) | +# | |___| |\ | | | | _ <| |___| __/| _ <| |___| |\ | |___| |_| | _ < +# |_____|_|_\_| |_| |_| \_\_____|_| |_| \_\_____|_| \_|_____|\___/|_| \_\ +# / \ | _ \_ _| +# / _ \ | |_) | | +# / ___ \| __/| | +# /_/ \_\_| |___| +# + +paths: + /entrepreneur/projects/request: + post: + summary: demander la création et validation d'un projet + tags: + - Entrepreneurs API + description: + Adds project to pending projects + to then be accepted or rejected by + an admin + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + founder: + $ref: "main.yaml#/components/schemas/user-entrepreneur" + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + + /entrepreneur/sectionCell/add: + post: + summary: ajouter une sections au LC + description: + Adds input data to the user's LC + with a specified title. + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + $ref: "main.yaml#/components/schemas/sectionCell" + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + /entrepreneur/sectionCell/modify: + put: + summary: modifier les données d'une section LC + description: + Modifies input Lean Canvas section by changing it to + the information in the request body and changes the + time stamp. + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + requestBody: + required: true + content: + application/json: + schema: + $ref: "main.yaml#/components/schemas/sectionCell" + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /entrepreneur/sectionCell/remove/{sectionCellId}: + delete: + summary: supprimer une section LC. + description: + Deletes section from Lean Canvas + tags: + - Entrepreneurs API + security: + - MyINPulse: + - MyINPulse-entrepreneur + parameters: + - in: path + name: sectionCellId + schema: + type: integer + required: true + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid \ No newline at end of file diff --git a/documentation/openapi/src/main.yaml b/documentation/openapi/src/main.yaml new file mode 100644 index 0000000..eeaa57e --- /dev/null +++ b/documentation/openapi/src/main.yaml @@ -0,0 +1,114 @@ +openapi: 3.0.3 +info: + title: MyInpulse Backend Api + description: this document servers as a documentation for the backend api. + version: 0.2.0 + +tags: + - name: Entrepreneurs API + description: La partie de l'api dédiée aux entrepreneurs + - name: Admin API + description: La partie de l'api dédiée aux entrepreneurs + - name: Shared API + description: La partie de l'api dédiée aux entrepreneurs et admins + + +components: + schemas: + user: + $ref: "models.yaml#/user" + user-entrepreneur: + $ref: "models.yaml#/user-entrepreneur" + user-admin: + $ref: "models.yaml#/user-admin" + sectionCell: + $ref: "models.yaml#/sectionCell" + project: + $ref: "models.yaml#/project" + report: + $ref: "models.yaml#/report" + appointement: + $ref: "models.yaml#/appointement" + + + securitySchemes: + MyINPulse: + type: oauth2 + flows: + implicit: + authorizationUrl: http://localhost:7080 + scopes: + MyINPulse-admin: Administrateur + MyINPulse-entrepreneur: Utilisateur + +servers: + - url: http://localhost:8081/ + description: Backend developper server + + + +paths: + # _ ____ __ __ ___ _ _ _ ____ ___ + # / \ | _ \| \/ |_ _| \ | | / \ | _ \_ _| + # / _ \ | | | | |\/| || || \| | / _ \ | |_) | | + # / ___ \| |_| | | | || || |\ | / ___ \| __/| | + # /_/ \_\____/|_| |_|___|_| \_| /_/ \_\_| |___| + # + /admin/projects: + $ref: "./adminApi.yaml#/paths/~1admin~1projects" + /admin/projects/pending/decision: + $ref: "./adminApi.yaml#/paths/~1admin~1projects~1pending~1decision" + /admin/projects/add: + $ref: "./adminApi.yaml#/paths/~1admin~1projects~1add" + /admin/appointments/report/{appointmentId}: + $ref: "./adminApi.yaml#/paths/~1admin~1appointments~1report~1{appointmentId}" + /admin/projects/remove/{projectId}: + $ref: "./adminApi.yaml#/paths/~1admin~1projects~1remove~1{projectId}" + /admin/projects/pending: + $ref: "./adminApi.yaml#/paths/~1admin~1projects~1pending" + + # ____ _ _ _ ____ ___ + # / ___|| |__ __ _ _ __ ___ __| | / \ | _ \_ _| + # \___ \| '_ \ / _` | '__/ _ \/ _` | / _ \ | |_) | | + # ___) | | | | (_| | | | __/ (_| | / ___ \| __/| | + # |____/|_| |_|\__,_|_| \___|\__,_| /_/ \_\_| |___| + # + /shared/appointments/upcoming: + $ref: "./sharedApi.yaml#/paths/~1shared~1appointments~1upcoming" + /shared/projects/sectionCell/{projectId}/{sectionId}/{date}: + $ref: "./sharedApi.yaml#/paths/~1shared~1projects~1sectionCell~1{projectId}~1{sectionId}~1{date}" + /shared/projects/entrepreneurs/{projectId}: + $ref: "./sharedApi.yaml#/paths/~1shared~1projects~1entrepreneurs~1{projectId}" + /shared/projects/admin/{projectId}: + $ref: "./sharedApi.yaml#/paths/~1shared~1projects~1admin~1{projectId}" + /shared/projects/appointments/{projectId}: + $ref: "./sharedApi.yaml#/paths/~1shared~1projects~1appointments~1{projectId}" + /shared/projects/appointments/report/{appointmentId}: + $ref: "./sharedApi.yaml#/paths/~1shared~1projects~1appointments~1report~1{appointmentId}" + + /shared/appointments/request: + $ref: "./sharedApi.yaml#/paths/~1shared~1appointments~1request" + + # _____ _ _ _____ ____ _____ ____ ____ _____ _ _ _____ _ _ ____ + # | ____| \ | |_ _| _ \| ____| _ \| _ \| ____| \ | | ____| | | | _ \ + # | _| | \| | | | | |_) | _| | |_) | |_) | _| | \| | _| | | | | |_) | + # | |___| |\ | | | | _ <| |___| __/| _ <| |___| |\ | |___| |_| | _ < + # |_____|_|_\_| |_| |_| \_\_____|_| |_| \_\_____|_| \_|_____|\___/|_| \_\ + # / \ | _ \_ _| + # / _ \ | |_) | | + # / ___ \| __/| | + # /_/ \_\_| |___| + # + /entrepreneur/projects/request: + $ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1projects~1request" + /entrepreneur/sectionCell/add: + $ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1sectionCell~1add" + /entrepreneur/sectionCell/modify: + $ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1sectionCell~1modify" + /entrepreneur/sectionCell/remove/{sectionCellId}: + $ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1sectionCell~1remove~1{sectionCellId}" + + + + + \ No newline at end of file diff --git a/documentation/openapi/src/models.yaml b/documentation/openapi/src/models.yaml new file mode 100644 index 0000000..b54b58c --- /dev/null +++ b/documentation/openapi/src/models.yaml @@ -0,0 +1,88 @@ +# models.yaml + +user: + type: object + properties: + idUser: + type: integer + userSurname: + type: string + userName: + type: string + primaryMail: + type: string + example: "example@exmaple.com" + secondaryMail: + type: string + example: "example@exmaple.com" + phoneNumber: + type: string + example: "0612345678" + +user-entrepreneur: + allOf: + - $ref: "#/user" + - type: object + properties: + school: + type: string + example: "enseirb" + course: + type: string + example: "info" + sneeStatus: + type: boolean + example: false + +user-admin: + allOf: + - $ref: "#/user" + +sectionCell: + type: object + properties: + idSectionCell: + type: integer + example: this the cell (postit id) + sectionId: + type: integer + contentSectionCell: + type: string + modificationDate: + type: string + +project: + type: object + properties: + idProject: + type: integer + projectName: + type: string + creationDate: + type: string + logo: + example: to be discussed not yet fixed + type: string + format: binary + +report: + type: object + properties: + idReport: + type: integer + reportContent: + type: string + +appointement: + type: object + properties: + appointmentDate: + type: string + appointmentTime: + type: string + appointmentDuration: + type: string + appointmentPlace: + type: string + appointmentSubject: + type: string \ No newline at end of file diff --git a/documentation/openapi/src/sharedApi.yaml b/documentation/openapi/src/sharedApi.yaml new file mode 100644 index 0000000..79fe139 --- /dev/null +++ b/documentation/openapi/src/sharedApi.yaml @@ -0,0 +1,254 @@ +# ____ _ _ _ ____ ___ +# / ___|| |__ __ _ _ __ ___ __| | / \ | _ \_ _| +# \___ \| '_ \ / _` | '__/ _ \/ _` | / _ \ | |_) | | +# ___) | | | | (_| | | | __/ (_| | / ___ \| __/| | +# |____/|_| |_|\__,_|_| \___|\__,_| /_/ \_\_| |___| +# +paths: + /shared/appointments/upcoming: + get: + summary: Retourne la list des prochains rendez-vous de l'utilisateur + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of upcoming appointment data (name, date, time etc..) for a user. + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "main.yaml#/components/schemas/appointement" + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /shared/projects/sectionCell/{projectId}/{sectionId}/{date}: + get: + summary: Retourne la liste de sections de LC avec un titre donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array containing Lean Canvas + section data with a title for the + current date (or given date if the + date parameter is passed) + parameters: + - in: path + required: true + name: projectId + schema: + type: integer + - in: path + required: true + description: this number can be 1, 2,...,8. It is associated with the title of the sectionCell + name: sectionId + schema: + type: integer + enum: [1, 2, 3, 4, 5, 6, 7, 8] + - in: path + required: true + name: date + description: the date corresponding to the wanted version of lc section. "Nan" for the latest version + example: "NaN" + schema: + type: string + + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "main.yaml#/components/schemas/sectionCell" + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /shared/projects/entrepreneurs/{projectId}: + get: + summary: Retourne la liste d'entrepreneurs associée à un projet donné + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of entrepreneur + names associated with a project + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "main.yaml#/components/schemas/user-entrepreneur" + "400": + description: Bad request + "401": + description: Authorization information is missing or invalid + + /shared/projects/admin/{projectId}: + get: + summary: Retourne les informations de l'admin qui accompagne le projet + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON object containing information (name, gmail, tel, etc..) + the admin supervising the project with id projectID. + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "main.yaml#/components/schemas/user-admin" + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /shared/projects/appointments/{projectId}: + get: + summary: Retourne les rendez-vous du projet + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + JSON array of upcoming and past appointment + data for the project with id projectID. + parameters: + - in: path + name: projectId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "main.yaml#/components/schemas/appointement" + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + /shared/projects/appointments/report/{appointmentId}: + get: + summary: Retourne le rapport pdf du rendez-vous + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-admin + - MyINPulse-entrepreneur + description: + PDF file containing the ap- + pointment report + parameters: + - in: path + name: apointementId + schema: + type: integer + required: true + responses: + "200": + description: OK + content: + application/pdf: + schema: + type: string + format: binary + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + + /shared/appointments/request: + post: + summary: demander un rendez-vous + description: + will add an appointement request request by the applicant + to have an appointment to be confirmed or denied by the + specified participants of the appointement. + tags: + - Shared API + security: + - MyINPulse: + - MyINPulse-entrepreneur + - MyINPulse-admin + requestBody: + description: \"participants\" property is an array containing userids of the participants in the appointement + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + start_time: + type: string + end_time: + type: string + place: + type: string + applicantId: + type: integer + participants: + #/* */ + type: array + items: + type: integer + + responses: + "200": + description: OK + "400": + description: Bad request + "401": + description: Authorization information is + missing or invalid + \ No newline at end of file diff --git a/documentation/openapi/swagger-ui/main.js b/documentation/openapi/swagger-ui/main.js index 2e2850d..6ead739 100644 --- a/documentation/openapi/swagger-ui/main.js +++ b/documentation/openapi/swagger-ui/main.js @@ -5,7 +5,7 @@ const fs = require("fs"); const app = express(); -const swaggerDocument = yaml.load(fs.readFileSync("../main.yaml", "utf8")); +const swaggerDocument = yaml.load(fs.readFileSync("../src/bundled.yaml", "utf8")); app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument)); diff --git a/documentation/openapi/swagger-ui/package-lock.json b/documentation/openapi/swagger-ui/package-lock.json index bf4f6c3..29e9857 100644 --- a/documentation/openapi/swagger-ui/package-lock.json +++ b/documentation/openapi/swagger-ui/package-lock.json @@ -11,9 +11,108 @@ "dependencies": { "express": "^4.21.2", "js-yaml": "^4.1.0", + "package.json": "^2.0.1", + "swagger-cli": "^4.0.4", "swagger-ui-express": "^5.0.1" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-cli": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-cli/-/swagger-cli-4.0.4.tgz", + "integrity": "sha512-hdDT3B6GLVovCsRZYDi3+wMcB1HfetTU20l2DC8zD3iFRNMC6QNAZG5fo/6PYeHWBEv7ri4MvnlKodhNB0nt7g==", + "deprecated": "This package has been abandoned. Please switch to using the actively maintained @redocly/cli", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "^10.0.1", + "chalk": "^4.1.0", + "js-yaml": "^3.14.0", + "yargs": "^15.4.1" + }, + "bin": { + "swagger-cli": "bin/swagger-cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-cli/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@apidevtools/swagger-cli/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", + "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.2" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, "node_modules/@scarf/scarf": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", @@ -21,6 +120,21 @@ "hasInstallScript": true, "license": "Apache-2.0" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/abs": { + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.15.tgz", + "integrity": "sha512-bpFChpVyZ2F2ppgx7qjZ5TTEO6VVwBauUZDZibpclRGhfcXTHyj11nlqwrg5dN1knxCchssROehm76uCcCayRA==", + "license": "MIT", + "dependencies": { + "ul": "^5.0.0" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -34,6 +148,60 @@ "node": ">= 0.6" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -108,6 +276,78 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -144,6 +384,24 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "license": "MIT", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -153,6 +411,33 @@ "ms": "2.0.0" } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deffy": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.5.tgz", + "integrity": "sha512-6TX2cfIo97eKqWmqgMDAUulCwnveAe3K+4VGsTGPJsL3NtSEnSBFZ3sUXdS4EBhZ8GbdaZBzXQ04ton18dJrug==", + "license": "MIT", + "dependencies": { + "typpy": "^2.0.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -186,12 +471,27 @@ "node": ">= 0.4" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -201,6 +501,24 @@ "node": ">= 0.8" } }, + "node_modules/err": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", + "integrity": "sha512-N97Ybd2jJHVQ+Ft3Q5+C2gM3kgygkdeQmEqbN2z15UTVyyEsIwLA1VK39O1DHEJhXbwIFcJLqm6iARNhFANcQA==", + "license": "MIT", + "dependencies": { + "typpy": "^2.2.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -237,6 +555,19 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -246,6 +577,16 @@ "node": ">= 0.6" } }, + "node_modules/exec-limiter": { + "version": "3.2.14", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.14.tgz", + "integrity": "sha512-ZQjJmAnXD+1kQ6ejMZAS5Vxdt7LLMz0Eq7mEu6+7NhlauykuyLihhUkpp4S784QKsmJQIpuuERhQ8Tav8bF3zQ==", + "license": "MIT", + "dependencies": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -292,6 +633,28 @@ "url": "https://opencollective.com/express" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -310,6 +673,19 @@ "node": ">= 0.8" } }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -337,6 +713,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.name": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.14.tgz", + "integrity": "sha512-s99L814NRuLxwF2sJMIcLhkQhueGXb3oKyvorzrUKKwlVB0SBbWrgZt4+EwKAo3ujCXnT7vshmCvXgZA09kCMw==", + "license": "MIT", + "dependencies": { + "noop6": "^1.0.1" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -374,6 +768,51 @@ "node": ">= 0.4" } }, + "node_modules/git-package-json": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.11.tgz", + "integrity": "sha512-A/P5K2qqQ52+BwBf+qyrjtdauMlb7n1WVa++/VPDxTcgKZ2X5/Eh/EQwbxNvRKBsKAkMAeyV/UIdnb/saVFnnQ==", + "license": "MIT", + "dependencies": { + "deffy": "^2.2.1", + "err": "^1.1.1", + "gry": "^5.0.0", + "normalize-package-data": "^2.3.5", + "oargv": "^3.4.1", + "one-by-one": "^3.1.0", + "r-json": "^1.2.1", + "r-package-json": "^1.0.0", + "tmp": "0.0.28" + } + }, + "node_modules/git-source": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.11.tgz", + "integrity": "sha512-oubUf/uply9xvR5olZxxPpip19wMEpESN3bFfPcFMvl/0fwrVrcAppwOJ7Dghcguze68WAIjs/A1YrdMDIW8XA==", + "license": "MIT", + "dependencies": { + "git-url-parse": "^5.0.1" + } + }, + "node_modules/git-up": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha512-SRVN3rOLACva8imc7BFrB6ts5iISWKH1/h/1Z+JZYoUI7UVQM7gQqk4M2yxUENbq2jUUT09NEND5xwP1i7Ktlw==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "node_modules/git-url-parse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", + "integrity": "sha512-4uSiOgrryNEMBX+gTWogenYRUh2j1D+95STTSEF2RCTgLkfJikl8c7BGr0Bn274hwuxTsbS2/FQ5pVS9FoXegQ==", + "license": "MIT", + "dependencies": { + "git-up": "^1.0.0" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -386,6 +825,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha512-MnypzkaW8dldA8AbJFjMs7y14+ykd2V8JCLKSvX1Gmzx1alH3Y+3LArywHDoAF2wS3pnZp4gacoYtvqBeF6drQ==", + "license": "MIT", + "dependencies": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gry": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", + "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", + "license": "MIT", + "dependencies": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -410,6 +897,12 @@ "node": ">= 0.4" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -444,6 +937,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -453,6 +952,93 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/iterate-object": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.5.tgz", + "integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A==", + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -465,6 +1051,42 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/limit-it": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.11.tgz", + "integrity": "sha512-VdLa1lZYZnzT98oLMeCDl6Lwd9cEYIMQlPg34qL6CYuA+yQKoG7K12tfgI5K6bRC51kRM8v1UX67IhpNsnvo3A==", + "license": "MIT", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -534,6 +1156,15 @@ "node": ">= 0.6" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -549,6 +1180,61 @@ "node": ">= 0.6" } }, + "node_modules/node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/noop6": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.10.tgz", + "integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA==", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/oargv": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.11.tgz", + "integrity": "sha512-FGTon9C71936EnOjx/NTsMxlLeWmw8zQQld4KDmgRxRtZ8fH1XpbLLRHmOioeZs/WoURz2OGR4KmDoTaL4ErJQ==", + "license": "MIT", + "dependencies": { + "iterate-object": "^1.1.0", + "ul": "^5.0.0" + } + }, + "node_modules/obj-def": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.10.tgz", + "integrity": "sha512-RJpNUkO+1r/rXTBs82iU4scoC9Q1yp9HZbSk0ldpFe8362S6eTjUjSgTmECa1TtOBIe5pn4pwSzxIiWc8+jmWg==", + "license": "MIT", + "dependencies": { + "deffy": "^2.2.2" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -573,6 +1259,132 @@ "node": ">= 0.8" } }, + "node_modules/one-by-one": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.9.tgz", + "integrity": "sha512-H10TAq02LKrkSRTQz1mgvcKb64rRajZ+B5HWHBvkGigYNCPqL0Q/tLIN3vfha/DqZxXeKNfyCmgfEYo2hgFQgA==", + "license": "MIT", + "dependencies": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha512-PRg65iXMTt/uK8Rfh5zvzkUbfAPitF17YaCY+IbHsYgksiLvtzWWTUildHth3mVaZ7871OJ7gtP4LBRBlmAdXg==", + "license": "MIT", + "dependencies": { + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json-path": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.10.tgz", + "integrity": "sha512-DOlmVIfx+qDHHWaaxg573brZ8mH0Nxo4ecYA4SKkrpCOhCP64NXk7VxJtWVKZQ9urfU2Ivl74HeYUO42PLCpLw==", + "license": "MIT", + "dependencies": { + "abs": "^1.2.1" + } + }, + "node_modules/package.json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", + "integrity": "sha512-pSxZ6XR5yEawRN2ekxx9IKgPN5uNAYco7MCPxtBEWMKO3UKWa1X2CtQMzMgloeGj2g2o6cue3Sb5iPkByIJqlw==", + "deprecated": "Use pkg.json instead.", + "license": "MIT", + "dependencies": { + "git-package-json": "^1.4.0", + "git-source": "^1.1.0", + "package-json": "^2.3.1" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha512-1wj9nkgH/5EboDxLwaTMGJh3oH3f+Gue+aGdh631oCqoSBpokzmMmOldvOeBPtB8GJBYJbaF93KPzlkU+Y1ksg==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "node_modules/parse-url/node_modules/protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "license": "MIT" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -582,12 +1394,69 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -616,6 +1485,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/r-json": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.3.1.tgz", + "integrity": "sha512-5nhRFfjVMQdrwKUfUlRpDUCocdKtjSnYZ1R/86mpZDV3MfsZ3dYYNjSGuMX+mPBvFvQBhdzxSqxkuLPLv4uFGg==", + "license": "MIT", + "dependencies": { + "w-json": "1.3.10" + } + }, + "node_modules/r-package-json": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.10.tgz", + "integrity": "sha512-g+KLu+aq3tkhW6gzjsfdWAyd+ZkueLTzkX2zpB2GIW7M/lOXal3nB8U36XOrIBGogJsz2H//xWA4mj9uGlcigw==", + "license": "MIT", + "dependencies": { + "package-json-path": "^1.0.0", + "r-json": "^1.2.1" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -640,6 +1528,121 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "license": "MIT", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -666,6 +1669,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -720,6 +1732,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -798,6 +1816,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "license": "MIT" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -807,6 +1869,95 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-cli": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/swagger-cli/-/swagger-cli-4.0.4.tgz", + "integrity": "sha512-Cp8YYuLny3RJFQ4CvOBTaqmOOgYsem52dPx1xM5S4EUWFblIh2Q8atppMZvXKUr1e9xH5RwipYpmdUzdPcxWcA==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-cli": "4.0.4" + }, + "bin": { + "swagger-cli": "swagger-cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/swagger-ui-dist": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.20.1.tgz", @@ -831,6 +1982,27 @@ "express": ">=4.0.0 || >=5.0.0-beta" } }, + "node_modules/timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -853,6 +2025,25 @@ "node": ">= 0.6" } }, + "node_modules/typpy": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.14.tgz", + "integrity": "sha512-C1V70FdAT/2rCngfzRD0TPTjQ5zuhKdRdRwPL+t1hIS4IsZU+oouXEv8jpycDNWaZlEJWv4NshzaRzsp+BO9TA==", + "license": "MIT", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/ul": { + "version": "5.2.16", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.16.tgz", + "integrity": "sha512-v1YrSEsJZpJsywzF/MKgsQwMdOwBlwwmNiUOJh/yX6FHrq7dYjeua1YOhLV0q0KioqEFZC4P7MsKmpEsGdZz3w==", + "license": "MIT", + "dependencies": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -862,6 +2053,33 @@ "node": ">= 0.8" } }, + "node_modules/unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "license": "MIT", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -871,6 +2089,16 @@ "node": ">= 0.4.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -879,6 +2107,73 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/w-json": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", + "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==", + "license": "MIT" + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } } } } diff --git a/documentation/openapi/swagger-ui/package.json b/documentation/openapi/swagger-ui/package.json index 282a1d6..d729be1 100644 --- a/documentation/openapi/swagger-ui/package.json +++ b/documentation/openapi/swagger-ui/package.json @@ -3,7 +3,9 @@ "version": "1.0.0", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "bundle": "swagger-cli bundle -o ../src/bundled.yaml -t yaml ../src/main.yaml", + "start": "npm run bundle; node main.js" }, "keywords": [], "author": "", @@ -12,6 +14,8 @@ "dependencies": { "express": "^4.21.2", "js-yaml": "^4.1.0", + "package.json": "^2.0.1", + "swagger-cli": "^4.0.4", "swagger-ui-express": "^5.0.1" } } From 6ff6ce5052debd050983cb6759203e060510cd36 Mon Sep 17 00:00:00 2001 From: Maillal Date: Wed, 26 Mar 2025 10:04:46 +0100 Subject: [PATCH 09/11] fix: just fixed duplicate test files due to bad merge --- .../ServiceTests/AdminApiServiceTest.java | 173 ------------------ documentation/openapi/src/main.yaml | 3 +- 2 files changed, 2 insertions(+), 174 deletions(-) delete mode 100644 MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java diff --git a/MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java b/MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java deleted file mode 100644 index abd21fb..0000000 --- a/MyINPulse-back/src/test/java/enseirb/myinpulse/ServiceTests/AdminApiServiceTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package enseirb.myinpulse; - -import static enseirb.myinpulse.model.ProjectDecisionValue.*; - -import static org.junit.jupiter.api.Assertions.*; - -import enseirb.myinpulse.model.Administrator; -import enseirb.myinpulse.model.Project; -import enseirb.myinpulse.model.ProjectDecision; -import enseirb.myinpulse.service.AdminApiService; -import enseirb.myinpulse.service.database.AdministratorService; -import enseirb.myinpulse.service.database.ProjectService; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.server.ResponseStatusException; - -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -@SpringBootTest -@Transactional -public class AdminApiServiceTest { - private static long administratorid; - @Autowired private AdminApiService adminApiService; - @Autowired private ProjectService projectService; - - @BeforeAll - static void setup( - @Autowired AdministratorService administratorService, - @Autowired ProjectService projectService) { - administratorService.addAdministrator( - new Administrator( - "admin", - "admin", - "testAdminEmpty@example.com", - "testAdmin@example.com", - "")); - Administrator a = - administratorService.addAdministrator( - new Administrator( - "admin2", - "admin2", - "testAdminFull@example.com", - "testAdmin@example.com", - "")); - administratorid = a.getIdUser(); - projectService.addNewProject( - new Project( - "sampleProjectAdminApiService", - null, - LocalDate.now(), - ACTIVE, - administratorService.getAdministratorByPrimaryMain( - "testAdminFull@example.com"))); - } - - private List IterableToList(Iterable iterable) { - List l = new ArrayList<>(); - iterable.forEach(l::add); - return l; - } - - @Test - void getProjectOfAdminIsEmpty() { - Iterable projects = - adminApiService.getProjectsOfAdmin("testAdminEmpty@example.com"); - assertEquals(0, IterableToList(projects).size()); - } - - @Test - void getProjectOfInexistantAdminFails() { - String nonExistentAdminEmail = "testInexistantAdmin@example.com"; - - assertThrows( - ResponseStatusException.class, - () -> { - adminApiService.getProjectsOfAdmin(nonExistentAdminEmail); - }); - } - - @Test - void getProjectOfAdminNotEmpty() { - Iterable projects = - adminApiService.getProjectsOfAdmin("testAdminFull@example.com"); - List l = IterableToList(projects); - assertEquals(1, l.size()); - Project p = l.getFirst(); - assertEquals(p.getProjectName(), "sampleProjectAdminApiService"); - } - - @Test - void getPendingProjectsEmpty() { - assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); - } - - @Test - void getPendingProjectsNotEmpty() { - this.projectService.addNewProject( - new Project( - "PendingProjectAdminApiService1", null, LocalDate.now(), PENDING, null)); - this.projectService.addNewProject( - new Project( - "PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null)); - Iterable pendingProjects = this.adminApiService.getPendingProjects(); - List pendingProjectsList = IterableToList(pendingProjects); - assertEquals(2, pendingProjectsList.size()); - assertTrue( - List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2") - .contains(pendingProjectsList.getFirst().getProjectName())); - assertTrue( - List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2") - .contains(pendingProjectsList.getLast().getProjectName())); - } - - @Test - void validateInexistantProject() { - ProjectDecision d = new ProjectDecision(-1, 0, 1); - assertThrows(ResponseStatusException.class, () -> this.adminApiService.validateProject(d)); - } - - @Test - void validateExistantProject() { - Project p = - new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); - this.projectService.addNewProject(p); - assertEquals(PENDING, p.getProjectStatus()); - ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 1); - this.adminApiService.validateProject(d); - assertEquals(ACTIVE, p.getProjectStatus()); - - // Check if the project was really updated in the database - assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); - } - - @Test - void refuseExistantProject() { - Project p = - new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); - this.projectService.addNewProject(p); - assertEquals(PENDING, p.getProjectStatus()); - ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 0); - this.adminApiService.validateProject(d); - assertEquals(REJECTED, p.getProjectStatus()); - - // Check if the project was really updated in the database - assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); - } - - @Test - void addProject() { - assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); - Project p1 = - new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); - this.adminApiService.addNewProject(p1); - - assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size()); - } - - @Test - void addDuplicateProject() { - Project p1 = - new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); - Project p2 = - new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); - this.adminApiService.addNewProject(p1); - assertThrows(ResponseStatusException.class, () -> this.adminApiService.addNewProject(p2)); - } -} diff --git a/documentation/openapi/src/main.yaml b/documentation/openapi/src/main.yaml index eeaa57e..11258f9 100644 --- a/documentation/openapi/src/main.yaml +++ b/documentation/openapi/src/main.yaml @@ -37,13 +37,14 @@ components: flows: implicit: authorizationUrl: http://localhost:7080 + description: keycloak server scopes: MyINPulse-admin: Administrateur MyINPulse-entrepreneur: Utilisateur servers: - url: http://localhost:8081/ - description: Backend developper server + description: Backend server From ebd76a30eeed31833821469f6b8b3d17fe8cdfd5 Mon Sep 17 00:00:00 2001 From: Maillal Date: Thu, 27 Mar 2025 17:34:41 +0100 Subject: [PATCH 10/11] feat: updated date format next is descriptions and setting up http request tests --- documentation/openapi/src/bundled.yaml | 6 +++++- documentation/openapi/src/main.yaml | 1 - documentation/openapi/src/models.yaml | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/documentation/openapi/src/bundled.yaml b/documentation/openapi/src/bundled.yaml index c151f2d..66ded43 100644 --- a/documentation/openapi/src/bundled.yaml +++ b/documentation/openapi/src/bundled.yaml @@ -59,6 +59,7 @@ components: type: string modificationDate: type: string + example: 02-05-2025 project: type: object properties: @@ -68,6 +69,7 @@ components: type: string creationDate: type: string + example: 02-05-2025 logo: example: to be discussed not yet fixed type: string @@ -84,8 +86,10 @@ components: properties: appointmentDate: type: string + example: 02-05-2025 appointmentTime: type: string + example: '10:15:30' appointmentDuration: type: string appointmentPlace: @@ -103,7 +107,7 @@ components: MyINPulse-entrepreneur: Utilisateur servers: - url: 'http://localhost:8081/' - description: Backend developper server + description: Backend server paths: /admin/projects: get: diff --git a/documentation/openapi/src/main.yaml b/documentation/openapi/src/main.yaml index 11258f9..2d666ec 100644 --- a/documentation/openapi/src/main.yaml +++ b/documentation/openapi/src/main.yaml @@ -37,7 +37,6 @@ components: flows: implicit: authorizationUrl: http://localhost:7080 - description: keycloak server scopes: MyINPulse-admin: Administrateur MyINPulse-entrepreneur: Utilisateur diff --git a/documentation/openapi/src/models.yaml b/documentation/openapi/src/models.yaml index b54b58c..68d1fc7 100644 --- a/documentation/openapi/src/models.yaml +++ b/documentation/openapi/src/models.yaml @@ -50,6 +50,7 @@ sectionCell: type: string modificationDate: type: string + example: "02-05-2025" project: type: object @@ -60,6 +61,7 @@ project: type: string creationDate: type: string + example: "02-05-2025" logo: example: to be discussed not yet fixed type: string @@ -78,8 +80,10 @@ appointement: properties: appointmentDate: type: string + example: "02-05-2025" appointmentTime: type: string + example: "10:15:30" appointmentDuration: type: string appointmentPlace: From 81ce4fdb4cbdd27f985810400b4f01ca1049a02e Mon Sep 17 00:00:00 2001 From: Maillal Date: Sun, 30 Mar 2025 19:35:14 +0200 Subject: [PATCH 11/11] fix: commented docker back lines in order to push after trying to fix the error in tests --- config/backdev.docker-compose.yaml | 2 +- config/frontdev.docker-compose.yaml | 14 +++++++------- config/prod.docker-compose.yaml | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/config/backdev.docker-compose.yaml b/config/backdev.docker-compose.yaml index 25151a0..739bb71 100644 --- a/config/backdev.docker-compose.yaml +++ b/config/backdev.docker-compose.yaml @@ -48,4 +48,4 @@ services: # container_name: MyINPulse-back # ports: # - "8081:8080" - \ No newline at end of file + # \ No newline at end of file diff --git a/config/frontdev.docker-compose.yaml b/config/frontdev.docker-compose.yaml index 529ac2c..35563c2 100644 --- a/config/frontdev.docker-compose.yaml +++ b/config/frontdev.docker-compose.yaml @@ -42,11 +42,11 @@ services: # ports: # - "8080:80" - back: - build: - context: ./MyINPulse-back/ - dockerfile: Dockerfile - container_name: MyINPulse-back - ports: - - "8081:8080" + #back: + # build: + # context: ./MyINPulse-back/ + # dockerfile: Dockerfile + # container_name: MyINPulse-back + # ports: + # - "8081:8080" \ No newline at end of file diff --git a/config/prod.docker-compose.yaml b/config/prod.docker-compose.yaml index 496efb3..fe2ceba 100644 --- a/config/prod.docker-compose.yaml +++ b/config/prod.docker-compose.yaml @@ -45,11 +45,11 @@ services: ports: - "8080:80" - back: - build: - context: ./MyINPulse-back/ - dockerfile: Dockerfile - container_name: MyINPulse-back - #ports: - # - "8081:8080" + #back: + # build: + # context: ./MyINPulse-back/ + # dockerfile: Dockerfile + # container_name: MyINPulse-back + # #ports: + # # - "8081:8080" \ No newline at end of file