1537 lines
38 KiB
YAML
1537 lines
38 KiB
YAML
openapi: 3.1.0
|
|
info:
|
|
title: PolyMPR API
|
|
version: 2.0.0
|
|
description: API de gestion des étudiants, notes, mobilités, stages et administration.
|
|
|
|
servers:
|
|
- url: /
|
|
|
|
tags:
|
|
- name: Students
|
|
- name: Promotions
|
|
- name: Users
|
|
- name: Roles
|
|
- name: Permissions
|
|
- name: Modules
|
|
- name: Enseignements
|
|
- name: UEs
|
|
- name: UE_Modules
|
|
- name: Notes
|
|
- name: Ajustements
|
|
- name: Mobilités
|
|
- name: Stages
|
|
|
|
paths:
|
|
# ── Students ──────────────────────────────────────────────
|
|
/students/api/students:
|
|
get:
|
|
tags: [Students]
|
|
summary: Liste des étudiants
|
|
parameters:
|
|
- $ref: "#/components/parameters/idPromoQuery"
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Student"
|
|
post:
|
|
tags: [Students]
|
|
summary: Créer un étudiant
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/StudentCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Student"
|
|
|
|
/students/api/students/import-csv:
|
|
post:
|
|
tags: [Students]
|
|
summary: Importer des étudiants par CSV
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required: [file, idPromo]
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
idPromo:
|
|
type: string
|
|
responses:
|
|
"200":
|
|
description: Résultat de l'import
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
imported:
|
|
type: integer
|
|
errors:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
line:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
|
|
/students/api/students/{numEtud}:
|
|
parameters:
|
|
- $ref: "#/components/parameters/numEtud"
|
|
get:
|
|
tags: [Students]
|
|
summary: Détail d'un étudiant
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Student"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Students]
|
|
summary: Modifier un étudiant
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/StudentCreate"
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Student"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Students]
|
|
summary: Supprimer un étudiant (cascade mobilités et stages)
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Promotions ────────────────────────────────────────────
|
|
/students/api/promotions:
|
|
get:
|
|
tags: [Promotions]
|
|
summary: Liste des promotions
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Promotion"
|
|
post:
|
|
tags: [Promotions]
|
|
summary: Créer une promotion
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/PromotionCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Promotion"
|
|
|
|
/students/api/promotions/{idPromo}:
|
|
parameters:
|
|
- $ref: "#/components/parameters/idPromo"
|
|
get:
|
|
tags: [Promotions]
|
|
summary: Détail d'une promotion
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Promotion"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Promotions]
|
|
summary: Modifier une promotion
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/PromotionCreate"
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Promotion"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Promotions]
|
|
summary: Supprimer une promotion
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Users ────────────────────────────────────────────────
|
|
/admin/api/users:
|
|
get:
|
|
tags: [Users]
|
|
summary: Liste des utilisateurs
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/User"
|
|
post:
|
|
tags: [Users]
|
|
summary: Créer un utilisateur (employee only)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UserCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/User"
|
|
"403":
|
|
description: Accès refusé
|
|
|
|
/admin/api/users/{id}:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
get:
|
|
tags: [Users]
|
|
summary: Détail d'un utilisateur
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/User"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Users]
|
|
summary: Modifier un utilisateur
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UserCreate"
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/User"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Users]
|
|
summary: Supprimer un utilisateur
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Roles ────────────────────────────────────────────────
|
|
/admin/api/roles:
|
|
get:
|
|
tags: [Roles]
|
|
summary: Liste des rôles
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Role"
|
|
post:
|
|
tags: [Roles]
|
|
summary: Créer un rôle
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/RoleCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Role"
|
|
|
|
/admin/api/roles/{idRole}:
|
|
parameters:
|
|
- name: idRole
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
get:
|
|
tags: [Roles]
|
|
summary: Détail d'un rôle
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Role"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Roles]
|
|
summary: Modifier un rôle
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/RoleCreate"
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Role"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Roles]
|
|
summary: Supprimer un rôle
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Permissions ──────────────────────────────────────────
|
|
/admin/api/permissions:
|
|
get:
|
|
tags: [Permissions]
|
|
summary: Liste des permissions
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Permission"
|
|
|
|
# ── Modules ───────────────────────────────────────────────
|
|
/admin/api/modules:
|
|
get:
|
|
tags: [Modules]
|
|
summary: Liste des modules
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Module"
|
|
post:
|
|
tags: [Modules]
|
|
summary: Créer un module (employee only)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/ModuleCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Module"
|
|
"409":
|
|
description: Un module avec cet identifiant existe déjà
|
|
|
|
/admin/api/modules/{idModule}:
|
|
parameters:
|
|
- $ref: "#/components/parameters/idModule"
|
|
get:
|
|
tags: [Modules]
|
|
summary: Détail d'un module
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Module"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Modules]
|
|
summary: Modifier un module
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [nom]
|
|
properties:
|
|
nom:
|
|
type: string
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Module"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Modules]
|
|
summary: Supprimer un module (cascade notes, ue_modules, enseignements)
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Enseignements ───────────────────────────────────────
|
|
/admin/api/enseignements:
|
|
get:
|
|
tags: [Enseignements]
|
|
summary: Liste des enseignements
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Enseignement"
|
|
post:
|
|
tags: [Enseignements]
|
|
summary: Créer un enseignement
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/EnseignementCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Enseignement"
|
|
"409":
|
|
description: Cet enseignement existe déjà
|
|
|
|
/admin/api/enseignements/{idProf}/{idModule}/{idPromo}:
|
|
parameters:
|
|
- name: idProf
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: idModule
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: idPromo
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
get:
|
|
tags: [Enseignements]
|
|
summary: Détail d'un enseignement
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Enseignement"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Enseignements]
|
|
summary: Supprimer un enseignement
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── UEs ───────────────────────────────────────────────────
|
|
/admin/api/ues:
|
|
get:
|
|
tags: [UEs]
|
|
summary: Liste des UEs
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/UE"
|
|
post:
|
|
tags: [UEs]
|
|
summary: Créer une UE
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UECreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UE"
|
|
|
|
/admin/api/ues/{idUE}:
|
|
parameters:
|
|
- $ref: "#/components/parameters/idUE"
|
|
get:
|
|
tags: [UEs]
|
|
summary: Détail d'une UE
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UE"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [UEs]
|
|
summary: Modifier une UE
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UECreate"
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UE"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [UEs]
|
|
summary: Supprimer une UE
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── UE_Modules ────────────────────────────────────────────
|
|
/admin/api/ue-modules:
|
|
get:
|
|
tags: [UE_Modules]
|
|
summary: Liste des associations UE-Module
|
|
parameters:
|
|
- $ref: "#/components/parameters/idPromoQuery"
|
|
- name: idUE
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/UEModule"
|
|
post:
|
|
tags: [UE_Modules]
|
|
summary: Associer un module à une UE
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UEModuleCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UEModule"
|
|
|
|
/admin/api/ue-modules/{idModule}/{idUE}/{idPromo}:
|
|
parameters:
|
|
- name: idModule
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: idUE
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: idPromo
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
get:
|
|
tags: [UE_Modules]
|
|
summary: Détail d'une association UE-Module
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UEModule"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [UE_Modules]
|
|
summary: Modifier le coefficient
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [coeff]
|
|
properties:
|
|
coeff:
|
|
type: number
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/UEModule"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [UE_Modules]
|
|
summary: Supprimer l'association
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Notes ─────────────────────────────────────────────────
|
|
/notes/api/notes:
|
|
get:
|
|
tags: [Notes]
|
|
summary: Liste des notes
|
|
parameters:
|
|
- name: numEtud
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: idModule
|
|
in: query
|
|
schema:
|
|
type: string
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Note"
|
|
post:
|
|
tags: [Notes]
|
|
summary: Créer une note
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/NoteCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Note"
|
|
"409":
|
|
description: Note déjà existante pour cet étudiant/module
|
|
|
|
/notes/api/notes/import-xlsx:
|
|
post:
|
|
tags: [Notes]
|
|
summary: Importer des notes par fichier XLSX
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required: [file, idModule]
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
idModule:
|
|
type: string
|
|
responses:
|
|
"200":
|
|
description: Import réussi
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
imported:
|
|
type: integer
|
|
errors:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
line:
|
|
type: integer
|
|
student:
|
|
type: string
|
|
message:
|
|
type: string
|
|
"400":
|
|
description: Fichier invalide ou données corrompues
|
|
|
|
/notes/api/notes/{numEtud}/{idModule}:
|
|
parameters:
|
|
- name: numEtud
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: idModule
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
get:
|
|
tags: [Notes]
|
|
summary: Détail d'une note
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Note"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Notes]
|
|
summary: Modifier une note
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [note]
|
|
properties:
|
|
note:
|
|
type: number
|
|
minimum: 0
|
|
maximum: 20
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Note"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Notes]
|
|
summary: Supprimer une note
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Ajustements ───────────────────────────────────────────
|
|
/notes/api/ajustements:
|
|
get:
|
|
tags: [Ajustements]
|
|
summary: Liste des ajustements
|
|
parameters:
|
|
- name: numEtud
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: idUE
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Ajustement"
|
|
post:
|
|
tags: [Ajustements]
|
|
summary: Créer un ajustement
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/AjustementCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Ajustement"
|
|
|
|
/notes/api/ajustements/{numEtud}/{idUE}:
|
|
parameters:
|
|
- name: numEtud
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: idUE
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
get:
|
|
tags: [Ajustements]
|
|
summary: Détail d'un ajustement
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Ajustement"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Ajustements]
|
|
summary: Modifier un ajustement
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [valeur]
|
|
properties:
|
|
valeur:
|
|
type: number
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Ajustement"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Ajustements]
|
|
summary: Supprimer un ajustement
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Mobilités ─────────────────────────────────────────────
|
|
/mobility/api/mobilites:
|
|
get:
|
|
tags: [Mobilités]
|
|
summary: Liste des mobilités
|
|
parameters:
|
|
- name: numEtud
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Mobilite"
|
|
post:
|
|
tags: [Mobilités]
|
|
summary: Créer une mobilité
|
|
description: >
|
|
Les étudiants ne peuvent pas définir idStage ni changer le status
|
|
(reste contracts_received). Les mobilités liées à un stage sont
|
|
automatiquement validées.
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/MobiliteCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Mobilite"
|
|
"400":
|
|
description: Champs requis manquants ou invalides
|
|
|
|
/mobility/api/mobilites/{idMob}:
|
|
parameters:
|
|
- name: idMob
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
get:
|
|
tags: [Mobilités]
|
|
summary: Détail d'une mobilité
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Mobilite"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Mobilités]
|
|
summary: Modifier une mobilité (employee only)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
duree:
|
|
type: integer
|
|
minimum: 1
|
|
ecole:
|
|
type: string
|
|
nullable: true
|
|
pays:
|
|
type: string
|
|
nullable: true
|
|
status:
|
|
$ref: "#/components/schemas/MobilityStatus"
|
|
idStage:
|
|
type: integer
|
|
nullable: true
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Mobilite"
|
|
"403":
|
|
description: Accès refusé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Mobilités]
|
|
summary: Supprimer une mobilité (employee only, supprime aussi le contrat)
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"403":
|
|
description: Accès refusé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
/mobility/api/mobilites/{idMob}/contrat:
|
|
parameters:
|
|
- name: idMob
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
get:
|
|
tags: [Mobilités]
|
|
summary: Télécharger le contrat PDF
|
|
responses:
|
|
"200":
|
|
description: Fichier PDF
|
|
content:
|
|
application/pdf:
|
|
schema:
|
|
type: string
|
|
format: binary
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
post:
|
|
tags: [Mobilités]
|
|
summary: Uploader un contrat PDF
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required: [contrat]
|
|
properties:
|
|
contrat:
|
|
type: string
|
|
format: binary
|
|
description: Fichier PDF du contrat
|
|
responses:
|
|
"200":
|
|
description: Mobilité mise à jour avec le nom du fichier
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Mobilite"
|
|
"400":
|
|
description: Fichier manquant ou pas un PDF
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Mobilités]
|
|
summary: Supprimer le contrat (employee only)
|
|
responses:
|
|
"204":
|
|
description: Contrat supprimé
|
|
"403":
|
|
description: Accès refusé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Stages ────────────────────────────────────────────────
|
|
/stages/api/stages:
|
|
get:
|
|
tags: [Stages]
|
|
summary: Liste des stages
|
|
parameters:
|
|
- name: numEtud
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/Stage"
|
|
post:
|
|
tags: [Stages]
|
|
summary: Créer un stage (employee only)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/StageCreate"
|
|
responses:
|
|
"201":
|
|
description: Créé
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Stage"
|
|
"400":
|
|
description: Champs requis manquants
|
|
"403":
|
|
description: Accès refusé
|
|
|
|
/stages/api/stages/{idStage}:
|
|
parameters:
|
|
- name: idStage
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
get:
|
|
tags: [Stages]
|
|
summary: Détail d'un stage
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Stage"
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
put:
|
|
tags: [Stages]
|
|
summary: Modifier un stage (employee only, synchronise la durée sur la mobilité liée)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
duree:
|
|
type: integer
|
|
minimum: 1
|
|
nomEntreprise:
|
|
type: string
|
|
mission:
|
|
type: string
|
|
nullable: true
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "#/components/schemas/Stage"
|
|
"403":
|
|
description: Accès refusé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
delete:
|
|
tags: [Stages]
|
|
summary: Supprimer un stage (employee only, cascade mobilités liées)
|
|
responses:
|
|
"204":
|
|
description: Supprimé
|
|
"403":
|
|
description: Accès refusé
|
|
"404":
|
|
$ref: "#/components/responses/NotFound"
|
|
|
|
# ── Components ────────────────────────────────────────────────
|
|
components:
|
|
parameters:
|
|
numEtud:
|
|
name: numEtud
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
example: 21212006
|
|
idPromo:
|
|
name: idPromo
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
example: 4AFISE25/26
|
|
idPromoQuery:
|
|
name: idPromo
|
|
in: query
|
|
schema:
|
|
type: string
|
|
example: 4AFISE25/26
|
|
idModule:
|
|
name: idModule
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
idUE:
|
|
name: idUE
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
|
|
responses:
|
|
NotFound:
|
|
description: Ressource introuvable
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
error:
|
|
type: string
|
|
|
|
schemas:
|
|
# ── Student ──
|
|
Student:
|
|
type: object
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
nom:
|
|
type: string
|
|
prenom:
|
|
type: string
|
|
idPromo:
|
|
type: string
|
|
StudentCreate:
|
|
type: object
|
|
required: [numEtud, nom, prenom, idPromo]
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
nom:
|
|
type: string
|
|
prenom:
|
|
type: string
|
|
idPromo:
|
|
type: string
|
|
|
|
# ── Promotion ──
|
|
Promotion:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
annee:
|
|
type: string
|
|
PromotionCreate:
|
|
type: object
|
|
required: [id, annee]
|
|
properties:
|
|
id:
|
|
type: string
|
|
annee:
|
|
type: string
|
|
|
|
# ── User ──
|
|
User:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
nom:
|
|
type: string
|
|
prenom:
|
|
type: string
|
|
idRole:
|
|
type: integer
|
|
nullable: true
|
|
UserCreate:
|
|
type: object
|
|
required: [id, nom, prenom]
|
|
properties:
|
|
id:
|
|
type: string
|
|
nom:
|
|
type: string
|
|
prenom:
|
|
type: string
|
|
idRole:
|
|
type: integer
|
|
|
|
# ── Role ──
|
|
Role:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
nom:
|
|
type: string
|
|
RoleCreate:
|
|
type: object
|
|
required: [nom]
|
|
properties:
|
|
nom:
|
|
type: string
|
|
|
|
# ── Permission ──
|
|
Permission:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
nom:
|
|
type: string
|
|
|
|
# ── Module ──
|
|
Module:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
nom:
|
|
type: string
|
|
ModuleCreate:
|
|
type: object
|
|
required: [id, nom]
|
|
properties:
|
|
id:
|
|
type: string
|
|
nom:
|
|
type: string
|
|
|
|
# ── Enseignement ──
|
|
Enseignement:
|
|
type: object
|
|
properties:
|
|
idProf:
|
|
type: string
|
|
idModule:
|
|
type: string
|
|
idPromo:
|
|
type: string
|
|
EnseignementCreate:
|
|
type: object
|
|
required: [idProf, idModule, idPromo]
|
|
properties:
|
|
idProf:
|
|
type: string
|
|
idModule:
|
|
type: string
|
|
idPromo:
|
|
type: string
|
|
|
|
# ── UE ──
|
|
UE:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
nom:
|
|
type: string
|
|
UECreate:
|
|
type: object
|
|
required: [nom]
|
|
properties:
|
|
nom:
|
|
type: string
|
|
|
|
# ── UE_Module ──
|
|
UEModule:
|
|
type: object
|
|
properties:
|
|
idModule:
|
|
type: string
|
|
idUE:
|
|
type: integer
|
|
idPromo:
|
|
type: string
|
|
coeff:
|
|
type: number
|
|
UEModuleCreate:
|
|
type: object
|
|
required: [idModule, idUE, idPromo, coeff]
|
|
properties:
|
|
idModule:
|
|
type: string
|
|
idUE:
|
|
type: integer
|
|
idPromo:
|
|
type: string
|
|
coeff:
|
|
type: number
|
|
|
|
# ── Note ──
|
|
Note:
|
|
type: object
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
idModule:
|
|
type: string
|
|
note:
|
|
type: number
|
|
minimum: 0
|
|
maximum: 20
|
|
NoteCreate:
|
|
type: object
|
|
required: [numEtud, idModule, note]
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
idModule:
|
|
type: string
|
|
note:
|
|
type: number
|
|
minimum: 0
|
|
maximum: 20
|
|
|
|
# ── Ajustement ──
|
|
Ajustement:
|
|
type: object
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
idUE:
|
|
type: integer
|
|
valeur:
|
|
type: number
|
|
AjustementCreate:
|
|
type: object
|
|
required: [numEtud, idUE, valeur]
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
idUE:
|
|
type: integer
|
|
valeur:
|
|
type: number
|
|
|
|
# ── Mobilité ──
|
|
MobilityStatus:
|
|
type: string
|
|
enum: [contracts_received, under_revision, done, validated, canceled]
|
|
Mobilite:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
numEtud:
|
|
type: integer
|
|
duree:
|
|
type: integer
|
|
contratMob:
|
|
type: string
|
|
nullable: true
|
|
ecole:
|
|
type: string
|
|
nullable: true
|
|
pays:
|
|
type: string
|
|
nullable: true
|
|
status:
|
|
$ref: "#/components/schemas/MobilityStatus"
|
|
idStage:
|
|
type: integer
|
|
nullable: true
|
|
MobiliteCreate:
|
|
type: object
|
|
required: [numEtud, duree]
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
duree:
|
|
type: integer
|
|
minimum: 1
|
|
ecole:
|
|
type: string
|
|
pays:
|
|
type: string
|
|
status:
|
|
$ref: "#/components/schemas/MobilityStatus"
|
|
idStage:
|
|
type: integer
|
|
|
|
# ── Stage ──
|
|
Stage:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
numEtud:
|
|
type: integer
|
|
duree:
|
|
type: integer
|
|
nomEntreprise:
|
|
type: string
|
|
mission:
|
|
type: string
|
|
nullable: true
|
|
StageCreate:
|
|
type: object
|
|
required: [numEtud, duree, nomEntreprise]
|
|
properties:
|
|
numEtud:
|
|
type: integer
|
|
duree:
|
|
type: integer
|
|
minimum: 1
|
|
nomEntreprise:
|
|
type: string
|
|
mission:
|
|
type: string
|